no message

This commit is contained in:
Yoshax
2016-08-07 01:39:55 +01:00
712 changed files with 22104 additions and 10512 deletions
+12
View File
@@ -155,12 +155,24 @@
var/mob/living/carbon/human/H = AM
H.in_stasis = 1
src.used = 1
if(istype(AM, /obj/item/organ))
var/obj/item/organ/O = AM
O.preserved = 1
for(var/obj/item/organ/organ in O)
organ.preserved = 1
..()
/obj/structure/closet/body_bag/cryobag/Exited(atom/movable/AM)
if(ishuman(AM))
var/mob/living/carbon/human/H = AM
H.in_stasis = 0
if(istype(AM, /obj/item/organ))
var/obj/item/organ/O = AM
O.preserved = 0
for(var/obj/item/organ/organ in O)
organ.preserved = 0
..()
/obj/structure/closet/body_bag/cryobag/return_air() //Used to make stasis bags protect from vacuum.
@@ -18,6 +18,8 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10)
var/video_range = 4
var/obj/machinery/camera/communicator/video_source // Their camera
var/obj/machinery/camera/communicator/camera // Our camera
var/list/voice_mobs = list()
var/list/voice_requests = list()
@@ -63,6 +65,9 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
all_communicators = sortAtom(all_communicators)
node = get_exonet_node()
processing_objects |= src
camera = new(src)
camera.name = "[src] #[rand(100,999)]"
camera.c_tag = camera.name
//This is a pretty terrible way of doing this.
spawn(5 SECONDS) //Wait for our mob to finish spawning.
if(ismob(loc))
@@ -74,6 +79,14 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
register_device(S.loc)
initialize_exonet(S.loc)
// Proc: examine()
// Parameters: user - the user doing the examining
// Description: Allows the user to click a link when examining to look at video if one is going.
/obj/item/device/communicator/examine(mob/user)
. = ..(user, 1)
if(. && video_source)
user << "<span class='notice'>It looks like it's on a video call: <a href='?src=\ref[src];watchvideo=1'>\[view\]</a></span>"
// Proc: initialize_exonet()
// Parameters: 1 (user - the person the communicator belongs to)
// Description: Sets up the exonet datum, gives the device an address, and then gets a node reference. Afterwards, populates the device
@@ -209,6 +222,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
/mob/observer/dead
var/datum/exonet_protocol/exonet = null
var/list/exonet_messages = list()
// Proc: New()
// Parameters: None
@@ -257,27 +271,27 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
//Now for ghosts who we pretend have communicators.
for(var/mob/observer/dead/O in known_devices)
if(O.client && O.client.prefs.communicator_visibility == 1 && O.exonet)
communicators[++communicators.len] = list("name" = sanitize("[O.client.prefs.real_name]'s communicator"), "address" = O.exonet.address)
communicators[++communicators.len] = list("name" = sanitize("[O.client.prefs.real_name]'s communicator"), "address" = O.exonet.address, "ref" = "\ref[O]")
//Lists all the other communicators that we invited.
for(var/obj/item/device/communicator/comm in voice_invites)
if(comm.exonet)
invites[++invites.len] = list("name" = sanitize(comm.name), "address" = comm.exonet.address)
invites[++invites.len] = list("name" = sanitize(comm.name), "address" = comm.exonet.address, "ref" = "\ref[comm]")
//Ghosts we invited.
for(var/mob/observer/dead/O in voice_invites)
if(O.exonet && O.client)
invites[++invites.len] = list("name" = sanitize("[O.client.prefs.real_name]'s communicator"), "address" = O.exonet.address)
invites[++invites.len] = list("name" = sanitize("[O.client.prefs.real_name]'s communicator"), "address" = O.exonet.address, "ref" = "\ref[O]")
//Communicators that want to talk to us.
for(var/obj/item/device/communicator/comm in voice_requests)
if(comm.exonet)
requests[++requests.len] = list("name" = sanitize(comm.name), "address" = comm.exonet.address)
requests[++requests.len] = list("name" = sanitize(comm.name), "address" = comm.exonet.address, "ref" = "\ref[comm]")
//Ghosts that want to talk to us.
for(var/mob/observer/dead/O in voice_requests)
if(O.exonet && O.client)
requests[++requests.len] = list("name" = sanitize("[O.client.prefs.real_name]'s communicator"), "address" = O.exonet.address)
requests[++requests.len] = list("name" = sanitize("[O.client.prefs.real_name]'s communicator"), "address" = O.exonet.address, "ref" = "\ref[O]")
//Now for all the voice mobs inside the communicator.
for(var/mob/living/voice/voice in contents)
@@ -285,12 +299,16 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
//Finally, all the communicators linked to this one.
for(var/obj/item/device/communicator/comm in communicating)
connected_communicators[++connected_communicators.len] = list("name" = sanitize(comm.name), "true_name" = sanitize(comm.name))
connected_communicators[++connected_communicators.len] = list("name" = sanitize(comm.name), "true_name" = sanitize(comm.name), "ref" = "\ref[comm]")
//Devices that have been messaged or recieved messages from.
for(var/obj/item/device/communicator/comm in im_contacts)
if(comm.exonet)
im_contacts_ui[++im_contacts_ui.len] = list("name" = sanitize(comm.name), "address" = comm.exonet.address)
im_contacts_ui[++im_contacts_ui.len] = list("name" = sanitize(comm.name), "address" = comm.exonet.address, "ref" = "\ref[comm]")
for(var/mob/observer/dead/ghost in im_contacts)
if(ghost.exonet)
im_contacts_ui[++im_contacts_ui.len] = list("name" = sanitize(ghost.name), "address" = ghost.exonet.address, "ref" = "\ref[ghost]")
//Actual messages.
for(var/I in im_list)
@@ -313,6 +331,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
data["requestsReceived"] = requests
data["voice_mobs"] = voices
data["communicating"] = connected_communicators
data["video_comm"] = video_source ? "\ref[video_source.loc]" : null
data["imContacts"] = im_contacts_ui
data["imList"] = im_list_ui
data["time"] = worldtime2text()
@@ -325,7 +344,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "communicator.tmpl", "Communicator", 450, 700)
ui = new(user, src, ui_key, "communicator.tmpl", "Communicator", 475, 700)
// when the ui is first opened this is the data it will use
ui.set_initial_data(data)
// open the new ui window
@@ -344,9 +363,20 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
if(new_name)
owner = new_name
name = "[owner]'s [initial(name)]"
if(camera)
camera.name = name
camera.c_tag = name
if(href_list["toggle_visibility"])
network_visibility = !network_visibility
switch(network_visibility)
if(1) //Visible, becoming invisbile
network_visibility = 0
if(camera)
camera.remove_network(NETWORK_COMMUNICATORS)
if(0) //Invisible, becoming visible
network_visibility = 1
if(camera)
camera.add_network(NETWORK_COMMUNICATORS)
if(href_list["toggle_ringer"])
ringer = !ringer
@@ -371,6 +401,12 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
var/their_address = href_list["dial"]
exonet.send_message(their_address, "voice")
if(href_list["decline"])
var/ref_to_remove = href_list["decline"]
var/atom/decline = locate(ref_to_remove)
if(decline)
del_request(decline)
if(href_list["message"])
if(!get_connection_to_tcomms())
usr << "<span class='danger'>Error: Cannot connect to Exonet node.</span>"
@@ -380,15 +416,30 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
if(text)
exonet.send_message(their_address, "text", text)
im_list += list(list("address" = exonet.address, "to_address" = their_address, "im" = text))
log_pda("[usr] (COMM: [src]) sent \"[text]\" to [exonet.get_atom_from_address(their_address)]")
if(href_list["disconnect"])
var/name_to_disconnect = href_list["disconnect"]
for(var/mob/living/voice/V in contents)
if(name_to_disconnect == V.name)
close_connection(usr, V, "[usr] hung up.")
close_connection(usr, V, "[usr] hung up")
for(var/obj/item/device/communicator/comm in communicating)
if(name_to_disconnect == comm.name)
close_connection(usr, comm, "[usr] hung up.")
close_connection(usr, comm, "[usr] hung up")
if(href_list["startvideo"])
var/ref_to_video = href_list["startvideo"]
var/obj/item/device/communicator/comm = locate(ref_to_video)
if(comm)
connect_video(usr, comm)
if(href_list["endvideo"])
if(video_source)
end_video()
if(href_list["watchvideo"])
if(video_source)
watch_video(usr,video_source.loc)
if(href_list["copy"])
target_address = href_list["copy"]
@@ -398,9 +449,9 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
if(href_list["hang_up"])
for(var/mob/living/voice/V in contents)
close_connection(usr, V, "[usr] hung up.")
close_connection(usr, V, "[usr] hung up")
for(var/obj/item/device/communicator/comm in communicating)
close_connection(usr, comm, "[usr] hung up.")
close_connection(usr, comm, "[usr] hung up")
if(href_list["switch_tab"])
selected_tab = href_list["switch_tab"]
@@ -448,7 +499,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
// Proc: receive_exonet_message()
// Parameters: 3 (origin atom - the source of the message's holder, origin_address - where the message came from, message - the message received)
// Description: Handles voice requests and invite messages originating from both real communicators and ghosts. Also includes a ping response.
/mob/observer/dead/receive_exonet_message(origin_atom, origin_address, message)
/mob/observer/dead/receive_exonet_message(origin_atom, origin_address, message, text)
if(message == "voice")
if(istype(origin_atom, /obj/item/device/communicator))
var/obj/item/device/communicator/comm = origin_atom
@@ -463,7 +514,9 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
var/random = rand(450,700)
random = random / 10
exonet.send_message(origin_address, "64 bytes received from [exonet.address] ecmp_seq=1 ttl=51 time=[random] ms")
if(message == "text") //Ghosts don't get texting yet. Mostly for spam prevention by ghosts but also due to ui requirements not sorted out yet.
if(message == "text")
src << "<span class='notice'>\icon[origin_atom] Received text message from [origin_atom]: <b>\"[text]\"</b></span>"
exonet_messages.Add("<b>From [origin_atom]:</b><br>[text]")
return
// Proc: register_device()
@@ -475,7 +528,9 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
owner = user.name
name = "[owner]'s [initial(name)]"
if(camera)
camera.name = name
camera.c_tag = name
// Proc: add_communicating()
// Parameters: 1 (comm - the communicator to add to communicating)
@@ -485,7 +540,8 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
communicating |= comm
listening_objects |= src
update_icon()
// Proc: del_communicating()
// Parameters: 1 (comm - the communicator to remove from communicating)
// Description: Used when this communicator is being asked to stop relaying say/me messages to another
@@ -493,6 +549,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
if(!comm || !istype(comm)) return
communicating.Remove(comm)
update_icon()
// Proc: open_connection()
// Parameters: 2 (user - the person who initiated the connecting being opened, candidate - the communicator or observer that will connect to the device)
@@ -601,15 +658,19 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
visible_message("<span class='danger'>\icon[src] [reason].</span>")
voice_mobs.Remove(voice)
qdel(voice)
update_icon()
for(var/obj/item/device/communicator/comm in communicating) //Now we handle real communicators.
if(target && comm != target)
continue
comm.visible_message("<span class='danger'>\icon[src] [reason].</span>")
visible_message("<span class='danger'>\icon[src] [reason].</span>")
src.del_communicating(comm)
comm.del_communicating(src)
update_icon()
comm.visible_message("<span class='danger'>\icon[src] [reason].</span>")
visible_message("<span class='danger'>\icon[src] [reason].</span>")
if(comm.camera && video_source == comm.camera) //We hung up on the person on video
end_video()
if(camera && comm.video_source == camera) //We hung up on them while they were watching us
comm.end_video()
if(voice_mobs.len == 0 && communicating.len == 0)
listening_objects.Remove(src)
@@ -649,6 +710,29 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
if(L)
L << "<span class='notice'>\icon[src] Communications request from [who].</span>"
// Proc: del_request()
// Parameters: 1 (candidate - the ghost or communicator to be declined)
// Description: Declines a request and cleans up both ends
/obj/item/device/communicator/proc/del_request(var/atom/candidate)
if(!(candidate in voice_requests))
return
if(isobserver(candidate))
candidate << "<span class='warning'>Your communicator call request was declined.</span>"
else if(istype(candidate, /obj/item/device/communicator))
var/obj/item/device/communicator/comm = candidate
comm.voice_invites -= src
voice_requests -= candidate
//Search for holder of our device.
var/mob/living/us = null
if(loc && isliving(loc))
us = loc
if(us)
us << "<span class='notice'>\icon[src] Declined request.</span>"
// Proc: request_im()
// Parameters: 3 (candidate - the communicator wanting to message the device, origin_address - the address of the sender, text - the message)
// Description: Response to a communicator trying to message the device.
@@ -656,7 +740,9 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
/obj/item/device/communicator/proc/request_im(var/atom/candidate, var/origin_address, var/text)
var/who = null
if(isobserver(candidate))
return
var/mob/observer/dead/ghost = candidate
who = ghost
im_list += list(list("address" = origin_address, "to_address" = exonet.address, "im" = text))
else if(istype(candidate, /obj/item/device/communicator))
var/obj/item/device/communicator/comm = candidate
who = comm.owner
@@ -700,6 +786,8 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
all_communicators -= src
processing_objects -= src
listening_objects.Remove(src)
qdel(camera)
camera = null
if(exonet)
exonet.remove_address()
exonet = null
@@ -709,7 +797,11 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
// Parameters: None
// Description: Self explanatory
/obj/item/device/communicator/update_icon()
if(voice_mobs.len > 0)
if(video_source)
icon_state = "communicator-video"
return
if(voice_mobs.len || communicating.len)
icon_state = "communicator-active"
return
@@ -729,7 +821,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
if(!T) return
var/list/in_range = get_mobs_and_objs_in_view_fast(T,world.view,0) //Range of 3 since it's a tiny video display
var/list/mobs_to_relay = in_range["mobs"]
for(var/mob/mob in mobs_to_relay) //We can't use visible_message(), or else we will get an infinite loop if two communicators hear each other.
var/dst = get_dist(get_turf(mob),get_turf(comm))
if(dst <= video_range)
@@ -745,7 +837,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
// Description: Relays the speech to all linked communicators.
/obj/item/device/communicator/hear_talk(mob/living/M, text, verb, datum/language/speaking)
for(var/obj/item/device/communicator/comm in communicating)
var/turf/T = get_turf(comm)
if(!T) return
var/list/in_range = get_mobs_and_objs_in_view_fast(T,world.view,0)
@@ -833,7 +925,136 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
src << "A communications request has been sent to [chosen_communicator]. Now you need to wait until someone answers."
/obj/item/device/communicator/integrated //For synths who have no hands.
// Verb: text_communicator()
// Parameters: None
// Description: Allows a ghost to send a text message to a communicator.
/mob/observer/dead/verb/text_communicator()
set category = "Ghost"
set name = "Text Communicator"
set desc = "If there is a communicator available, send a text message to it."
if(ticker.current_state < GAME_STATE_PLAYING)
src << "<span class='danger'>The game hasn't started yet!</span>"
return
if (!src.stat)
return
if (usr != src)
return //something is terribly wrong
for(var/mob/living/L in mob_list) //Simple check so you don't have dead people calling.
if(src.client.prefs.real_name == L.real_name)
src << "<span class='danger'>Your identity is already present in the game world. Please load in a different character first.</span>"
return
var/obj/machinery/exonet_node/E = get_exonet_node()
if(!E || !E.on || !E.allow_external_communicators)
src << "<span class='danger'>The Exonet node at telecommunications is down at the moment, or is actively blocking you, so your call can't go through.</span>"
return
var/list/choices = list()
for(var/obj/item/device/communicator/comm in all_communicators)
if(!comm.network_visibility || !comm.exonet || !comm.exonet.address)
continue
choices.Add(comm)
if(!choices.len)
src << "<span class='danger'>There are no available communicators, sorry.</span>"
return
var/choice = input(src,"Send a text message to whom?") as null|anything in choices
if(choice)
var/obj/item/device/communicator/chosen_communicator = choice
var/mob/observer/dead/O = src
var/text_message = sanitize(input(src, "What do you want the message to say?")) as message
if(text_message && O.exonet)
O.exonet.send_message(chosen_communicator.exonet.address, "text", text_message)
src << "<span class='notice'>You have sent '[text_message]' to [chosen_communicator].</span>."
exonet_messages.Add("<b>To [chosen_communicator]:</b><br>[text_message]")
log_pda("[usr] (COMM: [src]) sent \"[text_message]\" to [chosen_communicator]")
// Verb: show_text_messages()
// Parameters: None
// Description: Lets ghosts review messages they've sent or received.
/mob/observer/dead/verb/show_text_messages()
set category = "Ghost"
set name = "Show Text Messages"
set desc = "Allows you to see exonet text messages you've sent and received."
var/HTML = "<html><head><title>Exonet Message Log</title></head><body>"
for(var/line in exonet_messages)
HTML += line + "<br>"
HTML +="</body></html>"
usr << browse(HTML, "window=log;size=400x444;border=1;can_resize=1;can_close=1;can_minimize=0")
// Proc: connect_video()
// Parameters: user - the mob doing the viewing of video, comm - the communicator at the far end
// Description: Sets up a videocall and puts the first view into it using watch_video, and updates the icon
/obj/item/device/communicator/proc/connect_video(mob/user,obj/item/device/communicator/comm)
if((!user) || (!comm) || user.stat) return //KO or dead, or already in a video
if(video_source) //Already in a video
user << "<span class='danger'>You are already connected to a video call!</span>"
if(user.blinded) //User is blinded
user << "<span class='danger'>You cannot see well enough to do that!</span>"
if(!(src in comm.communicating) || !comm.camera) //You called someone with a broken communicator or one that's fake or yourself or something
user << "<span class='danger'>\icon[src]ERROR: Video failed. Either bandwidth is too low, or the other communicator is malfunctioning.</span>"
user << "<span class='notice'>\icon[src] Attempting to start video over existing call.</span>"
sleep(30)
user << "<span class='notice'>\icon[src] Please wait...</span>"
video_source = comm.camera
comm.visible_message("<span class='danger'>\icon[src] New video connection from [comm].</span>")
watch_video(user)
update_icon()
// Proc: watch_video()
// Parameters: user - the mob doing the viewing of video
// Description: Moves a mob's eye to the far end for the duration of viewing the far end
/obj/item/device/communicator/proc/watch_video(mob/user)
if(!Adjacent(user) || !video_source) return
user.set_machine(video_source)
user.reset_view(video_source)
user << "<span class='notice'>Now viewing video session. To leave camera view: OOC -> Cancel Camera View</span>"
spawn(0)
while(user.machine == video_source && Adjacent(user))
var/turf/T = get_turf(video_source)
if(!T || !is_on_same_plane_or_station(T.z, user.z) || !video_source.can_use())
user << "<span class='warning'>The screen bursts into static, then goes black.</span>"
video_cleanup(user)
return
sleep(10)
video_cleanup(user)
// Proc: video_cleanup()
// Parameters: user - the mob who doesn't want to see video anymore
// Description: Cleans up mob's client when they stop watching a video
/obj/item/device/communicator/proc/video_cleanup(mob/user)
if(!user) return
user.reset_view(null)
user.unset_machine()
// Proc: end_video()
// Parameters: reason - the text reason to print for why it ended
// Description: Ends the video call by clearing video_source
/obj/item/device/communicator/proc/end_video(var/reason)
video_source = null
. = "<span class='danger'>\icon[src] [reason ? reason : "Video session ended"].</span>"
visible_message(.)
update_icon()
//For synths who have no hands.
/obj/item/device/communicator/integrated
name = "integrated communicator"
desc = "A circuit used for long-range communications, able to be integrated into a system."
@@ -864,3 +1085,12 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
return
src.attack_self(usr)
// A camera preset for spawning in the communicator
/obj/machinery/camera/communicator
network = list(NETWORK_COMMUNICATORS)
/obj/machinery/camera/communicator/New()
..()
client_huds |= global_hud.whitense
client_huds |= global_hud.darkMask
+10 -6
View File
@@ -74,13 +74,17 @@
if(M.stat!=DEAD)
var/safety = M:eyecheck()
if(safety <= 0)
var/flash_strength = 10
var/flash_strength = 5
if(ishuman(M))
var/mob/living/carbon/human/H = M
flash_strength *= H.species.flash_mod
if(flash_strength > 0)
M.Weaken(flash_strength)
flick("e_flash", M.flash)
if(flash_strength > 0)
H.confused = max(H.confused, flash_strength)
H.eye_blind = max(H.eye_blind, flash_strength)
H.eye_blurry = max(H.eye_blurry, flash_strength + 5)
H.flash_eyes()
else
flashfail = 1
@@ -158,7 +162,7 @@
var/safety = M:eyecheck()
if(!safety)
if(!M.blinded)
flick("flash", M.flash)
M.flash_eyes()
return
@@ -177,7 +181,7 @@
var/safety = M.eyecheck()
if(safety <= 0)
M.Weaken(10)
flick("e_flash", M.flash)
M.flash_eyes()
for(var/mob/O in viewers(M, null))
O.show_message("<span class='disarm'>[M] is blinded by the flash!</span>")
..()
@@ -3,7 +3,6 @@
desc = "A hand-held emergency light."
icon = 'icons/obj/lighting.dmi'
icon_state = "flashlight"
item_state = "flashlight"
w_class = 2
flags = CONDUCT
slot_flags = SLOT_BELT
@@ -79,9 +78,9 @@
user << "<span class='notice'>\The [M]'s pupils narrow slightly, but are still very dilated.</span>"
else
user << "<span class='notice'>\The [M]'s pupils narrow.</span>"
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) //can be used offensively
flick("flash", M.flash)
M.flash_eyes()
else
return ..()
@@ -89,7 +88,7 @@
name = "penlight"
desc = "A pen-sized light, used by medical staff."
icon_state = "penlight"
item_state = ""
item_state = "pen"
flags = CONDUCT
slot_flags = SLOT_EARS
brightness_on = 2
@@ -99,7 +98,6 @@
name = "maglight"
desc = "A very, very heavy duty flashlight."
icon_state = "maglight"
item_state = "maglight"
force = 10
flags = CONDUCT
brightness_on = 4
@@ -113,7 +111,7 @@
name = "low-power flashlight"
desc = "A miniature lamp, that might be used by small robots."
icon_state = "penlight"
item_state = ""
item_state = null
flags = CONDUCT
brightness_on = 2
w_class = 1
@@ -124,7 +122,6 @@
name = "desk lamp"
desc = "A desk lamp with an adjustable mount."
icon_state = "lamp"
item_state = "lamp"
brightness_on = 5
w_class = 4
flags = CONDUCT
@@ -136,7 +133,6 @@
/obj/item/device/flashlight/lamp/green
desc = "A classic green-shaded desk lamp."
icon_state = "lampgreen"
item_state = "lampgreen"
brightness_on = 5
light_color = "#FFC58F"
@@ -2,7 +2,6 @@
name = "floor painter"
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "labeler1"
item_state = "flight"
var/decal = "remove all decals"
var/paint_dir = "precise"
@@ -2,7 +2,6 @@
name = "closet painter"
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "labeler1"
item_state = "flight"
var/colour = "plain"
var/colour_secure = "plain"
@@ -2,7 +2,6 @@
name = "pipe painter"
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "labeler1"
item_state = "flight"
var/list/modes
var/mode
@@ -2,6 +2,10 @@
name = "electropack"
desc = "Dance my monkeys! DANCE!!!"
icon_state = "electropack0"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_storage.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_storage.dmi',
)
item_state = "electropack"
frequency = 1449
flags = CONDUCT
@@ -4,7 +4,6 @@
desc = "An encryption key for a radio headset. Contains cypherkeys."
icon = 'icons/obj/radio.dmi'
icon_state = "cypherkey"
item_state = ""
w_class = 1
slot_flags = SLOT_EARS
var/translate_binary = 0
@@ -3,7 +3,6 @@
desc = "An updated, modular intercom that fits over the head. Takes encryption keys"
var/radio_desc = ""
icon_state = "headset"
item_state = "headset"
matter = list(DEFAULT_WALL_MATERIAL = 75)
subspace_transmission = 1
canhear_range = 0 // can't hear headsets from very far away
@@ -71,7 +70,7 @@
/obj/item/device/radio/headset/syndicate/alt
icon_state = "syndie_headset"
item_state = "syndie_headset"
item_state = "headset"
origin_tech = list(TECH_ILLEGAL = 3)
syndie = 1
ks1type = /obj/item/device/encryptionkey/syndicate
@@ -91,7 +90,7 @@
name = "security bowman headset"
desc = "This is used by your elite security force."
icon_state = "sec_headset_alt"
item_state = "sec_headset_alt"
item_state = "headset"
ks2type = /obj/item/device/encryptionkey/headset_sec
/obj/item/device/radio/headset/headset_eng
@@ -105,7 +104,7 @@
name = "engineering bowman headset"
desc = "When the engineers wish to chat like girls."
icon_state = "eng_headset_alt"
item_state = "eng_headset_alt"
item_state = "headset"
ks2type = /obj/item/device/encryptionkey/headset_eng
/obj/item/device/radio/headset/headset_rob
@@ -126,7 +125,7 @@
name = "medical bowman headset"
desc = "A headset for the trained staff of the medbay."
icon_state = "med_headset_alt"
item_state = "med_headset_alt"
item_state = "headset"
ks2type = /obj/item/device/encryptionkey/headset_med
/obj/item/device/radio/headset/headset_sci
@@ -154,7 +153,7 @@
name = "command bowman headset"
desc = "A headset with a commanding channel."
icon_state = "com_headset_alt"
item_state = "com_headset_alt"
item_state = "headset"
ks2type = /obj/item/device/encryptionkey/headset_com
@@ -169,7 +168,7 @@
name = "captain's bowman headset"
desc = "The headset of the boss."
icon_state = "com_headset_alt"
item_state = "com_headset_alt"
item_state = "headset"
ks2type = /obj/item/device/encryptionkey/heads/captain
/obj/item/device/radio/headset/heads/ai_integrated //No need to care about icons, it should be hidden inside the AI anyway.
@@ -198,7 +197,7 @@
name = "research director's bowman headset"
desc = "Headset of the researching God."
icon_state = "com_headset_alt"
item_state = "com_headset_alt"
item_state = "headset"
ks2type = /obj/item/device/encryptionkey/heads/rd
/obj/item/device/radio/headset/heads/hos
@@ -212,7 +211,7 @@
name = "head of security's bowman headset"
desc = "The headset of the man who protects your worthless lifes."
icon_state = "com_headset_alt"
item_state = "com_headset_alt"
item_state = "headset"
ks2type = /obj/item/device/encryptionkey/heads/hos
/obj/item/device/radio/headset/heads/ce
@@ -226,7 +225,7 @@
name = "chief engineer's bowman headset"
desc = "The headset of the guy who is in charge of morons"
icon_state = "com_headset_alt"
item_state = "com_headset_alt"
item_state = "headset"
ks2type = /obj/item/device/encryptionkey/heads/ce
/obj/item/device/radio/headset/heads/cmo
@@ -240,7 +239,7 @@
name = "chief medical officer's bowman headset"
desc = "The headset of the highly trained medical chief."
icon_state = "com_headset_alt"
item_state = "com_headset_alt"
item_state = "headset"
ks2type = /obj/item/device/encryptionkey/heads/cmo
/obj/item/device/radio/headset/heads/hop
@@ -254,7 +253,7 @@
name = "head of personnel's bowman headset"
desc = "The headset of the guy who will one day be captain."
icon_state = "com_headset_alt"
item_state = "com_headset_alt"
item_state = "headset"
ks2type = /obj/item/device/encryptionkey/heads/hop
/*
/obj/item/device/radio/headset/headset_mine
@@ -275,7 +274,7 @@
name = "supply bowman headset"
desc = "A bowman headset used by the QM and his slaves."
icon_state = "cargo_headset_alt"
item_state = "cargo_headset_alt"
item_state = "headset"
ks2type = /obj/item/device/encryptionkey/headset_cargo
/obj/item/device/radio/headset/headset_service
@@ -297,7 +296,7 @@
name = "emergency response team bowman headset"
desc = "The headset of the boss's boss."
icon_state = "com_headset_alt"
item_state = "com_headset_alt"
item_state = "headset"
// freerange = 1
ks2type = /obj/item/device/encryptionkey/ert
@@ -25,7 +25,7 @@ var/global/list/default_medbay_channels = list(
name = "station bounced radio"
suffix = "\[3\]"
icon_state = "walkietalkie"
item_state = "walkietalkie"
item_state = "radio"
var/on = 1 // 0 for off
var/last_transmission
+11 -4
View File
@@ -13,7 +13,7 @@ REAGENT SCANNER
name = "health analyzer"
desc = "A hand-held body scanner able to distinguish vital signs of the subject."
icon_state = "health"
item_state = "analyzer"
item_state = "healthanalyzer"
flags = CONDUCT
slot_flags = SLOT_BELT
throwforce = 3
@@ -24,8 +24,16 @@ REAGENT SCANNER
origin_tech = list(TECH_MAGNET = 1, TECH_BIO = 1)
var/mode = 1;
/obj/item/device/healthanalyzer/do_surgery(mob/living/M, mob/living/user)
if(user.a_intent != I_HELP) //in case it is ever used as a surgery tool
return ..()
scan_mob(M, user) //default surgery behaviour is just to scan as usual
return 1
/obj/item/device/healthanalyzer/attack(mob/living/M as mob, mob/living/user as mob)
/obj/item/device/healthanalyzer/attack(mob/living/M, mob/living/user)
scan_mob(M, user)
/obj/item/device/healthanalyzer/proc/scan_mob(mob/living/M, mob/living/user)
if ((CLUMSY in user.mutations) && prob(50))
user << text("<span class='warning'>You try to analyze the floor's vitals!</span>")
for(var/mob/O in viewers(M, null))
@@ -168,8 +176,7 @@ REAGENT SCANNER
else
user.show_message("<span class='notice'>Blood Level Normal: [blood_percent]% [blood_volume]cl. Type: [blood_type]</span>")
user.show_message("<span class='notice'>Subject's pulse: <font color='[H.pulse == PULSE_THREADY || H.pulse == PULSE_NONE ? "red" : "blue"]'>[H.get_pulse(GETPULSE_TOOL)] bpm.</font></span>")
src.add_fingerprint(user)
return
/obj/item/device/healthanalyzer/verb/toggle_mode()
set name = "Switch Verbosity"
@@ -4,7 +4,7 @@
w_class = 4
icon = 'icons/obj/device.dmi'
icon_state = "suitcooler0"
slot_flags = SLOT_BACK //you can carry it on your back if you want, but it won't do anything unless attached to suit storage
slot_flags = SLOT_BACK
//copied from tank.dm
flags = CONDUCT
@@ -20,7 +20,7 @@
var/on = 0 //is it turned on?
var/cover_open = 0 //is the cover open?
var/obj/item/weapon/cell/cell
var/max_cooling = 12 // in degrees per second - probably don't need to mess with heat capacity here
var/max_cooling = 15 // in degrees per second - probably don't need to mess with heat capacity here
var/charge_consumption = 3 // charge per second at max_cooling
var/thermostat = T20C
@@ -87,7 +87,7 @@
var/mob/living/carbon/human/H = M
if (!H.wear_suit || H.s_store != src)
if (!H.wear_suit || (H.s_store != src && H.back != src))
return 0
return 1
@@ -1,21 +0,0 @@
/*
Telecrystal item
Does nothing if not suitable antag type, checks for accept_tcrystals = 1 in a mob's mind.
For new antags, make sure to add "player.mind.accept_tcrystals = 1" if you want tradable tcrystals.
*/
/obj/item/device/telecrystal
name = "red crystal"
desc = "A strange, red, glowing crystal."
icon = 'icons/obj/stock_parts.dmi'
icon_state = "telecrystal"
item_state = "telecrystal"
force = 5
origin_tech = list(TECH_MATERIAL = 2, TECH_BLUESPACE = 1, TECH_ILLEGAL = 1)
/obj/item/device/telecrystal/attack_self(mob/user as mob)
if(user.mind.accept_tcrystals) //Checks to see if antag type allows for tcrystals
user.mind.tcrystals += 1
user.drop_from_inventory(src)
qdel(src)
return
+9 -2
View File
@@ -6,11 +6,12 @@
var/list/nanoui_items // List of items for NanoUI use
var/nanoui_menu = 0 // The current menu we are in
var/list/nanoui_data = new // Additional data for NanoUI use
var/faction = "" //Antag faction holder.
var/list/purchase_log = new
var/datum/mind/uplink_owner = null
var/used_TC = 0
var/offer_time = 15 MINUTES //The time increment per discount offered
var/offer_time = 10 MINUTES //The time increment per discount offered
var/next_offer_time //The time a discount will next be offered
var/datum/uplink_item/discount_item //The item to be discounted
var/discount_amount //The amount as a percent the item will be discounted by
@@ -96,6 +97,9 @@
var/title = "Remote Uplink"
var/data[0]
uses = user.mind.tcrystals
if(ishuman(user))
var/mob/living/carbon/human/H = user
faction = H.antag_faction
data["welcome"] = welcome
data["crystals"] = uses
@@ -188,7 +192,10 @@
nanoui_data["exploit"]["faction"] = html_encode(L.fields["faction"])
nanoui_data["exploit"]["religion"] = html_encode(L.fields["religion"])
nanoui_data["exploit"]["fingerprint"] = html_encode(L.fields["fingerprint"])
if(L.fields["antagvis"] == ANTAG_KNOWN || (faction == L.fields["antagfac"] && (L.fields["antagvis"] == ANTAG_SHARED)))
nanoui_data["exploit"]["antagfaction"] = html_encode(L.fields["antagfac"])
else
nanoui_data["exploit"]["antagfaction"] = html_encode("None")
nanoui_data["exploit_exists"] = 1
break
@@ -1,4 +1,5 @@
var/datum/uplink_random_selection/default_uplink_selection = new/datum/uplink_random_selection/default()
var/datum/uplink_random_selection/all_uplink_selection = new/datum/uplink_random_selection/all()
/datum/uplink_random_item
var/uplink_item // The uplink item
@@ -14,16 +15,22 @@ var/datum/uplink_random_selection/default_uplink_selection = new/datum/uplink_ra
/datum/uplink_random_selection
var/list/datum/uplink_random_item/items
var/list/datum/uplink_random_item/all_items
/datum/uplink_random_selection/New()
..()
items = list()
all_items = list()
/datum/uplink_random_selection/proc/get_random_item(var/telecrystals, obj/item/device/uplink/U, var/list/bought_items)
/datum/uplink_random_selection/proc/get_random_item(var/telecrystals, obj/item/device/uplink/U, var/list/bought_items, var/items_override = 0)
var/const/attempts = 50
for(var/i = 0; i < attempts; i++)
var/datum/uplink_random_item/RI = pick(items)
var/datum/uplink_random_item/RI
if(items_override)
RI = pick(all_items)
else
RI = pick(items)
if(!prob(RI.keep_probability))
continue
var/datum/uplink_item/I = uplink.items_assoc[RI.uplink_item]
@@ -35,6 +42,14 @@ var/datum/uplink_random_selection/default_uplink_selection = new/datum/uplink_ra
continue
return I
/datum/uplink_random_selection/all/New()
..()
for(var/datum/uplink_item/item in uplink.items)
if(item.blacklisted)
continue
else
all_items += new/datum/uplink_random_item(item.type)
/datum/uplink_random_selection/default/New()
..()
@@ -86,7 +101,7 @@ var/datum/uplink_random_selection/default_uplink_selection = new/datum/uplink_ra
items += new/datum/uplink_random_item(/datum/uplink_item/item/hardsuit_modules/thermal, reselect_propbability = 15)
items += new/datum/uplink_random_item(/datum/uplink_item/item/hardsuit_modules/energy_net, reselect_propbability = 15)
items += new/datum/uplink_random_item(/datum/uplink_item/item/ewar_voice, reselect_propbability = 15)
items += new/datum/uplink_random_item(/datum/uplink_item/item/hardsuit_modules/ewar_voice, reselect_propbability = 15)
items += new/datum/uplink_random_item(/datum/uplink_item/item/hardsuit_modules/maneuvering_jets, reselect_propbability = 15)
items += new/datum/uplink_random_item(/datum/uplink_item/item/hardsuit_modules/egun, reselect_propbability = 15)
items += new/datum/uplink_random_item(/datum/uplink_item/item/hardsuit_modules/power_sink, reselect_propbability = 15)
@@ -5,7 +5,6 @@
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 = 'icons/obj/musician.dmi'
icon_state = "violin"
item_state = "violin"
force = 10
var/datum/song/song
var/playing = 0
+4
View File
@@ -2,6 +2,10 @@
name = "latex glove"
desc = "A latex glove, usually used as a balloon."
icon_state = "latexballon"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi',
)
item_state = "lgloves"
force = 0
throwforce = 0
@@ -104,7 +104,7 @@
/obj/item/borg/upgrade/tasercooler/action(var/mob/living/silicon/robot/R)
if(..()) return 0
if(!R.module || !(src in R.module.supported_upgrades))
if(!R.module || !(type in R.module.supported_upgrades))
R << "Upgrade mounting error! No suitable hardpoint detected!"
usr << "There's no mounting point for the module!"
return 0
@@ -137,7 +137,7 @@
/obj/item/borg/upgrade/jetpack/action(var/mob/living/silicon/robot/R)
if(..()) return 0
if(!R.module || !(src in R.module.supported_upgrades))
if(!R.module || !(type in R.module.supported_upgrades))
R << "Upgrade mounting error! No suitable hardpoint detected!"
usr << "There's no mounting point for the module!"
return 0
+111 -124
View File
@@ -73,50 +73,47 @@
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open == 0)
if(affecting.is_bandaged())
user << "<span class='warning'>The wounds on [M]'s [affecting.name] have already been bandaged.</span>"
return 1
else
user.visible_message("<span class='notice'>\The [user] starts treating [M]'s [affecting.name].</span>", \
"<span class='notice'>You start treating [M]'s [affecting.name].</span>" )
var/used = 0
for (var/datum/wound/W in affecting.wounds)
if (W.internal)
continue
if(W.bandaged)
continue
if(used == amount)
break
if(!do_mob(user, M, W.damage/5))
user << "<span class='notice'>You must stand still to bandage wounds.</span>"
break
if(affecting.open)
user << "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>"
return
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message("<span class='notice'>\The [user] bandages \a [W.desc] on [M]'s [affecting.name].</span>", \
"<span class='notice'>You bandage \a [W.desc] on [M]'s [affecting.name].</span>" )
//H.add_side_effect("Itch")
else if (W.damage_type == BRUISE)
user.visible_message("<span class='notice'>\The [user] places a bruise patch over \a [W.desc] on [M]'s [affecting.name].</span>", \
"<span class='notice'>You place a bruise patch over \a [W.desc] on [M]'s [affecting.name].</span>" )
else
user.visible_message("<span class='notice'>\The [user] places a bandaid over \a [W.desc] on [M]'s [affecting.name].</span>", \
"<span class='notice'>You place a bandaid over \a [W.desc] on [M]'s [affecting.name].</span>" )
W.bandage()
used++
affecting.update_damages()
if(used == amount)
if(affecting.is_bandaged())
user << "<span class='warning'>\The [src] is used up.</span>"
else
user << "<span class='warning'>\The [src] is used up, but there are more wounds to treat on \the [affecting.name].</span>"
use(used)
if(affecting.is_bandaged())
user << "<span class='warning'>The wounds on [M]'s [affecting.name] have already been bandaged.</span>"
return 1
else
if (can_operate(H)) //Checks if mob is lying down on table for surgery
if (do_surgery(H,user,src))
return
else
user << "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>"
user.visible_message("<span class='notice'>\The [user] starts treating [M]'s [affecting.name].</span>", \
"<span class='notice'>You start treating [M]'s [affecting.name].</span>" )
var/used = 0
for (var/datum/wound/W in affecting.wounds)
if (W.internal)
continue
if(W.bandaged)
continue
if(used == amount)
break
if(!do_mob(user, M, W.damage/5))
user << "<span class='notice'>You must stand still to bandage wounds.</span>"
break
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message("<span class='notice'>\The [user] bandages \a [W.desc] on [M]'s [affecting.name].</span>", \
"<span class='notice'>You bandage \a [W.desc] on [M]'s [affecting.name].</span>" )
//H.add_side_effect("Itch")
else if (W.damage_type == BRUISE)
user.visible_message("<span class='notice'>\The [user] places a bruise patch over \a [W.desc] on [M]'s [affecting.name].</span>", \
"<span class='notice'>You place a bruise patch over \a [W.desc] on [M]'s [affecting.name].</span>" )
else
user.visible_message("<span class='notice'>\The [user] places a bandaid over \a [W.desc] on [M]'s [affecting.name].</span>", \
"<span class='notice'>You place a bandaid over \a [W.desc] on [M]'s [affecting.name].</span>" )
W.bandage()
used++
affecting.update_damages()
if(used == amount)
if(affecting.is_bandaged())
user << "<span class='warning'>\The [src] is used up.</span>"
else
user << "<span class='warning'>\The [src] is used up, but there are more wounds to treat on \the [affecting.name].</span>"
use(used)
/obj/item/stack/medical/ointment
name = "ointment"
@@ -135,26 +132,23 @@
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open == 0)
if(affecting.is_salved())
user << "<span class='warning'>The wounds on [M]'s [affecting.name] have already been salved.</span>"
return 1
else
user.visible_message("<span class='notice'>\The [user] starts salving wounds on [M]'s [affecting.name].</span>", \
"<span class='notice'>You start salving the wounds on [M]'s [affecting.name].</span>" )
if(!do_mob(user, M, 10))
user << "<span class='notice'>You must stand still to salve wounds.</span>"
return 1
user.visible_message("<span class='notice'>[user] salved wounds on [M]'s [affecting.name].</span>", \
"<span class='notice'>You salved wounds on [M]'s [affecting.name].</span>" )
use(1)
affecting.salve()
if(affecting.open)
user << "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>"
return
if(affecting.is_salved())
user << "<span class='warning'>The wounds on [M]'s [affecting.name] have already been salved.</span>"
return 1
else
if (can_operate(H)) //Checks if mob is lying down on table for surgery
if (do_surgery(H,user,src))
return
else
user << "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>"
user.visible_message("<span class='notice'>\The [user] starts salving wounds on [M]'s [affecting.name].</span>", \
"<span class='notice'>You start salving the wounds on [M]'s [affecting.name].</span>" )
if(!do_mob(user, M, 10))
user << "<span class='notice'>You must stand still to salve wounds.</span>"
return 1
user.visible_message("<span class='notice'>[user] salved wounds on [M]'s [affecting.name].</span>", \
"<span class='notice'>You salved wounds on [M]'s [affecting.name].</span>" )
use(1)
affecting.salve()
/obj/item/stack/medical/advanced/bruise_pack
name = "advanced trauma kit"
@@ -172,50 +166,47 @@
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open == 0)
if(affecting.is_bandaged() && affecting.is_disinfected())
user << "<span class='warning'>The wounds on [M]'s [affecting.name] have already been treated.</span>"
return 1
else
user.visible_message("<span class='notice'>\The [user] starts treating [M]'s [affecting.name].</span>", \
"<span class='notice'>You start treating [M]'s [affecting.name].</span>" )
var/used = 0
for (var/datum/wound/W in affecting.wounds)
if (W.internal)
continue
if (W.bandaged && W.disinfected)
continue
if(used == amount)
break
if(!do_mob(user, M, W.damage/5))
user << "<span class='notice'>You must stand still to bandage wounds.</span>"
break
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message("<span class='notice'>\The [user] cleans \a [W.desc] on [M]'s [affecting.name] and seals the edges with bioglue.</span>", \
"<span class='notice'>You clean and seal \a [W.desc] on [M]'s [affecting.name].</span>" )
else if (W.damage_type == BRUISE)
user.visible_message("<span class='notice'>\The [user] places a medical patch over \a [W.desc] on [M]'s [affecting.name].</span>", \
"<span class='notice'>You place a medical patch over \a [W.desc] on [M]'s [affecting.name].</span>" )
else
user.visible_message("<span class='notice'>\The [user] smears some bioglue over \a [W.desc] on [M]'s [affecting.name].</span>", \
"<span class='notice'>You smear some bioglue over \a [W.desc] on [M]'s [affecting.name].</span>" )
W.bandage()
W.disinfect()
W.heal_damage(heal_brute)
used++
affecting.update_damages()
if(used == amount)
if(affecting.is_bandaged())
user << "<span class='warning'>\The [src] is used up.</span>"
else
user << "<span class='warning'>\The [src] is used up, but there are more wounds to treat on \the [affecting.name].</span>"
use(used)
if(affecting.open)
user << "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>"
return
if(affecting.is_bandaged() && affecting.is_disinfected())
user << "<span class='warning'>The wounds on [M]'s [affecting.name] have already been treated.</span>"
return 1
else
if (can_operate(H)) //Checks if mob is lying down on table for surgery
if (do_surgery(H,user,src))
return
else
user << "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>"
user.visible_message("<span class='notice'>\The [user] starts treating [M]'s [affecting.name].</span>", \
"<span class='notice'>You start treating [M]'s [affecting.name].</span>" )
var/used = 0
for (var/datum/wound/W in affecting.wounds)
if (W.internal)
continue
if (W.bandaged && W.disinfected)
continue
if(used == amount)
break
if(!do_mob(user, M, W.damage/5))
user << "<span class='notice'>You must stand still to bandage wounds.</span>"
break
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message("<span class='notice'>\The [user] cleans \a [W.desc] on [M]'s [affecting.name] and seals the edges with bioglue.</span>", \
"<span class='notice'>You clean and seal \a [W.desc] on [M]'s [affecting.name].</span>" )
else if (W.damage_type == BRUISE)
user.visible_message("<span class='notice'>\The [user] places a medical patch over \a [W.desc] on [M]'s [affecting.name].</span>", \
"<span class='notice'>You place a medical patch over \a [W.desc] on [M]'s [affecting.name].</span>" )
else
user.visible_message("<span class='notice'>\The [user] smears some bioglue over \a [W.desc] on [M]'s [affecting.name].</span>", \
"<span class='notice'>You smear some bioglue over \a [W.desc] on [M]'s [affecting.name].</span>" )
W.bandage()
W.disinfect()
W.heal_damage(heal_brute)
used++
affecting.update_damages()
if(used == amount)
if(affecting.is_bandaged())
user << "<span class='warning'>\The [src] is used up.</span>"
else
user << "<span class='warning'>\The [src] is used up, but there are more wounds to treat on \the [affecting.name].</span>"
use(used)
/obj/item/stack/medical/advanced/ointment
name = "advanced burn kit"
@@ -234,27 +225,23 @@
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open == 0)
if(affecting.is_salved())
user << "<span class='warning'>The wounds on [M]'s [affecting.name] have already been salved.</span>"
return 1
else
user.visible_message("<span class='notice'>\The [user] starts salving wounds on [M]'s [affecting.name].</span>", \
"<span class='notice'>You start salving the wounds on [M]'s [affecting.name].</span>" )
if(!do_mob(user, M, 10))
user << "<span class='notice'>You must stand still to salve wounds.</span>"
return 1
user.visible_message( "<span class='notice'>[user] covers wounds on [M]'s [affecting.name] with regenerative membrane.</span>", \
"<span class='notice'>You cover wounds on [M]'s [affecting.name] with regenerative membrane.</span>" )
affecting.heal_damage(0,heal_burn)
use(1)
affecting.salve()
if(affecting.open)
user << "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>"
if(affecting.is_salved())
user << "<span class='warning'>The wounds on [M]'s [affecting.name] have already been salved.</span>"
return 1
else
if (can_operate(H)) //Checks if mob is lying down on table for surgery
if (do_surgery(H,user,src))
return
else
user << "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>"
user.visible_message("<span class='notice'>\The [user] starts salving wounds on [M]'s [affecting.name].</span>", \
"<span class='notice'>You start salving the wounds on [M]'s [affecting.name].</span>" )
if(!do_mob(user, M, 10))
user << "<span class='notice'>You must stand still to salve wounds.</span>"
return 1
user.visible_message( "<span class='notice'>[user] covers wounds on [M]'s [affecting.name] with regenerative membrane.</span>", \
"<span class='notice'>You cover wounds on [M]'s [affecting.name] with regenerative membrane.</span>" )
affecting.heal_damage(0,heal_burn)
use(1)
affecting.salve()
/obj/item/stack/medical/splint
name = "medical splints"
+12 -10
View File
@@ -18,7 +18,7 @@
R.adjustFireLoss(-15)
R.updatehealth()
use(1)
user.visible_message("<span class='notice'>\The [user] applied some [src] at [R]'s damaged areas.</span>",\
user.visible_message("<span class='notice'>\The [user] applied some [src] on [R]'s damaged areas.</span>",\
"<span class='notice'>You apply some [src] at [R]'s damaged areas.</span>")
else
user << "<span class='notice'>All [R]'s systems are nominal.</span>"
@@ -27,12 +27,14 @@
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/S = H.get_organ(user.zone_sel.selecting)
if (S && (S.robotic >= ORGAN_ROBOT))
if(S.robo_repair(15, "omni", 0, src, user))
use(1)
user.visible_message("<span class='notice'>\The [user] applies some nanite paste on [user != M ? "\the [M]'s" : "their"] [S.name].</span>",\
"<span class='notice'>You apply some nanite paste on [user == M ? "your" : "[M]'s"] [S.name].</span>")
else
if (can_operate(H))
if (do_surgery(H,user,src))
return
if(S.open >= 2)
if (S && (S.robotic >= ORGAN_ROBOT))
if(!S.get_damage())
user << "<span class='notice'>Nothing to fix here.</span>"
else if(can_use(1))
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
S.heal_damage(15, 15, robo_repair = 1)
H.updatehealth()
use(1)
user.visible_message("<span class='notice'>\The [user] applies some nanite paste on [user != M ? "[M]'s [S.name]" : "[S]"] with [src].</span>",\
"<span class='notice'>You apply some nanite paste on [user == M ? "your" : "[M]'s"] [S.name].</span>")
+3
View File
@@ -13,6 +13,9 @@
max_amount = 60
attack_verb = list("hit", "bludgeoned", "whacked")
/obj/item/stack/rods/fifty //Calling this path still fifty because sixty is confusing
amount = 60
/obj/item/stack/rods/cyborg
name = "metal rod synthesizer"
desc = "A device that makes metal rods."
@@ -4,36 +4,54 @@
singular_name = "human skin piece"
icon_state = "sheet-hide"
/obj/item/stack/material/animalhide/human
amount = 50
/obj/item/stack/material/animalhide/corgi
name = "corgi hide"
desc = "The by-product of corgi farming."
singular_name = "corgi hide piece"
icon_state = "sheet-corgi"
/obj/item/stack/material/animalhide/corgi
amount = 50
/obj/item/stack/material/animalhide/cat
name = "cat hide"
desc = "The by-product of cat farming."
singular_name = "cat hide piece"
icon_state = "sheet-cat"
/obj/item/stack/material/animalhide/cat
amount = 50
/obj/item/stack/material/animalhide/monkey
name = "monkey hide"
desc = "The by-product of monkey farming."
singular_name = "monkey hide piece"
icon_state = "sheet-monkey"
/obj/item/stack/material/animalhide/monkey
amount = 50
/obj/item/stack/material/animalhide/lizard
name = "lizard skin"
desc = "Sssssss..."
singular_name = "lizard skin piece"
icon_state = "sheet-lizard"
/obj/item/stack/material/animalhide/lizard
amount = 50
/obj/item/stack/material/animalhide/xeno
name = "alien hide"
desc = "The skin of a terrible creature."
singular_name = "alien hide piece"
icon_state = "sheet-xeno"
/obj/item/stack/material/animalhide/xeno
amount = 50
//don't see anywhere else to put these, maybe together they could be used to make the xenos suit?
/obj/item/stack/material/xenochitin
name = "alien chitin"
@@ -42,6 +60,9 @@
icon = 'icons/mob/alien.dmi'
icon_state = "chitin"
/obj/item/stack/material/xenochitin
amount = 50
/obj/item/xenos_claw
name = "alien claw"
desc = "The claw of a terrible creature."
@@ -60,6 +81,9 @@
singular_name = "hairless hide piece"
icon_state = "sheet-hairlesshide"
/obj/item/stack/material/hairlesshide
amount = 50
/obj/item/stack/material/wetleather
name = "wet leather"
desc = "This leather has been cleaned but still needs to be dried."
@@ -68,6 +92,9 @@
var/wetness = 30 //Reduced when exposed to high temperautres
var/drying_threshold_temperature = 500 //Kelvin to start drying
/obj/item/stack/material/wetleather
amount = 50
//Step one - dehairing.
/obj/item/stack/material/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob)
if( istype(W, /obj/item/weapon/material/knife) || \
+11 -12
View File
@@ -298,14 +298,16 @@
/obj/item/stack/attack_hand(mob/user as mob)
if (user.get_inactive_hand() == src)
var/obj/item/stack/F = src.split(1)
if (F)
user.put_in_hands(F)
src.add_fingerprint(user)
F.add_fingerprint(user)
spawn(0)
if (src && usr.machine==src)
src.interact(usr)
var/N = input("How many stacks of [src] would you like to split off?", "Split stacks", 1) as num|null
if(N)
var/obj/item/stack/F = src.split(N)
if (F)
user.put_in_hands(F)
src.add_fingerprint(user)
F.add_fingerprint(user)
spawn(0)
if (src && usr.machine==src)
src.interact(usr)
else
..()
return
@@ -313,10 +315,7 @@
/obj/item/stack/attackby(obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/stack))
var/obj/item/stack/S = W
if (user.get_inactive_hand()==src)
src.transfer_to(S, 1)
else
src.transfer_to(S)
src.transfer_to(S)
spawn(0) //give the stacks a chance to delete themselves if necessary
if (S && usr.machine==S)
@@ -0,0 +1,26 @@
/obj/item/stack/telecrystal
name = "telecrystal"
desc = "It seems to be pulsing with suspiciously enticing energies."
description_antag = "Telecrystals can be activated by utilizing them on devices with an actively running uplink. They will not activate on unactivated uplinks."
singular_name = "telecrystal"
icon = 'icons/obj/stock_parts.dmi'
icon_state = "telecrystal"
w_class = 1
max_amount = 240
origin_tech = list(TECH_MATERIAL = 6, TECH_BLUESPACE = 4)
force = 1 //Needs a token force to ensure you can attack because for some reason you can't attack with 0 force things
/obj/item/stack/telecrystal/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
if(amount >= 5)
target.visible_message("<span class='warning'>\The [target] has been transported with \the [src] by \the [user].</span>")
safe_blink(target, 14)
use(5)
else
user << "<span class='warning'>There are not enough telecrystals to do that.</span>"
/obj/item/stack/telecrystal/attack_self(mob/user as mob)
if(user.mind.accept_tcrystals) //Checks to see if antag type allows for tcrystals
user << "<span class='notice'>You use \the [src], adding [src.amount] to your balance.</span>"
user.mind.tcrystals += amount
use(amount)
return
@@ -35,6 +35,8 @@
flags = 0
origin_tech = list(TECH_BIO = 1)
/obj/item/stack/tile/grass/fifty
amount = 50
/*
* Wood
*/
@@ -49,6 +51,9 @@
throw_range = 20
flags = 0
/obj/item/stack/tile/wood/fifty
amount = 50
/obj/item/stack/tile/wood/cyborg
name = "wood floor tile synthesizer"
desc = "A device that makes wood floor tiles."
@@ -71,12 +76,18 @@
throw_range = 20
flags = 0
/obj/item/stack/tile/carpet/fifty
amount = 50
/obj/item/stack/tile/carpet/blue
name = "blue carpet"
singular_name = "blue carpet"
desc = "A piece of blue carpet. It is the same size as a normal floor tile!"
icon_state = "tile-bluecarpet"
/obj/item/stack/tile/carpet/blue/fifty
amount = 50
/obj/item/stack/tile/floor
name = "floor tile"
singular_name = "floor tile"
@@ -89,42 +100,63 @@
throw_range = 20
flags = CONDUCT
/obj/item/stack/tile/floor/fifty
amount = 50
/obj/item/stack/tile/floor_red
name = "red floor tile"
singular_name = "red floor tile"
color = COLOR_RED_GRAY
icon_state = "tile_white"
/obj/item/stack/tile/floor_red/fifty
amount = 50
/obj/item/stack/tile/floor_steel
name = "steel floor tile"
singular_name = "steel floor tile"
icon_state = "tile_steel"
matter = list("plasteel" = SHEET_MATERIAL_AMOUNT / 4)
/obj/item/stack/tile/floor_steel/fifty
amount = 50
/obj/item/stack/tile/floor_white
name = "white floor tile"
singular_name = "white floor tile"
icon_state = "tile_white"
matter = list("plastic" = SHEET_MATERIAL_AMOUNT / 4)
/obj/item/stack/tile/floor_white/fifty
amount = 50
/obj/item/stack/tile/floor_yellow
name = "yellow floor tile"
singular_name = "yellow floor tile"
color = COLOR_BROWN
icon_state = "tile_white"
/obj/item/stack/tile/floor_yellow/fifty
amount = 50
/obj/item/stack/tile/floor_dark
name = "dark floor tile"
singular_name = "dark floor tile"
icon_state = "fr_tile"
matter = list("plasteel" = SHEET_MATERIAL_AMOUNT / 4)
/obj/item/stack/tile/floor_dark/fifty
amount = 50
/obj/item/stack/tile/floor_freezer
name = "freezer floor tile"
singular_name = "freezer floor tile"
icon_state = "tile_freezer"
matter = list("plastic" = SHEET_MATERIAL_AMOUNT / 4)
/obj/item/stack/tile/foor_freezer/fifty
amount = 50
/obj/item/stack/tile/floor/cyborg
name = "floor tile synthesizer"
desc = "A device that makes floor tiles."
@@ -144,4 +176,7 @@
throwforce = 1.0
throw_speed = 5
throw_range = 20
flags = 0
flags = 0
/obj/item/stack/tile/linoleum/fifty
amount = 50
+12 -13
View File
@@ -34,7 +34,6 @@
desc = "A translucent balloon. There's nothing in it."
icon = 'icons/obj/toy.dmi'
icon_state = "waterballoon-e"
item_state = "balloon-empty"
/obj/item/toy/balloon/New()
var/datum/reagents/R = new/datum/reagents(10)
@@ -85,10 +84,8 @@
/obj/item/toy/balloon/update_icon()
if(src.reagents.total_volume >= 1)
icon_state = "waterballoon"
item_state = "balloon"
else
icon_state = "waterballoon-e"
item_state = "balloon-empty"
/obj/item/toy/syndicateballoon
name = "criminal balloon"
@@ -99,7 +96,6 @@
force = 0
icon = 'icons/obj/weapons.dmi'
icon_state = "syndballoon"
item_state = "syndballoon"
w_class = 4.0
/obj/item/toy/nanotrasenballoon
@@ -111,7 +107,6 @@
force = 0
icon = 'icons/obj/weapons.dmi'
icon_state = "ntballoon"
item_state = "ntballoon"
w_class = 4.0
/*
@@ -142,7 +137,6 @@
desc = "A weapon favored by many overactive children. Ages 8 and up."
icon = 'icons/obj/gun.dmi'
icon_state = "crossbow"
item_state = "crossbow"
item_icons = list(
icon_l_hand = 'icons/mob/items/lefthand_guns.dmi',
icon_r_hand = 'icons/mob/items/righthand_guns.dmi',
@@ -251,7 +245,6 @@
anchored = 1
density = 0
/*
* Toy swords
*/
@@ -260,7 +253,10 @@
desc = "A cheap, plastic replica of an energy sword. Realistic sounds! Ages 8 and up."
icon = 'icons/obj/weapons.dmi'
icon_state = "sword0"
item_state = "sword0"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi',
)
var/active = 0.0
w_class = 2.0
attack_verb = list("attacked", "struck", "hit")
@@ -271,13 +267,11 @@
user << "<span class='notice'>You extend the plastic blade with a quick flick of your wrist.</span>"
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
src.icon_state = "swordblue"
src.item_state = "swordblue"
src.w_class = 4
else
user << "<span class='notice'>You push the plastic blade back down into the handle.</span>"
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
src.icon_state = "sword0"
src.item_state = "sword0"
src.w_class = 2
if(istype(user,/mob/living/carbon/human))
@@ -293,7 +287,10 @@
desc = "Woefully underpowered in D20."
icon = 'icons/obj/weapons.dmi'
icon_state = "katana"
item_state = "katana"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_material.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_material.dmi',
)
flags = CONDUCT
slot_flags = SLOT_BELT | SLOT_BACK
force = 5
@@ -863,7 +860,10 @@
desc = "An arcane weapon (made of foam) wielded by the followers of the hit Saturday morning cartoon \"King Nursee and the Acolytes of Heroism\"."
icon = 'icons/obj/weapons.dmi'
icon_state = "cultblade"
item_state = "cultblade"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi',
)
w_class = 4
attack_verb = list("attacked", "slashed", "stabbed", "poked")
@@ -883,7 +883,6 @@
name = "inflatable duck"
desc = "No bother to sink or swim when you can just float!"
icon_state = "inflatable"
item_state = "inflatable"
icon = 'icons/obj/clothing/belts.dmi'
slot_flags = SLOT_BELT
+5 -9
View File
@@ -162,19 +162,16 @@
if(istype(usr,/mob/living/carbon))
usr.put_in_hands(src)
/obj/item/weapon/autopsy_scanner/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob)
/obj/item/weapon/autopsy_scanner/do_surgery(mob/living/carbon/human/M, mob/living/user)
if(!istype(M))
return
if(!can_operate(M))
return
return 0
if(target_name != M.name)
target_name = M.name
src.wdata = list()
src.chemtraces = list()
src.timeofdeath = null
user << "<span class='notice'>A new patient has been registered.. Purging data for previous patient.</span>"
user << "<span class='notice'>A new patient has been registered. Purging data for previous patient.</span>"
src.timeofdeath = M.timeofdeath
@@ -183,10 +180,9 @@
usr << "<span class='warning'>You can't scan this body part.</span>"
return
if(!S.open)
usr << "<span class='warning'>You have to cut the limb open first!</span>"
usr << "<span class='warning'>You have to cut [S] open first!</span>"
return
for(var/mob/O in viewers(M))
O.show_message("<span class='notice'>\The [user] scans the wounds on [M.name]'s [S.name] with \the [src]</span>", 1)
M.visible_message("<span class='notice'>\The [user] scans the wounds on [M]'s [S.name] with [src]</span>")
src.add_data(S)
@@ -3,7 +3,6 @@
desc = "a small pillar candle. Its specially-formulated fuel-oxidizer wax mixture allows continued combustion in airless environments."
icon = 'icons/obj/candle.dmi'
icon_state = "candle1"
item_state = "candle1"
w_class = 1
light_color = "#E09D37"
var/wax = 2000
+18 -5
View File
@@ -15,7 +15,8 @@
name = "card"
desc = "Does card things."
icon = 'icons/obj/card.dmi'
w_class = 1.0
w_class = 1
slot_flags = SLOT_EARS
var/associated_account_number = 0
var/list/files = list( )
@@ -68,7 +69,6 @@
icon_state = "emag"
item_state = "card-id"
origin_tech = list(TECH_MAGNET = 2, TECH_ILLEGAL = 2)
var/default_uses = 10
var/uses = 10
/obj/item/weapon/card/emag/resolve_attackby(atom/A, mob/user)
@@ -88,9 +88,15 @@
qdel(src)
return 1
/obj/item/weapon/card/emag/attackby(obj/item/O as obj, mob/user as mob)
if(istype(O, /obj/item/device/telecrystal))
src.uses += default_uses/2 //Adds half the default amount of uses which is more than you get per TC when buying, as to balance the utility of having multiple emags vs one heavily usable one
if(istype(O, /obj/item/stack/telecrystal))
var/obj/item/stack/telecrystal/T = O
if(T.amount < 1)
usr << "<span class='notice'>You are not adding enough telecrystals to fuel \the [src].</span>"
return
uses += T.amount/2 //Gives 5 uses per 10 TC
uses = ceil(uses) //Ensures no decimal uses nonsense, rounds up to be nice
usr << "<span class='notice'>You add \the [O] to \the [src]. Increasing the uses of \the [src] to [uses].</span>"
qdel(O)
@@ -349,4 +355,11 @@
desc = "A card which represents common sense and responsibility."
icon_state = "civGold"
primary_color = rgb(0,94,142)
secondary_color = rgb(255,223,127)
secondary_color = rgb(255,223,127)
/obj/item/weapon/card/id/external
name = "identification card"
desc = "An identification card of some sort. It does not look like it is issued by NT."
icon_state = "permit"
primary_color = rgb(142,94,0)
secondary_color = rgb(191,159,95)
@@ -481,7 +481,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/weapon/flame/lighter/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(!istype(M, /mob))
return
M.IgniteMob()
if(lit == 1)
M.IgniteMob()
if(istype(M.wear_mask, /obj/item/clothing/mask/smokable/cigarette) && user.zone_sel.selecting == O_MOUTH && lit)
var/obj/item/clothing/mask/smokable/cigarette/cig = M.wear_mask
@@ -1,5 +1,5 @@
#ifndef T_BOARD
#error T_BOARD macro is not defined but we need it!
#error T_BOARD macro is not defined but we need it!
#endif
/obj/item/weapon/circuitboard/supplycomp
@@ -28,7 +28,6 @@
catastasis = "STANDARD"
switch( alert("Current receiver spectrum is set to: [catastasis]","Multitool-Circuitboard interface","Switch to [opposite_catastasis]","Cancel") )
//switch( alert("Current receiver spectrum is set to: " {(src.contraband_enabled) ? ("BROAD") : ("STANDARD")} , "Multitool-Circuitboard interface" , "Switch to " {(src.contraband_enabled) ? ("STANDARD") : ("BROAD")}, "Cancel") )
if("Switch to STANDARD","Switch to BROAD")
src.contraband_enabled = !src.contraband_enabled
@@ -75,7 +75,6 @@
slot_flags = SLOT_EARS
icon = 'icons/obj/items.dmi'
icon_state = "purplecomb"
item_state = "purplecomb"
/obj/item/weapon/haircomb/attack_self(mob/living/user)
user.visible_message(text("<span class='notice'>[] uses [] to comb their hair with incredible style and sophistication. What a [].</span>", user, src, user.gender == FEMALE ? "lady" : "guy"))
+30
View File
@@ -10,12 +10,42 @@
/obj/item/weapon/dice/New()
icon_state = "[name][rand(1,sides)]"
/obj/item/weapon/dice/d4
name = "d4"
desc = "A dice with four sides."
icon_state = "d44"
sides = 4
/obj/item/weapon/dice/d8
name = "d8"
desc = "A dice with eight sides."
icon_state = "d88"
sides = 8
/obj/item/weapon/dice/d10
name = "d10"
desc = "A dice with ten sides."
icon_state = "d1010"
sides = 10
/obj/item/weapon/dice/d12
name = "d12"
desc = "A dice with twelve sides."
icon_state = "d1212"
sides = 12
/obj/item/weapon/dice/d20
name = "d20"
desc = "A dice with twenty sides."
icon_state = "d2020"
sides = 20
/obj/item/weapon/dice/d100
name = "d100"
desc = "A dice with ten sides. This one is for the tens digit."
icon_state = "d10010"
sides = 10
/obj/item/weapon/dice/attack_self(mob/user as mob)
var/result = rand(1, sides)
var/comment = ""
@@ -3,6 +3,10 @@
desc = "You are a firestarter!"
icon = 'icons/obj/flamethrower.dmi'
icon_state = "flamethrowerbase"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_guns.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_guns.dmi',
)
item_state = "flamethrower_0"
flags = CONDUCT
force = 3.0
@@ -3,7 +3,6 @@
name = "photon disruption grenade"
icon = 'icons/obj/grenade.dmi'
icon_state = "emp"
item_state = "emp"
det_time = 20
origin_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 4)
@@ -14,7 +14,6 @@
name = "low yield emp grenade"
desc = "A weaker variant of the EMP grenade"
icon_state = "lyemp"
item_state = "lyempgrenade"
origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 3)
prime()
@@ -4,7 +4,6 @@
//icon = 'icons/obj/grenade.dmi'
//det_time = 50
//icon_state = "frggrenade"
//item_state = "frggrenade"
//origin_tech = list(TECH_MATERIAL = 2, TECH_COMBAT = 3)
//obj/item/weapon/grenade/explosive/prime()
@@ -18,7 +17,8 @@
//Explosive grenade projectile, borrowed from fragmentation grenade code.
/obj/item/projectile/bullet/pellet/fragment
damage = 10
range_step = 2
armor_penetration = 30
range_step = 2 //projectiles lose a fragment each time they travel this distance. Can be a non-integer.
base_spread = 0 //causes it to be treated as a shrapnel explosion instead of cone
spread_step = 20
@@ -31,11 +31,10 @@
name = "fragmentation grenade"
desc = "A fragmentation grenade, optimized for harming personnel without causing massive structural damage."
icon_state = "frggrenade"
item_state = "frggrenade"
item_state = "grenade"
var/num_fragments = 50 //total number of fragments produced by the grenade
var/fragment_damage = 10
var/damage_step = 2 //projectiles lose a fragment each time they travel this distance. Can be a non-integer.
var/fragment_type = /obj/item/projectile/bullet/pellet/fragment
var/num_fragments = 63 //total number of fragments produced by the grenade
var/explosion_size = 2 //size of the center explosion
//The radius of the circle used to launch projectiles. Lower values mean less projectiles are used but if set too low gaps may appear in the spread pattern
@@ -57,9 +56,7 @@
for(var/turf/T in target_turfs)
var/obj/item/projectile/bullet/pellet/fragment/P = new (O)
P.damage = fragment_damage
P.pellets = fragments_per_projectile
P.range_step = damage_step
P.shot_from = src.name
P.launch(T)
@@ -40,7 +40,7 @@
//Flashing everyone
if(eye_safety < 1)
flick("e_flash", M.flash)
M.flash_eyes()
M.Stun(2)
M.Weaken(10)
@@ -18,7 +18,7 @@
playsound(T, 'sound/effects/phasein.ogg', 100, 1)
for(var/mob/living/carbon/human/M in viewers(T, null))
if(M:eyecheck() <= 0)
flick("e_flash", M.flash)
M.flash_eyes()
// Spawn some hostile syndicate critters
for(var/i=1, i<=deliveryamt, i++)
+3 -3
View File
@@ -60,7 +60,7 @@
user << "<span class='danger'>\The [H] needs at least two wrists before you can cuff them together!</span>"
return 0
if(istype(H.gloves,/obj/item/clothing/gloves/rig) && !elastic) // Can't cuff someone who's in a deployed hardsuit.
if(istype(H.gloves,/obj/item/clothing/gloves/gauntlets/rig) && !elastic) // Can't cuff someone who's in a deployed hardsuit.
user << "<span class='danger'>\The [src] won't fit around \the [H.gloves]!</span>"
return 0
@@ -76,7 +76,7 @@
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
user.do_attack_animation(H)
user.visible_message("<span class='danger'>\The [user] has put [cuff_type] on \the [H]!</span>")
// Apply cuffs.
@@ -169,4 +169,4 @@ var/last_chew = 0
item_state = null
icon = 'icons/obj/bureaucracy.dmi'
breakouttime = 200
cuff_type = "duct tape"
cuff_type = "duct tape"
@@ -15,43 +15,44 @@
var/malfunction = 0
show_messages = 1
proc/trigger(emote, source as mob)
return
/obj/item/weapon/implant/proc/trigger(emote, source as mob)
return
proc/activate()
return
/obj/item/weapon/implant/proc/activate()
return
// What does the implant do upon injection?
// return 0 if the implant fails (ex. Revhead and loyalty implant.)
// return 1 if the implant succeeds (ex. Nonrevhead and loyalty implant.)
proc/implanted(var/mob/source)
return 1
/obj/item/weapon/implant/proc/implanted(var/mob/source)
listening_objects |= src
return 1
proc/get_data()
return "No information available"
/obj/item/weapon/implant/proc/get_data()
return "No information available"
proc/hear(message, source as mob)
return
/obj/item/weapon/implant/proc/hear(message, source as mob)
return
proc/islegal()
return 0
/obj/item/weapon/implant/proc/islegal()
return 0
proc/meltdown() //breaks it down, making implant unrecongizible
imp_in << "<span class='warning'>You feel something melting inside [part ? "your [part.name]" : "you"]!</span>"
if (part)
part.take_damage(burn = 15, used_weapon = "Electronics meltdown")
else
var/mob/living/M = imp_in
M.apply_damage(15,BURN)
name = "melted implant"
desc = "Charred circuit in melted plastic case. Wonder what that used to be..."
icon_state = "implant_melted"
malfunction = MALFUNCTION_PERMANENT
/obj/item/weapon/implant/proc/meltdown() //breaks it down, making implant unrecongizible
imp_in << "<span class='warning'>You feel something melting inside [part ? "your [part.name]" : "you"]!</span>"
if (part)
part.take_damage(burn = 15, used_weapon = "Electronics meltdown")
else
var/mob/living/M = imp_in
M.apply_damage(15,BURN)
name = "melted implant"
desc = "Charred circuit in melted plastic case. Wonder what that used to be..."
icon_state = "implant_melted"
malfunction = MALFUNCTION_PERMANENT
Destroy()
if(part)
part.implants.Remove(src)
..()
/obj/item/weapon/implant/Destroy()
if(part)
part.implants.Remove(src)
..()
/obj/item/weapon/implant/tracking
name = "tracking implant"
@@ -59,8 +60,8 @@
var/id = 1.0
get_data()
var/dat = {"<b>Implant Specifications:</b><BR>
/obj/item/weapon/implant/tracking/get_data()
var/dat = {"<b>Implant Specifications:</b><BR>
<b>Name:</b> Tracking Beacon<BR>
<b>Life:</b> 10 minutes after death of host<BR>
<b>Important Notes:</b> None<BR>
@@ -74,23 +75,23 @@ disintegrate into bio-safe elements.<BR>
<b>Integrity:</b> Gradient creates slight risk of being overcharged and frying the
circuitry. As a result neurotoxins can cause massive damage.<HR>
Implant Specifics:<BR>"}
return dat
return dat
emp_act(severity)
if (malfunction) //no, dawg, you can't malfunction while you are malfunctioning
return
malfunction = MALFUNCTION_TEMPORARY
/obj/item/weapon/implant/tracking/emp_act(severity)
if (malfunction) //no, dawg, you can't malfunction while you are malfunctioning
return
malfunction = MALFUNCTION_TEMPORARY
var/delay = 20
switch(severity)
if(1)
if(prob(60))
meltdown()
if(2)
delay = rand(5*60*10,15*60*10) //from 5 to 15 minutes of free time
var/delay = 20
switch(severity)
if(1)
if(prob(60))
meltdown()
if(2)
delay = rand(5*60*10,15*60*10) //from 5 to 15 minutes of free time
spawn(delay)
malfunction--
spawn(delay)
malfunction--
/obj/item/weapon/implant/dexplosive
@@ -98,8 +99,8 @@ Implant Specifics:<BR>"}
desc = "And boom goes the weasel."
icon_state = "implant_evil"
get_data()
var/dat = {"
/obj/item/weapon/implant/dexplosive/get_data()
var/dat = {"
<b>Implant Specifications:</b><BR>
<b>Name:</b> Robust Corp RX-78 Employee Management Implant<BR>
<b>Life:</b> Activates upon death.<BR>
@@ -109,23 +110,23 @@ Implant Specifics:<BR>"}
<b>Function:</b> Contains a compact, electrically detonated explosive that detonates upon receiving a specially encoded signal or upon host death.<BR>
<b>Special Features:</b> Explodes<BR>
<b>Integrity:</b> Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."}
return dat
return dat
trigger(emote, source as mob)
if(emote == "deathgasp")
src.activate("death")
return
/obj/item/weapon/implant/dexplosive/trigger(emote, source as mob)
if(emote == "deathgasp")
src.activate("death")
return
activate(var/cause)
if((!cause) || (!src.imp_in)) return 0
explosion(src, -1, 0, 2, 3, 0)//This might be a bit much, dono will have to see.
if(src.imp_in)
src.imp_in.gib()
/obj/item/weapon/implant/dexplosive/activate(var/cause)
if((!cause) || (!src.imp_in)) return 0
explosion(src, -1, 0, 2, 3, 0)//This might be a bit much, dono will have to see.
if(src.imp_in)
src.imp_in.gib()
islegal()
return 0
/obj/item/weapon/implant/dexplosive/islegal()
return 0
//BS12 Explosive
/obj/item/weapon/implant/explosive
@@ -135,8 +136,8 @@ Implant Specifics:<BR>"}
var/phrase = "supercalifragilisticexpialidocious"
icon_state = "implant_evil"
get_data()
var/dat = {"
/obj/item/weapon/implant/explosive/get_data()
var/dat = {"
<b>Implant Specifications:</b><BR>
<b>Name:</b> Robust Corp RX-78 Intimidation Class Implant<BR>
<b>Life:</b> Activates upon codephrase.<BR>
@@ -146,120 +147,121 @@ Implant Specifics:<BR>"}
<b>Function:</b> Contains a compact, electrically detonated explosive that detonates upon receiving a specially encoded signal or upon host death.<BR>
<b>Special Features:</b> Explodes<BR>
<b>Integrity:</b> Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."}
return dat
return dat
hear_talk(mob/M as mob, msg)
hear(msg)
/obj/item/weapon/implant/explosive/hear_talk(mob/M as mob, msg)
hear(msg)
return
/obj/item/weapon/implant/explosive/hear(var/msg)
var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = "")
msg = replace_characters(msg, replacechars)
if(findtext(msg,phrase))
activate()
qdel(src)
/obj/item/weapon/implant/explosive/activate()
if (malfunction == MALFUNCTION_PERMANENT)
return
hear(var/msg)
var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = "")
msg = replace_characters(msg, replacechars)
if(findtext(msg,phrase))
activate()
qdel(src)
var/need_gib = null
if(istype(imp_in, /mob/))
var/mob/T = imp_in
message_admins("Explosive implant triggered in [T] ([T.key]). (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>) ")
log_game("Explosive implant triggered in [T] ([T.key]).")
need_gib = 1
activate()
if (malfunction == MALFUNCTION_PERMANENT)
return
var/need_gib = null
if(istype(imp_in, /mob/))
var/mob/T = imp_in
message_admins("Explosive implant triggered in [T] ([T.key]). (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>) ")
log_game("Explosive implant triggered in [T] ([T.key]).")
need_gib = 1
if(ishuman(imp_in))
if (elevel == "Localized Limb")
if(part) //For some reason, small_boom() didn't work. So have this bit of working copypaste.
imp_in.visible_message("<span class='warning'>Something beeps inside [imp_in][part ? "'s [part.name]" : ""]!</span>")
playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3)
sleep(25)
if (istype(part,/obj/item/organ/external/chest) || \
istype(part,/obj/item/organ/external/groin) || \
istype(part,/obj/item/organ/external/head))
part.createwound(BRUISE, 60) //mangle them instead
explosion(get_turf(imp_in), -1, -1, 2, 3)
qdel(src)
else
explosion(get_turf(imp_in), -1, -1, 2, 3)
part.droplimb(0,DROPLIMB_BLUNT)
qdel(src)
if (elevel == "Destroy Body")
explosion(get_turf(T), -1, 0, 1, 6)
T.gib()
if (elevel == "Full Explosion")
explosion(get_turf(T), 0, 1, 3, 6)
T.gib()
else
explosion(get_turf(imp_in), 0, 1, 3, 6)
if(need_gib)
imp_in.gib()
var/turf/t = get_turf(imp_in)
if(t)
t.hotspot_expose(3500,125)
implanted(mob/source as mob)
elevel = alert("What sort of explosion would you prefer?", "Implant Intent", "Localized Limb", "Destroy Body", "Full Explosion")
phrase = input("Choose activation phrase:") as text
var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = "")
phrase = replace_characters(phrase, replacechars)
usr.mind.store_memory("Explosive implant in [source] can be activated by saying something containing the phrase ''[src.phrase]'', <B>say [src.phrase]</B> to attempt to activate.", 0, 0)
usr << "The implanted explosive implant in [source] can be activated by saying something containing the phrase ''[src.phrase]'', <B>say [src.phrase]</B> to attempt to activate."
return 1
emp_act(severity)
if (malfunction)
return
malfunction = MALFUNCTION_TEMPORARY
switch (severity)
if (2.0) //Weak EMP will make implant tear limbs off.
if (prob(50))
small_boom()
if (1.0) //strong EMP will melt implant either making it go off, or disarming it
if (prob(70))
if (prob(50))
small_boom()
else
if (prob(50))
activate() //50% chance of bye bye
else
meltdown() //50% chance of implant disarming
spawn (20)
malfunction--
islegal()
return 0
proc/small_boom()
if (ishuman(imp_in) && part)
imp_in.visible_message("<span class='warning'>Something beeps inside [imp_in][part ? "'s [part.name]" : ""]!</span>")
playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3)
spawn(25)
if (ishuman(imp_in) && part)
//No tearing off these parts since it's pretty much killing
//and you can't replace groins
if(ishuman(imp_in))
if (elevel == "Localized Limb")
if(part) //For some reason, small_boom() didn't work. So have this bit of working copypaste.
imp_in.visible_message("<span class='warning'>Something beeps inside [imp_in][part ? "'s [part.name]" : ""]!</span>")
playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3)
sleep(25)
if (istype(part,/obj/item/organ/external/chest) || \
istype(part,/obj/item/organ/external/groin) || \
istype(part,/obj/item/organ/external/head))
part.createwound(BRUISE, 60) //mangle them instead
explosion(get_turf(imp_in), -1, -1, 2, 3)
qdel(src)
else
explosion(get_turf(imp_in), -1, -1, 2, 3)
part.droplimb(0,DROPLIMB_BLUNT)
explosion(get_turf(imp_in), -1, -1, 2, 3)
qdel(src)
qdel(src)
if (elevel == "Destroy Body")
explosion(get_turf(T), -1, 0, 1, 6)
T.gib()
if (elevel == "Full Explosion")
explosion(get_turf(T), 0, 1, 3, 6)
T.gib()
else
explosion(get_turf(imp_in), 0, 1, 3, 6)
if(need_gib)
imp_in.gib()
var/turf/t = get_turf(imp_in)
if(t)
t.hotspot_expose(3500,125)
/obj/item/weapon/implant/explosive/implanted(mob/source as mob)
elevel = alert("What sort of explosion would you prefer?", "Implant Intent", "Localized Limb", "Destroy Body", "Full Explosion")
phrase = input("Choose activation phrase:") as text
var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = "")
phrase = replace_characters(phrase, replacechars)
usr.mind.store_memory("Explosive implant in [source] can be activated by saying something containing the phrase ''[src.phrase]'', <B>say [src.phrase]</B> to attempt to activate.", 0, 0)
usr << "The implanted explosive implant in [source] can be activated by saying something containing the phrase ''[src.phrase]'', <B>say [src.phrase]</B> to attempt to activate."
listening_objects |= src
return 1
/obj/item/weapon/implant/explosive/emp_act(severity)
if (malfunction)
return
malfunction = MALFUNCTION_TEMPORARY
switch (severity)
if (2.0) //Weak EMP will make implant tear limbs off.
if (prob(50))
small_boom()
if (1.0) //strong EMP will melt implant either making it go off, or disarming it
if (prob(70))
if (prob(50))
small_boom()
else
if (prob(50))
activate() //50% chance of bye bye
else
meltdown() //50% chance of implant disarming
spawn (20)
malfunction--
/obj/item/weapon/implant/explosive/islegal()
return 0
/obj/item/weapon/implant/explosive/proc/small_boom()
if (ishuman(imp_in) && part)
imp_in.visible_message("<span class='warning'>Something beeps inside [imp_in][part ? "'s [part.name]" : ""]!</span>")
playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3)
spawn(25)
if (ishuman(imp_in) && part)
//No tearing off these parts since it's pretty much killing
//and you can't replace groins
if (istype(part,/obj/item/organ/external/chest) || \
istype(part,/obj/item/organ/external/groin) || \
istype(part,/obj/item/organ/external/head))
part.createwound(BRUISE, 60) //mangle them instead
else
part.droplimb(0,DROPLIMB_BLUNT)
explosion(get_turf(imp_in), -1, -1, 2, 3)
qdel(src)
/obj/item/weapon/implant/chem
name = "chemical implant"
desc = "Injects things."
allow_reagents = 1
get_data()
var/dat = {"
/obj/item/weapon/implant/chem/get_data()
var/dat = {"
<b>Implant Specifications:</b><BR>
<b>Name:</b> Robust Corp MJ-420 Prisoner Management Implant<BR>
<b>Life:</b> Deactivates upon death but remains within the body.<BR>
@@ -274,55 +276,55 @@ the implant releases the chemicals directly into the blood stream.<BR>
Can only be loaded while still in its original case.<BR>
<b>Integrity:</b> Implant will last so long as the subject is alive. However, if the subject suffers from malnutrition,<BR>
the implant may become unstable and either pre-maturely inject the subject or simply break."}
return dat
return dat
New()
..()
var/datum/reagents/R = new/datum/reagents(50)
reagents = R
R.my_atom = src
/obj/item/weapon/implant/chem/New()
..()
var/datum/reagents/R = new/datum/reagents(50)
reagents = R
R.my_atom = src
trigger(emote, source as mob)
if(emote == "deathgasp")
src.activate(src.reagents.total_volume)
/obj/item/weapon/implant/chem/trigger(emote, source as mob)
if(emote == "deathgasp")
src.activate(src.reagents.total_volume)
return
/obj/item/weapon/implant/chem/activate(var/cause)
if((!cause) || (!src.imp_in)) return 0
var/mob/living/carbon/R = src.imp_in
src.reagents.trans_to_mob(R, cause, CHEM_BLOOD)
R << "You hear a faint *beep*."
if(!src.reagents.total_volume)
R << "You hear a faint click from your chest."
spawn(0)
qdel(src)
return
/obj/item/weapon/implant/chem/emp_act(severity)
if (malfunction)
return
malfunction = MALFUNCTION_TEMPORARY
switch(severity)
if(1)
if(prob(60))
activate(20)
if(2)
if(prob(30))
activate(5)
activate(var/cause)
if((!cause) || (!src.imp_in)) return 0
var/mob/living/carbon/R = src.imp_in
src.reagents.trans_to_mob(R, cause, CHEM_BLOOD)
R << "You hear a faint *beep*."
if(!src.reagents.total_volume)
R << "You hear a faint click from your chest."
spawn(0)
qdel(src)
return
emp_act(severity)
if (malfunction)
return
malfunction = MALFUNCTION_TEMPORARY
switch(severity)
if(1)
if(prob(60))
activate(20)
if(2)
if(prob(30))
activate(5)
spawn(20)
malfunction--
spawn(20)
malfunction--
/obj/item/weapon/implant/loyalty
name = "loyalty implant"
desc = "Makes you loyal or such."
get_data()
var/dat = {"
/obj/item/weapon/implant/loyalty/get_data()
var/dat = {"
<b>Implant Specifications:</b><BR>
<b>Name:</b> [company_name] Employee Management Implant<BR>
<b>Life:</b> Ten years.<BR>
@@ -332,20 +334,20 @@ the implant may become unstable and either pre-maturely inject the subject or si
<b>Function:</b> Contains a small pod of nanobots that manipulate the host's mental functions.<BR>
<b>Special Features:</b> Will prevent and cure most forms of brainwashing.<BR>
<b>Integrity:</b> Implant will last so long as the nanobots are inside the bloodstream."}
return dat
return dat
implanted(mob/M)
if(!istype(M, /mob/living/carbon/human)) return 0
var/mob/living/carbon/human/H = M
var/datum/antagonist/antag_data = get_antag_data(H.mind.special_role)
if(antag_data && (antag_data.flags & ANTAG_IMPLANT_IMMUNE))
H.visible_message("[H] seems to resist the implant!", "You feel the corporate tendrils of [company_name] try to invade your mind!")
return 0
else
clear_antag_roles(H.mind, 1)
H << "<span class='notice'>You feel a surge of loyalty towards [company_name].</span>"
return 1
/obj/item/weapon/implant/loyalty/implanted(mob/M)
if(!istype(M, /mob/living/carbon/human)) return 0
var/mob/living/carbon/human/H = M
var/datum/antagonist/antag_data = get_antag_data(H.mind.special_role)
if(antag_data && (antag_data.flags & ANTAG_IMPLANT_IMMUNE))
H.visible_message("[H] seems to resist the implant!", "You feel the corporate tendrils of [company_name] try to invade your mind!")
return 0
else
clear_antag_roles(H.mind, 1)
H << "<span class='notice'>You feel a surge of loyalty towards [company_name].</span>"
return 1
/obj/item/weapon/implant/adrenalin
@@ -353,8 +355,8 @@ the implant may become unstable and either pre-maturely inject the subject or si
desc = "Removes all stuns and knockdowns."
var/uses
get_data()
var/dat = {"
/obj/item/weapon/implant/adrenalin/get_data()
var/dat = {"
<b>Implant Specifications:</b><BR>
<b>Name:</b> Cybersun Industries Adrenalin Implant<BR>
<b>Life:</b> Five days.<BR>
@@ -364,25 +366,26 @@ the implant may become unstable and either pre-maturely inject the subject or si
<b>Function:</b> Contains nanobots to stimulate body to mass-produce Adrenalin.<BR>
<b>Special Features:</b> Will prevent and cure most forms of brainwashing.<BR>
<b>Integrity:</b> Implant can only be used three times before the nanobots are depleted."}
return dat
return dat
trigger(emote, mob/source as mob)
if (src.uses < 1) return 0
if (emote == "pale")
src.uses--
source << "<span class='notice'>You feel a sudden surge of energy!</span>"
source.SetStunned(0)
source.SetWeakened(0)
source.SetParalysis(0)
/obj/item/weapon/implant/adrenalin/trigger(emote, mob/source as mob)
if (src.uses < 1) return 0
if (emote == "pale")
src.uses--
source << "<span class='notice'>You feel a sudden surge of energy!</span>"
source.SetStunned(0)
source.SetWeakened(0)
source.SetParalysis(0)
return
return
implanted(mob/source)
source.mind.store_memory("A implant can be activated by using the pale emote, <B>say *pale</B> to attempt to activate.", 0, 0)
source << "The implanted freedom implant can be activated by using the pale emote, <B>say *pale</B> to attempt to activate."
return 1
/obj/item/weapon/implant/adrenalin/implanted(mob/source)
source.mind.store_memory("A implant can be activated by using the pale emote, <B>say *pale</B> to attempt to activate.", 0, 0)
source << "The implanted freedom implant can be activated by using the pale emote, <B>say *pale</B> to attempt to activate."
listening_objects |= src
return 1
/obj/item/weapon/implant/death_alarm
@@ -390,8 +393,8 @@ the implant may become unstable and either pre-maturely inject the subject or si
desc = "An alarm which monitors host vital signs and transmits a radio message upon death."
var/mobname = "Will Robinson"
get_data()
var/dat = {"
/obj/item/weapon/implant/death_alarm/get_data()
var/dat = {"
<b>Implant Specifications:</b><BR>
<b>Name:</b> [company_name] \"Profit Margin\" Class Employee Lifesign Sensor<BR>
<b>Life:</b> Activates upon death.<BR>
@@ -401,65 +404,65 @@ the implant may become unstable and either pre-maturely inject the subject or si
<b>Function:</b> Contains a compact radio signaler that triggers when the host's lifesigns cease.<BR>
<b>Special Features:</b> Alerts crew to crewmember death.<BR>
<b>Integrity:</b> Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."}
return dat
return dat
process()
if (!implanted) return
var/mob/M = imp_in
/obj/item/weapon/implant/death_alarm/process()
if (!implanted) return
var/mob/M = imp_in
if(isnull(M)) // If the mob got gibbed
activate()
else if(M.stat == 2)
activate("death")
if(isnull(M)) // If the mob got gibbed
activate()
else if(M.stat == 2)
activate("death")
activate(var/cause)
var/mob/M = imp_in
var/area/t = get_area(M)
switch (cause)
if("death")
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null)
if(istype(t, /area/syndicate_station) || istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite) )
//give the syndies a bit of stealth
a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Security")
a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Medical")
else
a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Security")
a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Medical")
qdel(a)
processing_objects.Remove(src)
if ("emp")
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null)
var/name = prob(50) ? t.name : pick(teleportlocs)
a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Security")
a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Medical")
qdel(a)
/obj/item/weapon/implant/death_alarm/activate(var/cause)
var/mob/M = imp_in
var/area/t = get_area(M)
switch (cause)
if("death")
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null)
if(istype(t, /area/syndicate_station) || istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite) )
//give the syndies a bit of stealth
a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Security")
a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Medical")
else
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null)
a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Security")
a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Medical")
qdel(a)
processing_objects.Remove(src)
emp_act(severity) //for some reason alarms stop going off in case they are emp'd, even without this
if (malfunction) //so I'm just going to add a meltdown chance here
return
malfunction = MALFUNCTION_TEMPORARY
activate("emp") //let's shout that this dude is dead
if(severity == 1)
if(prob(40)) //small chance of obvious meltdown
meltdown()
else if (prob(60)) //but more likely it will just quietly die
malfunction = MALFUNCTION_PERMANENT
a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Security")
a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Medical")
qdel(a)
processing_objects.Remove(src)
if ("emp")
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null)
var/name = prob(50) ? t.name : pick(teleportlocs)
a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Security")
a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Medical")
qdel(a)
else
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null)
a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Security")
a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Medical")
qdel(a)
processing_objects.Remove(src)
spawn(20)
malfunction--
/obj/item/weapon/implant/death_alarm/emp_act(severity) //for some reason alarms stop going off in case they are emp'd, even without this
if (malfunction) //so I'm just going to add a meltdown chance here
return
malfunction = MALFUNCTION_TEMPORARY
implanted(mob/source as mob)
mobname = source.real_name
processing_objects.Add(src)
return 1
activate("emp") //let's shout that this dude is dead
if(severity == 1)
if(prob(40)) //small chance of obvious meltdown
meltdown()
else if (prob(60)) //but more likely it will just quietly die
malfunction = MALFUNCTION_PERMANENT
processing_objects.Remove(src)
spawn(20)
malfunction--
/obj/item/weapon/implant/death_alarm/implanted(mob/source as mob)
mobname = source.real_name
processing_objects.Add(src)
return 1
/obj/item/weapon/implant/compressed
name = "compressed matter implant"
@@ -468,8 +471,8 @@ the implant may become unstable and either pre-maturely inject the subject or si
var/activation_emote = "sigh"
var/obj/item/scanned = null
get_data()
var/dat = {"
/obj/item/weapon/implant/compressed/get_data()
var/dat = {"
<b>Implant Specifications:</b><BR>
<b>Name:</b> [company_name] \"Profit Margin\" Class Employee Lifesign Sensor<BR>
<b>Life:</b> Activates upon death.<BR>
@@ -479,30 +482,31 @@ the implant may become unstable and either pre-maturely inject the subject or si
<b>Function:</b> Contains a compact radio signaler that triggers when the host's lifesigns cease.<BR>
<b>Special Features:</b> Alerts crew to crewmember death.<BR>
<b>Integrity:</b> Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."}
return dat
return dat
trigger(emote, mob/source as mob)
if (src.scanned == null)
return 0
if (emote == src.activation_emote)
source << "The air glows as \the [src.scanned.name] uncompresses."
activate()
activate()
var/turf/t = get_turf(src)
if (imp_in)
imp_in.put_in_hands(scanned)
else
scanned.loc = t
qdel(src)
implanted(mob/source as mob)
src.activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
if (source.mind)
source.mind.store_memory("Compressed matter implant can be activated by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate.", 0, 0)
source << "The implanted compressed matter implant can be activated by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate."
return 1
islegal()
/obj/item/weapon/implant/compressed/trigger(emote, mob/source as mob)
if (src.scanned == null)
return 0
if (emote == src.activation_emote)
source << "The air glows as \the [src.scanned.name] uncompresses."
activate()
/obj/item/weapon/implant/compressed/activate()
var/turf/t = get_turf(src)
if (imp_in)
imp_in.put_in_hands(scanned)
else
scanned.loc = t
qdel(src)
/obj/item/weapon/implant/compressed/implanted(mob/source as mob)
src.activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
if (source.mind)
source.mind.store_memory("Compressed matter implant can be activated by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate.", 0, 0)
source << "The implanted compressed matter implant can be activated by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate."
listening_objects |= src
return 1
/obj/item/weapon/implant/compressed/islegal()
return 0
@@ -8,53 +8,54 @@
var/uses = 1.0
New()
src.activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
src.uses = rand(1, 5)
..()
return
/obj/item/weapon/implant/freedom/New()
src.activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
src.uses = rand(1, 5)
..()
return
trigger(emote, mob/living/carbon/source as mob)
if (src.uses < 1) return 0
if (emote == src.activation_emote)
src.uses--
source << "You feel a faint click."
if (source.handcuffed)
var/obj/item/weapon/W = source.handcuffed
source.handcuffed = null
if(source.buckled && source.buckled.buckle_require_restraints)
source.buckled.unbuckle_mob()
source.update_inv_handcuffed()
if (source.client)
source.client.screen -= W
/obj/item/weapon/implant/freedom/trigger(emote, mob/living/carbon/source as mob)
if (src.uses < 1) return 0
if (emote == src.activation_emote)
src.uses--
source << "You feel a faint click."
if (source.handcuffed)
var/obj/item/weapon/W = source.handcuffed
source.handcuffed = null
if(source.buckled && source.buckled.buckle_require_restraints)
source.buckled.unbuckle_mob()
source.update_inv_handcuffed()
if (source.client)
source.client.screen -= W
if (W)
W.loc = source.loc
dropped(source)
if (W)
W.loc = source.loc
dropped(source)
if (W)
W.layer = initial(W.layer)
if (source.legcuffed)
var/obj/item/weapon/W = source.legcuffed
source.legcuffed = null
source.update_inv_legcuffed()
if (source.client)
source.client.screen -= W
W.layer = initial(W.layer)
if (source.legcuffed)
var/obj/item/weapon/W = source.legcuffed
source.legcuffed = null
source.update_inv_legcuffed()
if (source.client)
source.client.screen -= W
if (W)
W.loc = source.loc
dropped(source)
if (W)
W.loc = source.loc
dropped(source)
if (W)
W.layer = initial(W.layer)
return
W.layer = initial(W.layer)
return
implanted(mob/living/carbon/source)
source.mind.store_memory("Freedom implant can be activated by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate.", 0, 0)
source << "The implanted freedom implant can be activated by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate."
return 1
/obj/item/weapon/implant/freedom/implanted(mob/living/carbon/source)
source.mind.store_memory("Freedom implant can be activated by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate.", 0, 0)
source << "The implanted freedom implant can be activated by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate."
listening_objects |= src
return 1
get_data()
var/dat = {"
/obj/item/weapon/implant/freedom/get_data()
var/dat = {"
<b>Implant Specifications:</b><BR>
<b>Name:</b> Freedom Beacon<BR>
<b>Life:</b> optimum 5 uses<BR>
@@ -68,4 +69,4 @@ mechanisms<BR>
<b>Integrity:</b> The battery is extremely weak and commonly after injection its
life can drive down to only 1 use.<HR>
No Implant Specifics"}
return dat
return dat
@@ -15,6 +15,7 @@
activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
source.mind.store_memory("Uplink implant can be activated by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate.", 0, 0)
source << "The implanted uplink implant can be activated by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate."
listening_objects |= src
return 1
@@ -3,7 +3,6 @@
desc = "HOME RUN!"
icon_state = "metalbat0"
base_icon = "metalbat"
item_state = "metalbat"
throwforce = 7
attack_verb = list("smashed", "beaten", "slammed", "smacked", "struck", "battered", "bonked")
hitsound = 'sound/weapons/genhit3.ogg'
@@ -38,3 +38,6 @@
/obj/item/weapon/material/twohanded/fireaxe/foam/New(var/newloc)
..(newloc,"foam")
/obj/item/weapon/material/twohanded/fireaxe/foam/afterattack()
return
@@ -1,6 +1,6 @@
/obj/item/weapon/material/kitchen
icon = 'icons/obj/kitchen.dmi'
/*
* Utensils
*/
@@ -72,7 +72,6 @@
name = "meat hook"
desc = "A sharp, metal hook what sticks into things."
icon_state = "hook_knife"
item_state = "hook_knife"
/obj/item/weapon/material/knife/ritual
name = "ritual knife"
@@ -10,6 +10,10 @@
w_class = 3
sharp = 0
edge = 0
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_material.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_material.dmi',
)
var/applies_material_colour = 1
var/unbreakable
@@ -38,6 +38,22 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "unathiknife"
attack_verb = list("ripped", "torn", "cut")
var hits = 0
/obj/item/weapon/material/hatchet/unathiknife/attack(mob/M as mob, mob/user as mob)
if(hits > 0)
return
var/obj/item/I = user.get_inactive_hand()
if(istype(I, /obj/item/weapon/material/hatchet/unathiknife))
hits ++
var/obj/item/weapon/W = I
W.attack(M, user)
W.afterattack(M, user)
..()
/obj/item/weapon/material/hatchet/unathiknife/afterattack(mob/M as mob, mob/user as mob)
hits = initial(hits)
..()
/obj/item/weapon/material/hatchet/tacknife
name = "tactical knife"
@@ -64,7 +80,6 @@
desc = "It's used for removing weeds or scratching your back."
icon = 'icons/obj/weapons.dmi'
icon_state = "hoe"
item_state = "hoe"
force_divisor = 0.25 // 5 with weight 20 (steel)
thrown_force_divisor = 0.25 // as above
w_class = 2
@@ -2,7 +2,6 @@
name = "claymore"
desc = "What are you standing around staring at this for? Get to killing!"
icon_state = "claymore"
item_state = "claymore"
slot_flags = SLOT_BELT
force_divisor = 0.7 // 42 when wielded with hardnes 60 (steel)
thrown_force_divisor = 0.5 // 10 when thrown with weight 20 (steel)
@@ -27,7 +26,6 @@
name = "katana"
desc = "Woefully underpowered in D20. This one looks pretty sharp."
icon_state = "katana"
item_state = "katana"
slot_flags = SLOT_BELT | SLOT_BACK
/obj/item/weapon/material/sword/katana/suicide_act(mob/user)
@@ -93,6 +93,22 @@
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
applies_material_colour = 0
/obj/item/weapon/material/twohanded/fireaxe/update_held_icon()
var/mob/living/M = loc
if(istype(M) && !issmall(M) && M.item_is_in_hands(src) && !M.hands_are_full())
wielded = 1
pry = 1
force = force_wielded
name = "[base_name] (wielded)"
update_icon()
else
wielded = 0
pry = 0
force = force_unwielded
name = "[base_name]"
update_icon()
..()
/obj/item/weapon/material/twohanded/fireaxe/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity)
if(!proximity) return
..()
@@ -2,7 +2,6 @@
name = "chain of command"
desc = "A tool used by great men to placate the frothing masses."
icon_state = "chain"
item_state = "chain"
flags = CONDUCT
slot_flags = SLOT_BELT
force = 10
@@ -32,6 +32,10 @@
/obj/item/weapon/shield
name = "shield"
var/base_block_chance = 50
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi',
)
/obj/item/weapon/shield/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(user.incapacitated())
@@ -1,4 +1,3 @@
/*
* Backpack
*/
@@ -6,17 +5,7 @@
/obj/item/weapon/storage/backpack
name = "backpack"
desc = "You wear this on your back and put items into it."
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_backpacks.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_backpacks.dmi',
)
icon_state = "backpack"
item_state = null
//most backpacks use the default backpack state for inhand overlays
item_state_slots = list(
slot_l_hand_str = "backpack",
slot_r_hand_str = "backpack",
)
sprite_sheets = list(
"Teshari" = 'icons/mob/species/seromi/back.dmi'
)
@@ -76,7 +65,7 @@
name = "\improper Santa's gift bag"
desc = "Space Santa uses this to deliver toys to all the nice children in space in Christmas! Wow, it's pretty big!"
icon_state = "giftbag0"
item_state = "giftbag"
item_state_slots = list(slot_r_hand_str = "giftbag", slot_l_hand_str = "giftbag")
w_class = 4.0
max_w_class = 3
max_storage_space = 400 // can store a ton of shit!
@@ -91,31 +80,26 @@
name = "Giggles von Honkerton"
desc = "It's a backpack made by Honk! Co."
icon_state = "clownpack"
item_state_slots = null
/obj/item/weapon/storage/backpack/medic
name = "medical backpack"
desc = "It's a backpack especially designed for use in a sterile environment."
icon_state = "medicalpack"
item_state_slots = null
/obj/item/weapon/storage/backpack/security
name = "security backpack"
desc = "It's a very robust backpack."
icon_state = "securitypack"
item_state_slots = null
/obj/item/weapon/storage/backpack/captain
name = "captain's backpack"
desc = "It's a special backpack made exclusively for officers."
icon_state = "captainpack"
item_state_slots = null
/obj/item/weapon/storage/backpack/industrial
name = "industrial backpack"
desc = "It's a tough backpack for the daily grind of station life."
icon_state = "engiepack"
item_state_slots = null
/obj/item/weapon/storage/backpack/toxins
name = "laboratory backpack"
@@ -150,10 +134,6 @@
name = "dufflebag"
desc = "A large dufflebag for holding extra things."
icon_state = "duffle"
item_state_slots = list(
slot_l_hand_str = "duffle",
slot_r_hand_str = "duffle",
)
slowdown = 1
max_storage_space = 36
@@ -161,74 +141,42 @@
name = "black dufflebag"
desc = "A large dufflebag for holding extra tactical supplies."
icon_state = "duffle_syndie"
item_state_slots = list(
slot_l_hand_str = "duffle_syndiemed",
slot_r_hand_str = "duffle_syndiemed",
)
slowdown = 0
/obj/item/weapon/storage/backpack/dufflebag/syndie/med
name = "medical dufflebag"
desc = "A large dufflebag for holding extra tactical medical supplies."
icon_state = "duffle_syndiemed"
item_state_slots = list(
slot_l_hand_str = "duffle_syndiemed",
slot_r_hand_str = "duffle_syndiemed",
)
/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo
name = "ammunition dufflebag"
desc = "A large dufflebag for holding extra weapons ammunition and supplies."
icon_state = "duffle_syndieammo"
item_state_slots = list(
slot_l_hand_str = "duffle_syndieammo",
slot_r_hand_str = "duffle_syndieammo",
)
/obj/item/weapon/storage/backpack/dufflebag/captain
name = "captain's dufflebag"
desc = "A large dufflebag for holding extra captainly goods."
icon_state = "duffle_captain"
item_state_slots = list(
slot_l_hand_str = "duffle_captain",
slot_r_hand_str = "duffle_captain",
)
/obj/item/weapon/storage/backpack/dufflebag/med
name = "medical dufflebag"
desc = "A large dufflebag for holding extra medical supplies."
icon_state = "duffle_med"
item_state_slots = list(
slot_l_hand_str = "duffle_med",
slot_r_hand_str = "duffle_med",
)
/obj/item/weapon/storage/backpack/dufflebag/emt
name = "EMT dufflebag"
desc = "A large dufflebag for holding extra medical supplies. This one has reflective stripes!"
icon_state = "duffle_emt"
item_state_slots = list(
slot_l_hand_str = "duffle_emt",
slot_r_hand_str = "duffle_emt",
)
/obj/item/weapon/storage/backpack/dufflebag/sec
name = "security dufflebag"
desc = "A large dufflebag for holding extra security supplies and ammunition."
icon_state = "duffle_sec"
item_state_slots = list(
slot_l_hand_str = "duffle_sec",
slot_r_hand_str = "duffle_sec",
)
/obj/item/weapon/storage/backpack/dufflebag/eng
name = "industrial dufflebag"
desc = "A large dufflebag for holding extra tools and supplies."
icon_state = "duffle_eng"
item_state_slots = list(
slot_l_hand_str = "duffle_eng",
slot_r_hand_str = "duffle_eng",
)
/*
* Satchel Types
@@ -238,6 +186,7 @@
name = "leather satchel"
desc = "It's a very fancy satchel made with fine leather."
icon_state = "satchel"
item_state_slots = list(slot_r_hand_str = "briefcase", slot_l_hand_str = "briefcase")
/obj/item/weapon/storage/backpack/satchel/withwallet
New()
@@ -253,48 +202,43 @@
name = "industrial satchel"
desc = "A tough satchel with extra pockets."
icon_state = "satchel-eng"
item_state_slots = list(
slot_l_hand_str = "engiepack",
slot_r_hand_str = "engiepack",
)
item_state_slots = list(slot_r_hand_str = "engiepack", slot_l_hand_str = "engiepack")
/obj/item/weapon/storage/backpack/satchel/med
name = "medical satchel"
desc = "A sterile satchel used in medical departments."
icon_state = "satchel-med"
item_state_slots = list(
slot_l_hand_str = "medicalpack",
slot_r_hand_str = "medicalpack",
)
item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack")
/obj/item/weapon/storage/backpack/satchel/vir
name = "virologist satchel"
desc = "A sterile satchel with virologist colours."
icon_state = "satchel-vir"
item_state_slots = list(slot_r_hand_str = "viropack", slot_l_hand_str = "viropack")
/obj/item/weapon/storage/backpack/satchel/chem
name = "chemist satchel"
desc = "A sterile satchel with chemist colours."
icon_state = "satchel-chem"
item_state_slots = list(slot_r_hand_str = "chempack", slot_l_hand_str = "chempack")
/obj/item/weapon/storage/backpack/satchel/gen
name = "geneticist satchel"
desc = "A sterile satchel with geneticist colours."
icon_state = "satchel-gen"
item_state_slots = list(slot_r_hand_str = "genpack", slot_l_hand_str = "genpack")
/obj/item/weapon/storage/backpack/satchel/tox
name = "scientist satchel"
desc = "Useful for holding research materials."
icon_state = "satchel-tox"
item_state_slots = list(slot_r_hand_str = "toxpack", slot_l_hand_str = "toxpack")
/obj/item/weapon/storage/backpack/satchel/sec
name = "security satchel"
desc = "A robust satchel for security related needs."
icon_state = "satchel-sec"
item_state_slots = list(
slot_l_hand_str = "securitypack",
slot_r_hand_str = "securitypack",
)
item_state_slots = list(slot_r_hand_str = "securitypack", slot_l_hand_str = "securitypack")
/obj/item/weapon/storage/backpack/satchel/hyd
name = "hydroponics satchel"
@@ -305,20 +249,14 @@
name = "captain's satchel"
desc = "An exclusive satchel for officers."
icon_state = "satchel-cap"
item_state_slots = list(
slot_l_hand_str = "satchel-cap",
slot_r_hand_str = "satchel-cap",
)
item_state_slots = list(slot_r_hand_str = "captainpack", slot_l_hand_str = "captainpack")
//ERT backpacks.
/obj/item/weapon/storage/backpack/ert
name = "emergency response team backpack"
desc = "A spacious backpack with lots of pockets, used by members of the Emergency Response Team."
icon_state = "ert_commander"
item_state_slots = list(
slot_l_hand_str = "securitypack",
slot_r_hand_str = "securitypack",
)
item_state_slots = list(slot_r_hand_str = "securitypack", slot_l_hand_str = "securitypack")
//Commander
/obj/item/weapon/storage/backpack/ert/commander
@@ -30,7 +30,7 @@
desc = "It's the heavy-duty black polymer kind. Time to take out the trash!"
icon = 'icons/obj/janitor.dmi'
icon_state = "trashbag0"
item_state = "trashbag"
item_state_slots = list(slot_r_hand_str = "trashbag", slot_l_hand_str = "trashbag")
w_class = 4
max_w_class = 2
@@ -56,7 +56,6 @@
desc = "It's a very flimsy, very noisy alternative to a bag."
icon = 'icons/obj/trash.dmi'
icon_state = "plasticbag"
item_state = "plasticbag"
w_class = 4
max_w_class = 2
@@ -169,7 +168,6 @@
update_icon()
return 1
// Sets up numbered display to show the stack size of each stored mineral
// NOTE: numbered display is turned off currently because it's broken
orient2hud(mob/user as mob)
+46 -30
View File
@@ -2,8 +2,7 @@
name = "belt"
desc = "Can hold various things."
icon = 'icons/obj/clothing/belts.dmi'
icon_state = "utilitybelt"
item_state = "utility"
icon_state = "utility"
storage_slots = 7
max_storage_space = 28 //This should ensure belts always have enough room to store whatever.
max_w_class = 3
@@ -28,12 +27,10 @@
var/mob/M = src.loc
M.update_inv_belt()
/obj/item/weapon/storage/belt/utility
name = "tool-belt" //Carn: utility belt is nicer, but it bamboozles the text parsing.
desc = "Can hold various tools."
icon_state = "utilitybelt"
item_state = "utility"
icon_state = "utility"
can_hold = list(
///obj/item/weapon/combitool,
/obj/item/weapon/crowbar,
@@ -50,17 +47,17 @@
/obj/item/clothing/gloves,
/obj/item/device/pda,
/obj/item/device/megaphone,
/obj/item/taperoll/engineering,
/obj/item/taperoll,
/obj/item/device/radio/headset,
/obj/item/device/robotanalyzer,
/obj/item/weapon/material/minihoe,
/obj/item/weapon/material/hatchet,
/obj/item/device/analyzer/plant_analyzer,
/obj/item/weapon/extinguisher/mini,
/obj/item/device/flashlight/maglight
/obj/item/device/flashlight/maglight,
/obj/item/weapon/tape_roll,
)
/obj/item/weapon/storage/belt/utility/full/New()
..()
new /obj/item/weapon/screwdriver(src)
@@ -70,7 +67,6 @@
new /obj/item/weapon/wirecutters(src)
new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
/obj/item/weapon/storage/belt/utility/atmostech/New()
..()
new /obj/item/weapon/screwdriver(src)
@@ -80,13 +76,10 @@
new /obj/item/weapon/wirecutters(src)
new /obj/item/device/t_scanner(src)
/obj/item/weapon/storage/belt/medical
name = "medical belt"
desc = "Can hold various medical equipment."
icon_state = "medicalbelt"
item_state = "medical"
icon_state = "medical"
can_hold = list(
/obj/item/device/healthanalyzer,
/obj/item/weapon/dnainjector,
@@ -101,6 +94,7 @@
/obj/item/stack/medical,
/obj/item/device/radio/headset,
/obj/item/device/pda,
/obj/item/taperoll,
/obj/item/device/megaphone,
/obj/item/device/flashlight/pen,
/obj/item/clothing/mask/surgical,
@@ -116,14 +110,12 @@
/obj/item/weapon/storage/belt/medical/emt
name = "EMT utility belt"
desc = "A sturdy black webbing belt with attached pouches."
icon_state = "emsbelt"
item_state = "emsbelt"
icon_state = "ems"
/obj/item/weapon/storage/belt/security
name = "security belt"
desc = "Can hold security gear like handcuffs and flashes."
icon_state = "securitybelt"
item_state = "security"
icon_state = "security"
max_w_class = 3
can_hold = list(
/obj/item/weapon/grenade,
@@ -146,15 +138,14 @@
/obj/item/weapon/melee,
/obj/item/clothing/accessory/badge,
/obj/item/weapon/gun/projectile/sec,
/obj/item/taperoll/police,
/obj/item/taperoll,
/obj/item/weapon/gun/projectile/colt/detective
)
/obj/item/weapon/storage/belt/detective
name = "forensic utility belt"
desc = "A belt for holding forensics equipment."
icon_state = "securitybelt"
item_state = "security"
icon_state = "security"
storage_slots = 7
max_w_class = 3
can_hold = list(
@@ -181,7 +172,7 @@
/obj/item/device/megaphone,
/obj/item/device/radio/headset,
/obj/item/clothing/gloves,
/obj/item/taperoll/police,
/obj/item/taperoll,
/obj/item/weapon/reagent_containers/spray/pepper,
/obj/item/weapon/handcuffs,
/obj/item/device/flash,
@@ -194,8 +185,7 @@
/obj/item/weapon/storage/belt/soulstone
name = "soul stone belt"
desc = "Designed for ease of access to the shards during a fight, as to not let a single enemy spirit slip away"
icon_state = "soulstonebelt"
item_state = "soulstonebelt"
icon_state = "soulstone"
storage_slots = 6
can_hold = list(
/obj/item/device/soulstone
@@ -214,8 +204,7 @@
/obj/item/weapon/storage/belt/champion
name = "championship belt"
desc = "Proves to the world that you are the strongest!"
icon_state = "championbelt"
item_state = "champion"
icon_state = "champion"
storage_slots = 1
can_hold = list(
"/obj/item/clothing/mask/luchador"
@@ -224,8 +213,7 @@
/obj/item/weapon/storage/belt/security/tactical
name = "combat belt"
desc = "Can hold security gear like handcuffs and flashes, with more pouches for more storage."
icon_state = "swatbelt"
item_state = "swatbelt"
icon_state = "swat"
storage_slots = 9
max_w_class = 3
max_storage_space = 28
@@ -234,13 +222,11 @@
name = "combat belt"
desc = "Can hold security gear like handcuffs and flashes, with more pouches for more storage."
icon_state = "bandolier"
item_state = "bandolier"
/obj/item/weapon/storage/belt/janitor
name = "janitorial belt"
desc = "A belt used to hold most janitorial supplies."
icon_state = "janibelt"
item_state = "janibelt"
icon_state = "janitor"
storage_slots = 7
max_w_class = 3
can_hold = list(
@@ -256,6 +242,36 @@
/obj/item/weapon/light/tube,
/obj/item/weapon/flame/lighter,
/obj/item/device/megaphone,
/obj/item/taperoll,
/obj/item/weapon/reagent_containers/spray,
/obj/item/weapon/soap
)
/obj/item/weapon/storage/belt/archaeology
name = "excavation gear-belt"
desc = "Can hold various excavation gear."
icon_state = "gear"
can_hold = list(
/obj/item/weapon/storage/box/samplebags,
/obj/item/device/core_sampler,
/obj/item/device/beacon_locator,
/obj/item/device/radio/beacon,
/obj/item/device/gps,
/obj/item/device/measuring_tape,
/obj/item/device/flashlight,
/obj/item/weapon/pickaxe,
/obj/item/device/depth_scanner,
/obj/item/device/camera,
/obj/item/weapon/paper,
/obj/item/weapon/photo,
/obj/item/weapon/folder,
/obj/item/weapon/pen,
/obj/item/weapon/folder,
/obj/item/weapon/clipboard,
/obj/item/weapon/anodevice,
/obj/item/clothing/glasses,
/obj/item/weapon/wrench,
/obj/item/weapon/storage/box/excavation,
/obj/item/weapon/anobattery,
/obj/item/device/ano_scanner
)
@@ -23,7 +23,7 @@
name = "box"
desc = "It's just an ordinary box."
icon_state = "box"
item_state = "syringe_kit"
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
var/foldable = /obj/item/stack/material/cardboard // BubbleWrap - if set, can be folded (when empty) into a sheet of cardboard
max_w_class = 2
@@ -35,20 +35,20 @@
if ( contents.len )
return
if ( !ispath(src.foldable) )
if ( !ispath(foldable) )
return
var/found = 0
// Close any open UI windows first
for(var/mob/M in range(1))
if (M.s_active == src)
src.close(M)
close(M)
if ( M == user )
found = 1
if ( !found ) // User is too far away
return
// Now make the cardboard
user << "<span class='notice'>You fold [src] flat.</span>"
new src.foldable(get_turf(src))
new foldable(get_turf(src))
qdel(src)
/obj/item/weapon/storage/box/survival/New()
@@ -125,7 +125,7 @@
name = "box of blank shells"
desc = "It has a picture of a gun and several warning symbols on the front."
icon_state = "blankshot_box"
item_state = "syringe_kit"
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
/obj/item/weapon/storage/box/blanks/New()
..()
@@ -136,7 +136,7 @@
name = "box of beanbag shells"
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
icon_state = "beanshot_box"
item_state = "syringe_kit"
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
/obj/item/weapon/storage/box/beanbags/New()
..()
@@ -147,7 +147,7 @@
name = "box of shotgun slugs"
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
icon_state = "lethalshellshot_box"
item_state = "syringe_kit"
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
/obj/item/weapon/storage/box/shotgunammo/New()
..()
@@ -158,7 +158,7 @@
name = "box of shotgun shells"
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
icon_state = "lethalslug_box"
item_state = "syringe_kit"
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
/obj/item/weapon/storage/box/shotgunshells/New()
..()
@@ -169,7 +169,7 @@
name = "box of illumination shells"
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
icon_state = "illumshot_box"
item_state = "syringe_kit"
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
/obj/item/weapon/storage/box/flashshells/New()
..()
@@ -180,7 +180,7 @@
name = "box of stun shells"
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
icon_state = "stunshot_box"
item_state = "syringe_kit"
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
/obj/item/weapon/storage/box/stunshells/New()
..()
@@ -191,7 +191,7 @@
name = "box of practice shells"
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
icon_state = "blankshot_box"
item_state = "syringe_kit"
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
/obj/item/weapon/storage/box/practiceshells/New()
..()
@@ -224,7 +224,7 @@
/obj/item/weapon/storage/box/emps/New()
..()
for(var/i = 1 to 5)
for(var/i = 1 to 7)
new /obj/item/weapon/grenade/empgrenade(src)
/obj/item/weapon/storage/box/empslite
@@ -234,7 +234,7 @@
/obj/item/weapon/storage/box/empslite/New()
..()
for(var/i = 1 to 5)
for(var/i = 1 to 7)
new /obj/item/weapon/grenade/empgrenade/low_yield(src)
/obj/item/weapon/storage/box/smokes
@@ -249,22 +249,32 @@
/obj/item/weapon/storage/box/anti_photons
name = "box of anti-photon grenades"
desc = "A box containing 5 experimental photon disruption grenades."
desc = "A box containing 7 experimental photon disruption grenades."
icon_state = "flashbang"
/obj/item/weapon/storage/box/anti_photons/New()
..()
for(var/i = 1 to 5)
for(var/i = 1 to 7)
new /obj/item/weapon/grenade/anti_photon(src)
/obj/item/weapon/storage/box/frags
name = "box of fragmentation grenades (WARNING)"
desc = "A box containing 5 military grade fragmentation grenades.<br> WARNING: These devices are extremely dangerous and can cause limb loss or death in repeated use."
desc = "A box containing 7 military grade fragmentation grenades.<br> WARNING: These devices are extremely dangerous and can cause limb loss or death in repeated use."
icon_state = "frag"
/obj/item/weapon/storage/box/frags/New()
..()
for(var/i = 1 to 5)
for(var/i = 1 to 7)
new /obj/item/weapon/grenade/explosive(src)
/obj/item/weapon/storage/box/frags_half_box
name = "box of fragmentation grenades (WARNING)"
desc = "A box containing 4 military grade fragmentation grenades.<br> WARNING: These devices are extremely dangerous and can cause limb loss or death in repeated use."
icon_state = "frag"
/obj/item/weapon/storage/box/frags_half_box/New()
..()
for(var/i = 1 to 4)
new /obj/item/weapon/grenade/explosive(src)
/obj/item/weapon/storage/box/metalfoam
@@ -316,7 +326,7 @@
name = "death alarm kit"
desc = "Box of stuff used to implant death alarms."
icon_state = "implant"
item_state = "syringe_kit"
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
/obj/item/weapon/storage/box/cdeathalarm_kit/New()
..()
@@ -371,7 +381,7 @@
/obj/item/weapon/storage/box/monkeycubes/New()
..()
if(src.type == /obj/item/weapon/storage/box/monkeycubes)
if(type == /obj/item/weapon/storage/box/monkeycubes)
for(var/i = 1 to 4)
new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped(src)
@@ -468,7 +478,6 @@
desc = "A small box of 'Space-Proof' premium matches."
icon = 'icons/obj/cigarettes.dmi'
icon_state = "matchbox"
item_state = "zippo"
w_class = 1
slot_flags = SLOT_BELT
can_hold = list(/obj/item/weapon/flame/match)
@@ -502,7 +511,7 @@
icon = 'icons/obj/storage.dmi'
icon_state = "light"
desc = "This box is shaped on the inside so that only light tubes and bulbs fit."
item_state = "syringe_kit"
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
storage_slots=21
can_hold = list(/obj/item/weapon/light/tube, /obj/item/weapon/light/bulb)
max_storage_space = 42 //holds 21 items of w_class 2
@@ -538,13 +547,29 @@
desc = "This nifty shock-resistant device will keep your 'groceries' nice and non-spoiled."
icon = 'icons/obj/storage.dmi'
icon_state = "portafreezer"
item_state = "medicalpack"
item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack")
foldable = null
max_w_class = 3
can_hold = list(/obj/item/organ, /obj/item/weapon/reagent_containers/food, /obj/item/weapon/reagent_containers/glass)
max_storage_space = 21
use_to_pickup = 1 // for picking up broken bulbs, not that most people will try
/obj/item/weapon/storage/box/freezer/Entered(var/atom/movable/AM)
if(istype(AM, /obj/item/organ))
var/obj/item/organ/O = AM
O.preserved = 1
for(var/obj/item/organ/organ in O)
organ.preserved = 1
..()
/obj/item/weapon/storage/box/freezer/Exited(var/atom/movable/AM)
if(istype(AM, /obj/item/organ))
var/obj/item/organ/O = AM
O.preserved = 0
for(var/obj/item/organ/organ in O)
organ.preserved = 0
..()
/obj/item/weapon/storage/box/ambrosia
name = "ambrosia seeds box"
desc = "Contains the seeds you need to get a little high."
@@ -2,7 +2,6 @@
name = "briefcase"
desc = "It's made of AUTHENTIC faux-leather and has a price-tag still attached. Its owner must be a real professional."
icon_state = "briefcase"
item_state = "briefcase"
flags = CONDUCT
force = 8.0
throw_speed = 1
@@ -19,8 +19,8 @@
var/icon_type = "donut"
/obj/item/weapon/storage/fancy/update_icon(var/itemremoved = 0)
var/total_contents = src.contents.len - itemremoved
src.icon_state = "[src.icon_type]box[total_contents]"
var/total_contents = contents.len - itemremoved
icon_state = "[icon_type]box[total_contents]"
return
/obj/item/weapon/storage/fancy/examine(mob/user)
@@ -28,11 +28,11 @@
return
if(contents.len <= 0)
user << "There are no [src.icon_type]s left in the box."
user << "There are no [icon_type]s left in the box."
else if(contents.len == 1)
user << "There is one [src.icon_type] left in the box."
user << "There is one [icon_type] left in the box."
else
user << "There are [src.contents.len] [src.icon_type]s in the box."
user << "There are [contents.len] [icon_type]s in the box."
return
@@ -71,7 +71,6 @@
throwforce = 2
slot_flags = SLOT_BELT
/obj/item/weapon/storage/fancy/candle_box/New()
..()
for(var/i=1 to 5)
@@ -128,7 +127,7 @@
desc = "A ubiquitous brand of cigarettes, found in every major spacefaring corporation in the universe. As mild and flavorless as it gets."
icon = 'icons/obj/cigarettes.dmi'
icon_state = "cigpacket"
item_state = "cigpacket"
item_state_slots = list(slot_r_hand_str = "cigpacket", slot_l_hand_str = "cigpacket")
w_class = 1
throwforce = 2
slot_flags = SLOT_BELT
@@ -187,13 +186,11 @@
name = "\improper DromedaryCo packet"
desc = "A packet of six imported DromedaryCo cancer sticks. A label on the packaging reads, \"Wouldn't a slow death make a change?\""
icon_state = "Dpacket"
item_state = "Dpacket"
/obj/item/weapon/storage/fancy/cigarettes/killthroat
name = "\improper AcmeCo packet"
desc = "A packet of six AcmeCo cigarettes. For those who somehow want to obtain the record for the most amount of cancerous tumors."
icon_state = "Bpacket"
item_state = "Bpacket" //Doesn't have an inhand state, but neither does dromedary, so, ya know..
New()
..()
@@ -205,37 +202,31 @@
name = "\improper pack of Lucky Stars"
desc = "A mellow blend made from synthetic, pod-grown tobacco. The commercial jingle is guaranteed to get stuck in your head."
icon_state = "LSpacket"
item_state = "Dpacket" //I actually don't mind cig packs not showing up in the hand. whotf doesn't just keep them in their pockets/coats //
/obj/item/weapon/storage/fancy/cigarettes/jerichos
name = "\improper pack of Jerichos"
desc = "Typically seen dangling from the lips of Martian soldiers and border world hustlers. Tastes like hickory smoke, feels like warm liquid death down your lungs."
icon_state = "Jpacket"
item_state = "Dpacket"
/obj/item/weapon/storage/fancy/cigarettes/menthols
name = "\improper pack of Temperamento Menthols"
desc = "With a sharp and natural organic menthol flavor, these Temperamentos are a favorite of NDV crews. Hardly anyone knows they make 'em in non-menthol!"
icon_state = "TMpacket"
item_state = "Dpacket"
/obj/item/weapon/storage/fancy/cigarettes/carcinomas
name = "\improper pack of Carcinoma Angels"
desc = "This unknown brand was slated for the chopping block, until they were publicly endorsed by an old Earthling gonzo journalist. The rest is history. They sell a variety for cats, too."
icon_state = "CApacket"
item_state = "Dpacket"
/obj/item/weapon/storage/fancy/cigarettes/professionals
name = "\improper pack of Professional 120s"
desc = "Let's face it - if you're smoking these, you're either trying to look upper-class or you're 80 years old. That's the only excuse. They taste disgusting, too."
icon_state = "P100packet"
item_state = "Dpacket"
/obj/item/weapon/storage/fancy/cigar
name = "cigar case"
desc = "A case for holding your cigars when you are not smoking them."
icon_state = "cigarcase"
item_state = "cigarcase"
icon = 'icons/obj/cigarettes.dmi'
w_class = 1
throwforce = 2
@@ -273,7 +264,6 @@
storage_slots = 6
can_hold = list(/obj/item/weapon/reagent_containers/glass/beaker/vial)
/obj/item/weapon/storage/fancy/vials/New()
..()
for(var/i=1 to 6)
@@ -285,7 +275,7 @@
desc = "A locked box for keeping things away from children."
icon = 'icons/obj/vialbox.dmi'
icon_state = "vialbox0"
item_state = "syringe_kit"
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
max_w_class = 2
can_hold = list(/obj/item/weapon/reagent_containers/glass/beaker/vial)
max_storage_space = 12 //The sum of the w_classes of all the items in this storage item.
@@ -297,9 +287,9 @@
update_icon()
/obj/item/weapon/storage/lockbox/vials/update_icon(var/itemremoved = 0)
var/total_contents = src.contents.len - itemremoved
src.icon_state = "vialbox[total_contents]"
src.overlays.Cut()
var/total_contents = contents.len - itemremoved
icon_state = "vialbox[total_contents]"
overlays.Cut()
if (!broken)
overlays += image(icon, src, "led[locked]")
if(locked)
@@ -21,7 +21,7 @@
name = "fire first-aid kit"
desc = "It's an emergency medical kit for when the toxins lab <i>-spontaneously-</i> burns down."
icon_state = "ointment"
item_state = "firstaid-ointment"
item_state_slots = list(slot_r_hand_str = "firstaid-ointment", slot_l_hand_str = "firstaid-ointment")
New()
..()
@@ -58,7 +58,7 @@
name = "toxin first aid"
desc = "Used to treat when you have a high amoutn of toxins in your body."
icon_state = "antitoxin"
item_state = "firstaid-toxin"
item_state_slots = list(slot_r_hand_str = "firstaid-toxin", slot_l_hand_str = "firstaid-toxin")
New()
..()
@@ -79,7 +79,7 @@
name = "oxygen deprivation first aid"
desc = "A box full of oxygen goodies."
icon_state = "o2"
item_state = "firstaid-o2"
item_state_slots = list(slot_r_hand_str = "firstaid-o2", slot_l_hand_str = "firstaid-o2")
New()
..()
@@ -97,7 +97,7 @@
name = "advanced first-aid kit"
desc = "Contains advanced medical treatments."
icon_state = "advfirstaid"
item_state = "firstaid-advanced"
item_state_slots = list(slot_r_hand_str = "firstaid-advanced", slot_l_hand_str = "firstaid-advanced")
/obj/item/weapon/storage/firstaid/adv/New()
..()
@@ -115,7 +115,7 @@
name = "combat medical kit"
desc = "Contains advanced medical treatments."
icon_state = "bezerk"
item_state = "firstaid-advanced"
item_state_slots = list(slot_r_hand_str = "firstaid-advanced", slot_l_hand_str = "firstaid-advanced")
/obj/item/weapon/storage/firstaid/combat/New()
..()
@@ -158,7 +158,7 @@
desc = "It's an airtight container for storing medication."
icon_state = "pill_canister"
icon = 'icons/obj/chemical.dmi'
item_state = "contsolid"
item_state_slots = list(slot_r_hand_str = "contsolid", slot_l_hand_str = "contsolid")
w_class = 2.0
can_hold = list(/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/dice,/obj/item/weapon/paper)
allow_quick_gather = 1
@@ -7,7 +7,7 @@
name = "laundry basket"
icon = 'icons/obj/janitor.dmi'
icon_state = "laundry-empty"
item_state = "laundry"
item_state_slots = list(slot_r_hand_str = "laundry", slot_l_hand_str = "laundry")
desc = "The peak of thousands of years of laundry evolution."
w_class = 5
@@ -4,7 +4,7 @@
name = "lockbox"
desc = "A locked box."
icon_state = "lockbox+l"
item_state = "syringe_kit"
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
w_class = 4
max_w_class = 3
max_storage_space = 14 //The sum of the w_classes of all the items in this storage item.
@@ -1,11 +1,29 @@
/obj/item/weapon/storage/pill_bottle/dice
name = "pack of dice"
desc = "It's a small container with dice inside."
/obj/item/weapon/storage/pill_bottle/dice //7d6
name = "bag of dice"
desc = "It's a small bag with dice inside."
icon = 'icons/obj/dice.dmi'
icon_state = "dicebag"
New()
..()
/obj/item/weapon/storage/pill_bottle/dice/New()
..()
for(var/i = 1 to 7)
new /obj/item/weapon/dice( src )
new /obj/item/weapon/dice/d20( src )
/obj/item/weapon/storage/pill_bottle/dice_nerd //DnD dice
name = "bag of gaming dice"
desc = "It's a small bag with gaming dice inside."
icon = 'icons/obj/dice.dmi'
icon_state = "magicdicebag"
/obj/item/weapon/storage/pill_bottle/dice_nerd/New()
..()
new /obj/item/weapon/dice/d4( src )
new /obj/item/weapon/dice( src )
new /obj/item/weapon/dice/d8( src )
new /obj/item/weapon/dice/d10( src )
new /obj/item/weapon/dice/d12( src )
new /obj/item/weapon/dice/d20( src )
new /obj/item/weapon/dice/d100( src )
/*
* Donut Box
@@ -144,7 +144,7 @@
name = "secure briefcase"
icon = 'icons/obj/storage.dmi'
icon_state = "secure"
item_state = "sec-case"
item_state_slots = list(slot_r_hand_str = "case", slot_l_hand_str = "case")
desc = "A large briefcase with a digital locking system."
force = 8.0
throw_speed = 1
@@ -8,6 +8,10 @@
/obj/item/weapon/storage
name = "storage"
icon = 'icons/obj/storage.dmi'
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_storage.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_storage.dmi',
)
w_class = 3
show_messages = 1
@@ -348,7 +352,7 @@
if(usr)
usr.remove_from_mob(W)
usr.update_icons() //update our overlays
W.loc = src
W.forceMove(src)
W.on_enter_storage(src)
if(usr)
if (usr.client && usr.s_active != src)
@@ -391,9 +395,9 @@
W.layer = 20
else
W.layer = initial(W.layer)
W.loc = new_location
W.forceMove(new_location)
else
W.loc = get_turf(src)
W.forceMove(get_turf(src))
if(usr)
src.orient2hud(usr)
@@ -437,7 +441,7 @@
user << "<span class='warning'>The tray won't fit in [src].</span>"
return
else
W.loc = user.loc
W.forceMove(get_turf(user))
if ((user.client && user.s_active != src))
user.client.screen -= W
W.dropped(user)
@@ -3,7 +3,7 @@
desc = "Danger. Very robust."
icon = 'icons/obj/storage.dmi'
icon_state = "red"
item_state = "toolbox_red"
item_state_slots = list(slot_r_hand_str = "toolbox_red", slot_l_hand_str = "toolbox_red")
flags = CONDUCT
force = 10
throwforce = 10
@@ -18,7 +18,7 @@
/obj/item/weapon/storage/toolbox/emergency
name = "emergency toolbox"
icon_state = "red"
item_state = "toolbox_red"
item_state_slots = list(slot_r_hand_str = "toolbox_red", slot_l_hand_str = "toolbox_red")
/obj/item/weapon/storage/toolbox/emergency/New()
..()
@@ -33,7 +33,7 @@
/obj/item/weapon/storage/toolbox/mechanical
name = "mechanical toolbox"
icon_state = "blue"
item_state = "toolbox_blue"
item_state_slots = list(slot_r_hand_str = "toolbox_blue", slot_l_hand_str = "toolbox_blue")
/obj/item/weapon/storage/toolbox/mechanical/New()
..()
@@ -47,7 +47,7 @@
/obj/item/weapon/storage/toolbox/electrical
name = "electrical toolbox"
icon_state = "yellow"
item_state = "toolbox_yellow"
item_state_slots = list(slot_r_hand_str = "toolbox_yellow", slot_l_hand_str = "toolbox_yellow")
/obj/item/weapon/storage/toolbox/electrical/New()
..()
@@ -65,7 +65,7 @@
/obj/item/weapon/storage/toolbox/syndicate
name = "black and red toolbox"
icon_state = "syndicate"
item_state = "toolbox_syndi"
item_state_slots = list(slot_r_hand_str = "toolbox_syndi", slot_l_hand_str = "toolbox_syndi")
origin_tech = list(TECH_COMBAT = 1, TECH_ILLEGAL = 1)
force = 14
@@ -83,7 +83,7 @@
max_storage_space = 8 //slightly smaller than a toolbox
name = "rainbow lunchbox"
icon_state = "lunchbox_rainbow"
item_state = "toolbox_pink"
item_state_slots = list(slot_r_hand_str = "toolbox_pink", slot_l_hand_str = "toolbox_pink")
desc = "A little lunchbox. This one is the colors of the rainbow!"
w_class = 3
max_w_class = 2
@@ -111,7 +111,7 @@
/obj/item/weapon/storage/toolbox/lunchbox/heart
name = "heart lunchbox"
icon_state = "lunchbox_lovelyhearts"
item_state = "toolbox_pink"
item_state_slots = list(slot_r_hand_str = "toolbox_pink", slot_l_hand_str = "toolbox_pink")
desc = "A little lunchbox. This one has cute little hearts on it!"
/obj/item/weapon/storage/toolbox/lunchbox/heart/filled
@@ -120,7 +120,7 @@
/obj/item/weapon/storage/toolbox/lunchbox/cat
name = "cat lunchbox"
icon_state = "lunchbox_sciencecatshow"
item_state = "toolbox_green"
item_state_slots = list(slot_r_hand_str = "toolbox_green", slot_l_hand_str = "toolbox_green")
desc = "A little lunchbox. This one has a cute little science cat from a popular show on it!"
/obj/item/weapon/storage/toolbox/lunchbox/cat/filled
@@ -129,7 +129,7 @@
/obj/item/weapon/storage/toolbox/lunchbox/nt
name = "Nanotrasen brand lunchbox"
icon_state = "lunchbox_nanotrasen"
item_state = "toolbox_blue"
item_state_slots = list(slot_r_hand_str = "toolbox_blue", slot_l_hand_str = "toolbox_blue")
desc = "A little lunchbox. This one is branded with the Nanotrasen logo!"
/obj/item/weapon/storage/toolbox/lunchbox/nt/filled
@@ -138,7 +138,7 @@
/obj/item/weapon/storage/toolbox/lunchbox/mars
name = "\improper Mojave university lunchbox"
icon_state = "lunchbox_marsuniversity"
item_state = "toolbox_red"
item_state_slots = list(slot_r_hand_str = "toolbox_red", slot_l_hand_str = "toolbox_red")
desc = "A little lunchbox. This one is branded with the Mojave university logo!"
/obj/item/weapon/storage/toolbox/lunchbox/mars/filled
@@ -147,7 +147,7 @@
/obj/item/weapon/storage/toolbox/lunchbox/cti
name = "\improper CTI lunchbox"
icon_state = "lunchbox_cti"
item_state = "toolbox_blue"
item_state_slots = list(slot_r_hand_str = "toolbox_blue", slot_l_hand_str = "toolbox_blue")
desc = "A little lunchbox. This one is branded with the CTI logo!"
/obj/item/weapon/storage/toolbox/lunchbox/cti/filled
@@ -156,7 +156,7 @@
/obj/item/weapon/storage/toolbox/lunchbox/nymph
name = "\improper Diona nymph lunchbox"
icon_state = "lunchbox_dionanymph"
item_state = "toolbox_yellow"
item_state_slots = list(slot_r_hand_str = "toolbox_yellow", slot_l_hand_str = "toolbox_yellow")
desc = "A little lunchbox. This one is an adorable Diona nymph on the side!"
/obj/item/weapon/storage/toolbox/lunchbox/nymph/filled
@@ -165,7 +165,7 @@
/obj/item/weapon/storage/toolbox/lunchbox/syndicate
name = "black and red lunchbox"
icon_state = "lunchbox_syndie"
item_state = "toolbox_syndi"
item_state_slots = list(slot_r_hand_str = "toolbox_syndi", slot_l_hand_str = "toolbox_syndi")
desc = "A little lunchbox. This one is a sleek black and red, made of a durable steel!"
/obj/item/weapon/storage/toolbox/lunchbox/syndicate/filled
@@ -265,4 +265,19 @@
new /obj/item/clothing/suit/armor/combat(src)
new /obj/item/clothing/gloves/arm_guard/combat(src)
new /obj/item/clothing/shoes/leg_guard/combat(src)
return
return
/obj/item/weapon/storage/box/syndie_kit/demolitions/New()
..()
new /obj/item/weapon/syndie/c4explosive(src)
new /obj/item/weapon/screwdriver(src)
/obj/item/weapon/storage/box/syndie_kit/demolitions_heavy/New()
..()
new /obj/item/weapon/syndie/c4explosive/heavy(src)
new /obj/item/weapon/screwdriver(src)
/obj/item/weapon/storage/box/syndie_kit/demolitions_super_heavy/New()
..()
new /obj/item/weapon/syndie/c4explosive/heavy/super_heavy(src)
new /obj/item/weapon/screwdriver(src)
+10 -10
View File
@@ -35,13 +35,14 @@
return
/obj/item/weapon/melee/baton/proc/deductcharge(var/chrgdeductamt)
if(bcell)
if(bcell.checked_use(chrgdeductamt))
return 1
else
status = 0
update_icon()
return 0
if(status == 1) //Only deducts charge when it's on
if(bcell)
if(bcell.checked_use(chrgdeductamt))
return 1
else
status = 0
update_icon()
return 0
return null
/obj/item/weapon/melee/baton/update_icon()
@@ -109,6 +110,7 @@
user.Weaken(30)
deductcharge(hitcost)
return
deductcharge(hitcost)
return ..()
/obj/item/weapon/melee/baton/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
@@ -122,7 +124,7 @@
var/mob/living/carbon/human/H = target
affecting = H.get_organ(hit_zone)
if(user.a_intent == I_HURT)
if(user.a_intent == I_HURT || user.a_intent == I_DISARM)
. = ..()
//whacking someone causes a much poorer electrical contact than deliberately prodding them.
agony *= 0.5
@@ -144,8 +146,6 @@
target.stun_effect_act(stun, agony, hit_zone, src)
msg_admin_attack("[key_name(user)] stunned [key_name(target)] with the [src].")
deductcharge(hitcost)
if(ishuman(target))
var/mob/living/carbon/human/H = target
H.forcesay(hit_appends)
@@ -2,9 +2,10 @@
* Contains:
* Sword
* Classic Baton
* Telescopic Baton
*/
/*
/*
* Classic Baton
*/
/obj/item/weapon/melee/classic_baton
@@ -34,7 +35,6 @@
desc = "A compact yet rebalanced personal defense weapon. Can be concealed when folded."
icon = 'icons/obj/weapons.dmi'
icon_state = "telebaton0"
item_state = "telebaton0"
slot_flags = SLOT_BELT
w_class = 2
force = 3
@@ -48,7 +48,6 @@
"<span class='warning'>You extend the baton.</span>",\
"You hear an ominous click.")
icon_state = "telebaton1"
item_state = "telebaton1"
w_class = 3
force = 15//quite robust
attack_verb = list("smacked", "struck", "slapped")
@@ -57,7 +56,6 @@
"<span class='notice'>You collapse the baton.</span>",\
"You hear a click.")
icon_state = "telebaton0"
item_state = "telebaton0"
w_class = 2
force = 3//not so robust now
attack_verb = list("hit", "punched")
+52 -44
View File
@@ -8,7 +8,7 @@
/obj/item/weapon/syndie/c4explosive
icon_state = "c-4small_0"
item_state = "c-4small"
item_state = "radio"
name = "normal-sized package"
desc = "A small wrapped package."
w_class = 3
@@ -18,67 +18,75 @@
/obj/item/weapon/syndie/c4explosive/heavy
icon_state = "c-4large_0"
item_state = "c-4large"
item_state = "radio"
desc = "A mysterious package, it's quite heavy."
power = 2
size = "large"
/obj/item/weapon/syndie/c4explosive/heavy/super_heavy
name = "large-sized package"
desc = "A mysterious package, it's quite exceptionally heavy."
power = 3
/obj/item/weapon/syndie/c4explosive/New()
var/K = rand(1,2000)
K = md5(num2text(K)+name)
K = copytext(K,1,7)
src.desc += "\n You see [K] engraved on \the [src]."
var/obj/item/weapon/syndie/c4detonator/detonator = new(src.loc)
detonator.desc += "\n You see [K] engraved on the lighter."
desc += "\n You see [K] engraved on \the [src]."
var/obj/item/weapon/flame/lighter/zippo/c4detonator/detonator = new(src.loc)
detonator.desc += " You see [K] engraved on the lighter."
detonator.bomb = src
/obj/item/weapon/syndie/c4explosive/proc/detonate()
icon_state = "c-4[size]_1"
spawn(50)
explosion(get_turf(src), power, power*2, power*3, power*4, power*4)
for(var/dirn in cardinal) //This is to guarantee that C4 at least breaks down all immediately adjacent walls and doors.
var/turf/simulated/wall/T = get_step(src,dirn)
if(locate(/obj/machinery/door/airlock) in T)
var/obj/machinery/door/airlock/D = locate() in T
if(D.density)
D.open()
if(istype(T,/turf/simulated/wall))
T.dismantle_wall(1)
qdel(src)
explosion(get_turf(src), power, power*2, power*3, power*4, power*5)
for(var/dirn in cardinal) //This is to guarantee that C4 at least breaks down all immediately adjacent walls and doors.
var/turf/simulated/wall/T = get_step(src,dirn)
if(locate(/obj/machinery/door/airlock) in T)
var/obj/machinery/door/airlock/D = locate() in T
if(D.density)
D.open()
if(istype(T,/turf/simulated/wall))
T.dismantle_wall(1)
qdel(src)
/*Detonator, disguised as a lighter*/
/*Click it when closed to open, when open to bring up a prompt asking you if you want to close it or press the button.*/
/obj/item/weapon/syndie/c4detonator
icon_state = "c-4detonator_0"
item_state = "c-4detonator"
name = "\improper Zippo lighter" /*Sneaky, thanks Dreyfus.*/
desc = "The zippo."
w_class = 1
/obj/item/weapon/flame/lighter/zippo/c4detonator
var/detonator_mode = 0
var/obj/item/weapon/syndie/c4explosive/bomb
var/pr_open = 0 /*Is the "What do you want to do?" prompt open?*/
/obj/item/weapon/syndie/c4detonator/attack_self(mob/user as mob)
switch(src.icon_state)
if("c-4detonator_0")
src.icon_state = "c-4detonator_1"
user << "You flick open the lighter."
/obj/item/weapon/flame/lighter/zippo/c4detonator/attack_self(mob/user as mob)
if(!detonator_mode)
..()
if("c-4detonator_1")
if(!pr_open)
pr_open = 1
switch(alert(user, "What would you like to do?", "Lighter", "Press the button.", "Close the lighter."))
if("Press the button.")
user << "<span class='warning'>You press the button.</span>"
flick("c-4detonator_click", src)
if(src.bomb)
src.bomb.detonate()
log_admin("[key_name(user)] has triggered [src.bomb] with [src].")
message_admins("<span class='danger'>[key_name_admin(user)] has triggered [src.bomb] with [src].</span>")
else if(!lit)
base_state = icon_state
lit = 1
icon_state = "[base_state]1"
//item_state = "[base_state]on"
user.visible_message("<span class='rose'>Without even breaking stride, \the [user] flips open \the [src] in one smooth movement.</span>")
if("Close the lighter.")
src.icon_state = "c-4detonator_0"
user << "You close the lighter."
pr_open = 0
else if(lit && detonator_mode)
switch(alert(user, "What would you like to do?", "Lighter", "Press the button.", "Close the lighter."))
if("Press the button.")
user << "<span class='warning'>You press the button.</span>"
icon_state = "[base_state]click"
if(src.bomb)
src.bomb.detonate()
log_admin("[key_name(user)] has triggered [src.bomb] with [src].")
message_admins("<span class='danger'>[key_name_admin(user)] has triggered [src.bomb] with [src].</span>")
if("Close the lighter.")
lit = 0
icon_state = "[base_state]"
//item_state = "[base_state]"
user.visible_message("<span class='rose'>You hear a quiet click, as \the [user] shuts off \the [src] without even looking at what they're doing.</span>")
/obj/item/weapon/flame/lighter/zippo/c4detonator/attackby(obj/item/weapon/W, mob/user as mob)
if(istype(W, /obj/item/weapon/screwdriver))
detonator_mode = !detonator_mode
user << "<span class='notice'>You unscrew the top panel of \the [src] revealing a button.</span>"
@@ -6,7 +6,11 @@
icon_state = "jetpack"
gauge_icon = null
w_class = 4.0
item_state = "jetpack"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_storage.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_storage.dmi',
)
item_state_slots = list(slot_r_hand_str = "jetpack", slot_l_hand_str = "jetpack")
distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
var/datum/effect/effect/system/ion_trail_follow/ion_trail
var/on = 0.0
@@ -16,8 +20,8 @@
/obj/item/weapon/tank/jetpack/New()
..()
src.ion_trail = new /datum/effect/effect/system/ion_trail_follow()
src.ion_trail.set_up(src)
ion_trail = new /datum/effect/effect/system/ion_trail_follow()
ion_trail.set_up(src)
/obj/item/weapon/tank/jetpack/Destroy()
qdel(ion_trail)
@@ -32,7 +36,7 @@
/obj/item/weapon/tank/jetpack/verb/toggle_rockets()
set name = "Toggle Jetpack Stabilization"
set category = "Object"
src.stabilization_on = !( src.stabilization_on )
stabilization_on = !( stabilization_on )
usr << "You toggle the stabilization [stabilization_on? "on":"off"]."
/obj/item/weapon/tank/jetpack/verb/toggle()
@@ -55,13 +59,13 @@
usr << "You toggle the thrusters [on? "on":"off"]."
/obj/item/weapon/tank/jetpack/proc/allow_thrust(num, mob/living/user as mob)
if(!(src.on))
if(!on)
return 0
if((num < 0.005 || src.air_contents.total_moles < num))
src.ion_trail.stop()
if((num < 0.005 || air_contents.total_moles < num))
ion_trail.stop()
return 0
var/datum/gas_mixture/G = src.air_contents.remove(num)
var/datum/gas_mixture/G = air_contents.remove(num)
var/allgases = G.gas["carbon_dioxide"] + G.gas["nitrogen"] + G.gas["oxygen"] + G.gas["phoron"]
if(allgases >= 0.005)
@@ -73,12 +77,11 @@
/obj/item/weapon/tank/jetpack/ui_action_click()
toggle()
/obj/item/weapon/tank/jetpack/void
name = "void jetpack (oxygen)"
desc = "It works well in a void."
icon_state = "jetpack-void"
item_state = "jetpack-void"
item_state_slots = list(slot_r_hand_str = "jetpack-void", slot_l_hand_str = "jetpack-void")
/obj/item/weapon/tank/jetpack/void/New()
..()
@@ -89,7 +92,7 @@
name = "jetpack (oxygen)"
desc = "A tank of compressed oxygen for use as propulsion in zero-gravity areas. Use with caution."
icon_state = "jetpack"
item_state = "jetpack"
item_state_slots = list(slot_r_hand_str = "jetpack", slot_l_hand_str = "jetpack")
/obj/item/weapon/tank/jetpack/oxygen/New()
..()
@@ -101,7 +104,7 @@
desc = "A tank of compressed carbon dioxide for use as propulsion in zero-gravity areas. Painted black to indicate that it should not be used as a source for internals."
distribute_pressure = 0
icon_state = "jetpack-black"
item_state = "jetpack-black"
item_state_slots = list(slot_r_hand_str = "jetpack-black", slot_l_hand_str = "jetpack-black")
/obj/item/weapon/tank/jetpack/carbondioxide/New()
..()
@@ -16,19 +16,16 @@
icon_state = "oxygen"
distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
New()
..()
air_contents.adjust_gas("oxygen", (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
return
examine(mob/user)
if(..(user, 0) && air_contents.gas["oxygen"] < 10)
user << text("<span class='warning'>The meter on \the [src] indicates you are almost out of oxygen!</span>")
//playsound(usr, 'sound/effects/alert.ogg', 50, 1)
/obj/item/weapon/tank/oxygen/yellow
desc = "A tank of oxygen, this one is yellow."
icon_state = "oxygen_f"
@@ -37,7 +34,6 @@
desc = "A tank of oxygen, this one is red."
icon_state = "oxygen_fr"
/*
* Anesthetic
*/
@@ -45,7 +41,6 @@
name = "anesthetic tank"
desc = "A tank with an N2O/O2 gas mix."
icon_state = "anesthetic"
item_state = "an_tank"
/obj/item/weapon/tank/anesthetic/New()
..()
@@ -64,7 +59,6 @@
desc = "Mixed anyone?"
icon_state = "oxygen"
examine(mob/user)
if(..(user, 0) && air_contents.gas["oxygen"] < 1 && loc==user)
user << "<span class='danger'>The meter on the [src.name] indicates you are almost out of air!</span>"
@@ -76,8 +70,7 @@
src.air_contents.adjust_multi("oxygen", (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD, "nitrogen", (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD)
return
/*
* Phoron
*/
@@ -89,7 +82,6 @@
flags = CONDUCT
slot_flags = null //they have no straps!
/obj/item/weapon/tank/phoron/New()
..()
@@ -124,14 +116,12 @@
distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
volume = 2 //Tiny. Real life equivalents only have 21 breaths of oxygen in them. They're EMERGENCY tanks anyway -errorage (dangercon 2011)
New()
..()
src.air_contents.adjust_gas("oxygen", (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
return
examine(mob/user)
if(..(user, 0) && air_contents.gas["oxygen"] < 0.2 && loc==user)
user << text("<span class='danger'>The meter on the [src.name] indicates you are almost out of air!</span>")
@@ -157,7 +147,6 @@
icon_state = "oxygen_fr"
distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
/obj/item/weapon/tank/nitrogen/New()
..()
@@ -167,4 +156,4 @@
/obj/item/weapon/tank/nitrogen/examine(mob/user)
if(..(user, 0) && air_contents.gas["nitrogen"] < 10)
user << text("<span class='danger'>The meter on \the [src] indicates you are almost out of nitrogen!</span>")
//playsound(user, 'sound/effects/alert.ogg', 50, 1)
//playsound(user, 'sound/effects/alert.ogg', 50, 1)
+2
View File
@@ -32,6 +32,7 @@
user.visible_message("<span class='danger'>\The [user] has taped up \the [H]'s eyes!</span>")
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/blindfold/tape(H), slot_glasses)
H.update_inv_glasses()
else if(user.zone_sel.selecting == O_MOUTH || user.zone_sel.selecting == BP_HEAD)
if(!H.organs_by_name[BP_HEAD])
@@ -58,6 +59,7 @@
user.visible_message("<span class='danger'>\The [user] has taped up \the [H]'s mouth!</span>")
H.equip_to_slot_or_del(new /obj/item/clothing/mask/muzzle/tape(H), slot_wear_mask)
H.update_inv_wear_mask()
else if(user.zone_sel.selecting == "r_hand" || user.zone_sel.selecting == "l_hand")
var/obj/item/weapon/handcuffs/cable/tape/T = new(user)
+1
View File
@@ -413,6 +413,7 @@
slot_flags = SLOT_BELT
force = 6
throwforce = 7
pry = 1
item_state = "crowbar"
w_class = 2
origin_tech = list(TECH_ENGINEERING = 1)
@@ -12,3 +12,7 @@
/obj/item/weapon/towel/attack_self(mob/living/user as mob)
user.visible_message(text("<span class='notice'>[] uses [] to towel themselves off.</span>", user, src))
playsound(user, 'sound/weapons/towelwipe.ogg', 25, 1)
/obj/item/weapon/towel/random/New()
..()
color = "#"+get_random_colour()
@@ -1,4 +1,3 @@
/obj/item/weapon/nullrod
name = "null rod"
desc = "A rod of pure obsidian, its very presence disrupts and dampens the powers of paranormal phenomenae."