diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 31a72c2a65c..fe46f4e01b3 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -398,6 +398,13 @@ var/list/uplink_items = list() cost = 5 excludefrom = list(/datum/game_mode/traitor/double_agents) +/datum/uplink_item/device_tools/rad_laser + name = "Radioactive Microlaser" + desc = "A radioactive microlaser disguised as a standard Nanotrasen health analyzer. When used, it emits a powerful burst of radiation, which, after a short delay, can incapitate all but the most protected of humanoids. \ + It has two settings: intensity, which controls the power of the radiation, and wavelength, which controls how long the radiation delay is." + item = /obj/item/device/rad_laser + cost = 4 + /datum/uplink_item/device_tools/syndicate_detonator name = "Syndicate Detonator" desc = "The Syndicate Detonator is a companion device to the Syndicate Bomb. Simply press the included button and an encrypted radio frequency will instruct all live syndicate bombs to detonate. \ diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 31a6bcab760..83c900bee2f 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -87,21 +87,21 @@ if(1.0) for(var/atom/movable/A in src) A.loc = loc - ex_act(severity) + A.ex_act(severity) qdel(src) return if(2.0) if(prob(50)) for(var/atom/movable/A in src) A.loc = loc - ex_act(severity) + A.ex_act(severity) qdel(src) return if(3.0) if(prob(25)) for(var/atom/movable/A in src) A.loc = loc - ex_act(severity) + A.ex_act(severity) qdel(src) @@ -131,11 +131,6 @@ ..() open_machine() -/obj/machinery/sleeper/Destroy() - var/turf/T = loc - T.contents += contents - ..() - /obj/machinery/sleeper/attack_hand(mob/user) if(..()) return diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 2f5cb7d54b6..f5612c6aef8 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -116,6 +116,8 @@ Class Procs: /obj/machinery/Destroy() machines.Remove(src) + if(occupant) + open_machine() ..() /obj/machinery/process()//If you dont use process or power why are you here diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 695fd3105aa..eb5a33d17d3 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -4,6 +4,7 @@ Miscellaneous traitor devices BATTERER +RADIOACTIVE MICROLASER */ @@ -56,6 +57,90 @@ effective or pretty fucking useless. if(times_used >= max_uses) icon_state = "battererburnt" +/* + The radioactive microlaser, a device disguised as a health analyzer used to irradiate people. + The strength of the radiation is determined by the 'intensity' setting, while the delay between + the scan and the irradiation kicking in is determined by the wavelength. + Each scan will cause the microlaser to have a brief cooldown period. Higher intensity will increase + the cooldown, while higher wavelength will decrease it. + Wavelength is also slightly increased by the intensity as well. +*/ + +/obj/item/device/rad_laser + name = "health analyzer" + icon_state = "health" + item_state = "analyzer" + desc = "A hand-held body scanner able to distinguish vital signs of the subject. A strange microlaser is hooked on to the scanning end." + flags = CONDUCT + slot_flags = SLOT_BELT + throwforce = 3 + w_class = 1.0 + throw_speed = 3 + throw_range = 7 + m_amt = 400 + origin_tech = "magnets=3;biotech=5;syndicate=3" + var/intensity = 5 // how much damage the radiation does + var/wavelength = 10 // time it takes for the radiation to kick in, in seconds + var/used = 0 // is it cooling down? + +/obj/item/device/rad_laser/attack(mob/living/M as mob, mob/living/user as mob) + if(!used) + ..() + user.visible_message(text("[] has analyzed []'s vitals.", user, M)) + var/cooldown = round(max(100,(((intensity*8)-(wavelength/2))+(intensity*2))*10)) + used = 1 + icon_state = "health1" + handle_cooldown(cooldown) // splits off to handle the cooldown while handling wavelength + spawn((wavelength+(intensity*4))*10) + if(M) + if(intensity >= 5) + M.apply_effect(round(intensity/1.5), PARALYZE) + M.apply_effect(intensity*10, IRRADIATE) + else + user << "The radioactive microlaser is still recharging." + +/obj/item/device/rad_laser/proc/handle_cooldown(var/cooldown) + spawn(cooldown) + used = 0 + icon_state = "health" + +/obj/item/device/rad_laser/attack_self(mob/user as mob) + ..() + interact(user) + +/obj/item/device/rad_laser/interact(mob/user as mob) + user.set_machine(src) + + var/cooldown = round(max(10,((intensity*8)-(wavelength/2))+(intensity*2))) + var/dat = {" + Radiation Intensity: -- [intensity] ++
+ Radiation Wavelength: -- [(wavelength+(intensity*4))] ++
+ Laser Cooldown: [cooldown] Seconds
+ "} + + var/datum/browser/popup = new(user, "radlaser", "Radioactive Microlaser Interface", 400, 240) + popup.set_content(dat) + popup.open() + +/obj/item/device/rad_laser/Topic(href, href_list) + if(!usr.canUseTopic(src)) + return 1 + + usr.set_machine(src) + + if(href_list["radint"]) + var/amount = text2num(href_list["radint"]) + amount += intensity + intensity = max(1,(min(10,amount))) + + else if(href_list["radwav"]) + var/amount = text2num(href_list["radwav"]) + amount += wavelength + wavelength = max(1,(min(120,amount))) + + updateUsrDialog() + add_fingerprint(usr) + return \ No newline at end of file diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 79ccd28eec3..b22febb5900 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -521,6 +521,8 @@ if(istype(mover) && mover.checkpass(PASSTABLE)) return 1 + if(locate(/obj/structure/table) in get_turf(mover)) + return 1 else return 0 @@ -559,16 +561,16 @@ if (istype(I, /obj/item/weapon/wrench)) table_destroy(2, user) return - + if (istype(I, /obj/item/weapon/storage/bag/tray)) var/obj/item/weapon/storage/bag/tray/T = I if(T.contents.len > 0) // If the tray isn't empty var/list/obj/item/oldContents = T.contents.Copy() T.quick_empty() - + for(var/obj/item/C in oldContents) C.loc = src.loc - + user.visible_message("[user] empties [I] on [src].") return // If the tray IS empty, continue on (tray will be placed on the table like other items) diff --git a/config/admins.txt b/config/admins.txt index c367783a872..e8a1826da82 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -59,4 +59,5 @@ hornygranny = Game Master yota = Game Master firecage = Game Master donkieyo = Game Master -argoneus = Game Master \ No newline at end of file +argoneus = Game Master +paprka = Game Master \ No newline at end of file diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 1e3090a1c63..db879f05ce4 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ