"
- html += "| Severity | Name | Ends At | Ends In | Stop |
"
+ html += "| Severity | Name | Ends At | Ends In | Stop |
"
for(var/datum/event/E in active_events)
if(!E.event_meta)
continue
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index c1fdb193485..66c19bfcda0 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -238,8 +238,6 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
onclose(user, "library")
/obj/machinery/librarycomp/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (src.density && istype(W, /obj/item/weapon/card/emag))
- src.emagged = 1
if(istype(W, /obj/item/weapon/barcodescanner))
var/obj/item/weapon/barcodescanner/scanner = W
scanner.computer = src
@@ -248,6 +246,10 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
V.show_message("[src] lets out a low, short blip.", 2)
else
..()
+
+/obj/machinery/librarycomp/emag_act(user as mob)
+ if (src.density)
+ src.emagged = 1
/obj/machinery/librarycomp/Topic(href, href_list)
if(..())
diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm
index 0e0889bc637..ed588a76482 100644
--- a/code/modules/mining/laborcamp/laborstacker.dm
+++ b/code/modules/mining/laborcamp/laborstacker.dm
@@ -63,9 +63,10 @@
/obj/machinery/mineral/labor_claim_console/attackby(obj/item/I as obj, mob/user as mob)
if(istype(I, /obj/item/weapon/card/id))
return attack_hand(user)
- else if(istype(I, /obj/item/weapon/card/emag))
- return emag(user)
..()
+
+/obj/machinery/mineral/labor_claim_console/emag_act(user as mob)
+ emag(user)
/obj/machinery/mineral/labor_claim_console/proc/emag(mob/user as mob)
if(!emagged)
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index f763179550e..cf5f2cedea5 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -130,7 +130,7 @@
//handcuffed?
if(handcuffed)
- if(istype(handcuffed, /obj/item/weapon/handcuffs/cable))
+ if(istype(handcuffed, /obj/item/weapon/restraints/handcuffs/cable))
msg += "[t_He] [t_is] \icon[handcuffed] restrained with cable!\n"
else
msg += "[t_He] [t_is] \icon[handcuffed] handcuffed!\n"
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 5b06aaa9b40..f624a94924a 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -198,7 +198,17 @@ emp_act
I.emp_act(severity)
..()
-
+/mob/living/carbon/human/emag_act(user as mob, var/datum/organ/external/affecting)
+ if(!(affecting.status & ORGAN_ROBOT))
+ user << "\red That limb isn't robotic."
+ return
+ if(affecting.sabotaged)
+ user << "\red [src]'s [affecting.display_name] is already sabotaged!"
+ else
+ user << "\red You sneakily slide the card into the dataport on [src]'s [affecting.display_name] and short out the safeties."
+ affecting.sabotaged = 1
+ return 1
+
//Returns 1 if the attack hit, 0 if it missed.
/mob/living/carbon/human/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone)
if(!I || !user) return 0
@@ -236,17 +246,8 @@ emp_act
return 0
if(istype(I,/obj/item/weapon/card/emag))
- if(!(affecting.status & ORGAN_ROBOT))
- user << "\red That limb isn't robotic."
- return
- if(affecting.sabotaged)
- user << "\red [src]'s [affecting.display_name] is already sabotaged!"
- else
- user << "\red You sneakily slide [I] into the dataport on [src]'s [affecting.display_name] and short out the safeties."
- var/obj/item/weapon/card/emag/emag = I
- emag.uses--
- affecting.sabotaged = 1
- return 1
+ emag_act(user, affecting)
+
if(! I.discrete)
if(I.attack_verb.len)
visible_message("\red [src] has been [pick(I.attack_verb)] in the [hit_area] with [I.name] by [user]!")
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 4b9f4f1e107..5745751e219 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -918,7 +918,7 @@ proc/get_damage_icon_part(damage_state, body_part)
var/obj/screen/inventory/L = hud_used.adding[8]
R.overlays += image("icon"='icons/mob/screen_gen.dmi', "icon_state"="markus")
L.overlays += image("icon"='icons/mob/screen_gen.dmi', "icon_state"="gabrielle")
- if(istype(handcuffed, /obj/item/weapon/handcuffs/pinkcuffs))
+ if(istype(handcuffed, /obj/item/weapon/restraints/handcuffs/pinkcuffs))
overlays_standing[HANDCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "pinkcuff1")
else
overlays_standing[HANDCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "handcuff1")
diff --git a/code/modules/mob/living/carbon/monkey/inventory.dm b/code/modules/mob/living/carbon/monkey/inventory.dm
index cfb4029609f..1ce1c4019a9 100644
--- a/code/modules/mob/living/carbon/monkey/inventory.dm
+++ b/code/modules/mob/living/carbon/monkey/inventory.dm
@@ -164,7 +164,7 @@
W.layer = initial(W.layer)
W.add_fingerprint(source)
else
- if (istype(item, /obj/item/weapon/handcuffs))
+ if (istype(item, /obj/item/weapon/restraints/handcuffs))
source.drop_item()
target.handcuffed = item
item.loc = target
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 737a44342b0..de1cd283e44 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -658,8 +658,8 @@
CM.handcuffed = null
CM.update_inv_handcuffed()
else
- var/obj/item/weapon/handcuffs/HC = CM.handcuffed
- var/breakouttime = 1200 //A default in case you are somehow handcuffed with something that isn't an obj/item/weapon/handcuffs type
+ var/obj/item/weapon/restraints/handcuffs/HC = CM.handcuffed
+ var/breakouttime = 1200 //A default in case you are somehow handcuffed with something that isn't an obj/item/weapon/restraints/handcuffs type
var/displaytime = 2 //Minutes to display in the "this will take X minutes."
if(istype(HC)) //If you are handcuffed with actual handcuffs... Well what do I know, maybe someone will want to handcuff you with toilet paper in the future...
breakouttime = HC.breakouttime
@@ -695,7 +695,7 @@
CM.legcuffed = null
CM.update_inv_legcuffed()
else
- var/obj/item/weapon/legcuffs/HC = CM.legcuffed
+ var/obj/item/weapon/restraints/legcuffs/HC = CM.legcuffed
var/breakouttime = 1200 //A default in case you are somehow legcuffed with something that isn't an obj/item/weapon/legcuffs type
var/displaytime = 2 //Minutes to display in the "this will take X minutes."
if(istype(HC)) //If you are legcuffed with actual legcuffs... Well what do I know, maybe someone will want to legcuff you with toilet paper in the future...
diff --git a/code/modules/mob/living/silicon/mommi/mommi.dm b/code/modules/mob/living/silicon/mommi/mommi.dm
index 91defdaedfb..b6e508d9d3a 100644
--- a/code/modules/mob/living/silicon/mommi/mommi.dm
+++ b/code/modules/mob/living/silicon/mommi/mommi.dm
@@ -149,7 +149,7 @@ They can only use one tool at a time, they can't choose modules, and they have 1
name = real_name
/mob/living/silicon/robot/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do
+ if (istype(W, /obj/item/weapon/restraints/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do
return
if (istype(W, /obj/item/weapon/weldingtool))
@@ -240,68 +240,6 @@ They can only use one tool at a time, they can't choose modules, and they have 1
else
user << "\red Access denied."
- else if(istype(W, /obj/item/weapon/card/emag)) // trying to unlock with an emag card
- if(!opened)//Cover is closed
- if(locked)
- if(prob(90))
- user << "You emag the cover lock."
- locked = 0
- else
- user << "You fail to emag the cover lock."
- if(prob(25))
- src << "Hack attempt detected."
- else
- user << "The cover is already unlocked."
- return
-
- if(opened)//Cover is open
- if(emagged) return//Prevents the X has hit Y with Z message also you cant emag them twice
- if(wiresexposed)
- user << "You must close the panel first"
- return
- else
- sleep(6)
- if(prob(50))
- emagged = 1
- lawupdate = 0
- connected_ai = null
- user << "You emag [src]'s interface."
-// message_admins("[key_name_admin(user)] emagged cyborg [key_name_admin(src)]. Laws overridden.")
- log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.")
- clear_supplied_laws()
- clear_inherent_laws()
- laws = new /datum/ai_laws/syndicate_override
- var/time = time2text(world.realtime,"hh:mm:ss")
- lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])")
- set_zeroth_law("Only [user.real_name] and people he designates as being such are Syndicate Agents.")
- src << "\red ALERT: Foreign software detected."
- sleep(5)
- src << "\red Initiating diagnostics..."
- sleep(20)
- src << "\red SynBorg v1.7 loaded."
- sleep(5)
- src << "\red LAW SYNCHRONISATION ERROR"
- sleep(5)
- src << "\red Would you like to send a report to NanoTraSoft? Y/N"
- sleep(10)
- src << "\red > N"
- sleep(20)
- src << "\red ERRORERRORERROR"
- src << "Obey these laws:"
- laws.show_laws(src)
- src << "\red \b ALERT: [user.real_name] is your new master. Obey your new laws and his commands."
- if(src.module && istype(src.module, /obj/item/weapon/robot_module/miner))
- for(var/obj/item/weapon/pickaxe/borgdrill/D in src.module.modules)
- del(D)
- src.module.modules += new /obj/item/weapon/pickaxe/diamonddrill(src.module)
- src.module.rebuild()
- updateicon()
- else
- user << "You fail to [ locked ? "unlock" : "lock"] [src]'s interface."
- if(prob(25))
- src << "Hack attempt detected."
- return
-
else if(istype(W, /obj/item/borg/upgrade/))
var/obj/item/borg/upgrade/U = W
if(!opened)
@@ -322,6 +260,68 @@ They can only use one tool at a time, they can't choose modules, and they have 1
else
spark_system.start()
return ..()
+
+/mob/living/silicon/robot/mommi/emag_act(user as mob)
+ if(!opened)//Cover is closed
+ if(locked)
+ if(prob(90))
+ user << "You emag the cover lock."
+ locked = 0
+ else
+ user << "You fail to emag the cover lock."
+ if(prob(25))
+ src << "Hack attempt detected."
+ else
+ user << "The cover is already unlocked."
+ return
+
+ if(opened)//Cover is open
+ if(emagged) return//Prevents the X has hit Y with Z message also you cant emag them twice
+ if(wiresexposed)
+ user << "You must close the panel first"
+ return
+ else
+ sleep(6)
+ if(prob(50))
+ emagged = 1
+ lawupdate = 0
+ connected_ai = null
+ user << "You emag [src]'s interface."
+// message_admins("[key_name_admin(user)] emagged cyborg [key_name_admin(src)]. Laws overridden.")
+ log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.")
+ clear_supplied_laws()
+ clear_inherent_laws()
+ laws = new /datum/ai_laws/syndicate_override
+ var/time = time2text(world.realtime,"hh:mm:ss")
+ lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])")
+ set_zeroth_law("Only [user.real_name] and people he designates as being such are Syndicate Agents.")
+ src << "\red ALERT: Foreign software detected."
+ sleep(5)
+ src << "\red Initiating diagnostics..."
+ sleep(20)
+ src << "\red SynBorg v1.7 loaded."
+ sleep(5)
+ src << "\red LAW SYNCHRONISATION ERROR"
+ sleep(5)
+ src << "\red Would you like to send a report to NanoTraSoft? Y/N"
+ sleep(10)
+ src << "\red > N"
+ sleep(20)
+ src << "\red ERRORERRORERROR"
+ src << "Obey these laws:"
+ laws.show_laws(src)
+ src << "\red \b ALERT: [user.real_name] is your new master. Obey your new laws and his commands."
+ if(src.module && istype(src.module, /obj/item/weapon/robot_module/miner))
+ for(var/obj/item/weapon/pickaxe/borgdrill/D in src.module.modules)
+ del(D)
+ src.module.modules += new /obj/item/weapon/pickaxe/diamonddrill(src.module)
+ src.module.rebuild()
+ updateicon()
+ else
+ user << "You fail to [ locked ? "unlock" : "lock"] [src]'s interface."
+ if(prob(25))
+ src << "Hack attempt detected."
+ return
/mob/living/silicon/robot/mommi/attack_hand(mob/user)
add_fingerprint(user)
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index 0073729778d..e3a04f2cd0f 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -172,41 +172,6 @@
user << "The machine is hermetically sealed. You can't open the case."
return
- else if (istype(W, /obj/item/weapon/card/emag))
-
- if(!client || stat == 2)
- user << "\red There's not much point subverting this heap of junk."
- return
-
- if(emagged)
- src << "\red [user] attempts to load subversive software into you, but your hacked subroutined ignore the attempt."
- user << "\red You attempt to subvert [src], but the sequencer has no effect."
- return
-
- user << "\red You swipe the sequencer across [src]'s interface and watch its eyes flicker."
- src << "\red You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script."
-
- var/obj/item/weapon/card/emag/emag = W
- emag.uses--
-
- message_admins("[key_name_admin(user)] emagged drone [key_name_admin(src)]. Laws overridden.")
- log_game("[key_name(user)] emagged drone [key_name(src)]. Laws overridden.")
- var/time = time2text(world.realtime,"hh:mm:ss")
- lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])")
-
- emagged = 1
- lawupdate = 0
- connected_ai = null
- clear_supplied_laws()
- clear_inherent_laws()
- laws = new /datum/ai_laws/syndicate_override
- set_zeroth_law("Only [user.real_name] and people he designates as being such are Syndicate Agents.")
-
- src << "Obey these laws:"
- laws.show_laws(src)
- src << "\red \b ALERT: [user.real_name] is your new master. Obey your new laws and his commands."
- return
-
else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
if(stat == 2)
@@ -242,6 +207,41 @@
return
..()
+
+/mob/living/silicon/robot/drone/emag_act(user as mob)
+ if(!client || stat == 2)
+ user << "\red There's not much point subverting this heap of junk."
+ return
+
+ if(!ishuman(user))
+ return
+ var/mob/living/carbon/human/H = user
+
+ if(emagged)
+ src << "\red [user] attempts to load subversive software into you, but your hacked subroutined ignore the attempt."
+ user << "\red You attempt to subvert [src], but the sequencer has no effect."
+ return
+
+ user << "\red You swipe the sequencer across [src]'s interface and watch its eyes flicker."
+ src << "\red You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script."
+
+ message_admins("[key_name_admin(user)] emagged drone [key_name_admin(src)]. Laws overridden.")
+ log_game("[key_name(user)] emagged drone [key_name(src)]. Laws overridden.")
+ var/time = time2text(world.realtime,"hh:mm:ss")
+ lawchanges.Add("[time] : [H.name]([H.key]) emagged [name]([key])")
+
+ emagged = 1
+ lawupdate = 0
+ connected_ai = null
+ clear_supplied_laws()
+ clear_inherent_laws()
+ laws = new /datum/ai_laws/syndicate_override
+ set_zeroth_law("Only [H.real_name] and people he designates as being such are Syndicate Agents.")
+
+ src << "Obey these laws:"
+ laws.show_laws(src)
+ src << "\red \b ALERT: [H.real_name] is your new master. Obey your new laws and his commands."
+ return
//DRONE LIFE/DEATH
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 1e0a62eedb2..dbbf6744701 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -643,7 +643,7 @@
/mob/living/silicon/robot/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do
+ if (istype(W, /obj/item/weapon/restraints/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do
return
if(opened) // Are they trying to insert something?
@@ -808,72 +808,6 @@
else
user << "\red Access denied."
- else if(istype(W, /obj/item/weapon/card/emag)) // trying to unlock with an emag card
- if(!opened)//Cover is closed
- if(locked)
- if(prob(90))
- var/obj/item/weapon/card/emag/emag = W
- emag.uses--
- user << "You emag the cover lock."
- locked = 0
- else
- user << "You fail to emag the cover lock."
- if(prob(25))
- src << "Hack attempt detected."
- else
- user << "The cover is already unlocked."
- return
-
- if(opened)//Cover is open
- if(emagged) return//Prevents the X has hit Y with Z message also you cant emag them twice
- if(wiresexposed)
- user << "You must close the panel first"
- return
- else
- sleep(6)
- if(prob(50))
- emagged = 1
- if(user.hud_used)
- user.hud_used.update_robot_modules_display() //Shows/hides the emag item if the inventory screen is already open.
- lawupdate = 0
- connected_ai = null
- user << "You emag [src]'s interface."
-// message_admins("[key_name_admin(user)] emagged cyborg [key_name_admin(src)]. Laws overridden.")
- log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.")
- clear_supplied_laws()
- clear_inherent_laws()
- laws = new /datum/ai_laws/syndicate_override
- var/time = time2text(world.realtime,"hh:mm:ss")
- lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])")
- set_zeroth_law("Only [user.real_name] and people he designates as being such are Syndicate Agents.")
- src << "\red ALERT: Foreign software detected."
- sleep(5)
- src << "\red Initiating diagnostics..."
- sleep(20)
- src << "\red SynBorg v1.7 loaded."
- sleep(5)
- src << "\red LAW SYNCHRONISATION ERROR"
- sleep(5)
- src << "\red Would you like to send a report to NanoTraSoft? Y/N"
- sleep(10)
- src << "\red > N"
- sleep(20)
- src << "\red ERRORERRORERROR"
- src << "Obey these laws:"
- laws.show_laws(src)
- src << "\red \b ALERT: [user.real_name] is your new master. Obey your new laws and his commands."
- if(src.module && istype(src.module, /obj/item/weapon/robot_module/miner))
- for(var/obj/item/weapon/pickaxe/borgdrill/D in src.module.modules)
- del(D)
- src.module.modules += new /obj/item/weapon/pickaxe/diamonddrill(src.module)
- src.module.rebuild()
- updateicon()
- else
- user << "You fail to [ locked ? "unlock" : "lock"] [src]'s interface."
- if(prob(25))
- src << "Hack attempt detected."
- return
-
else if(istype(W, /obj/item/borg/upgrade/))
var/obj/item/borg/upgrade/U = W
if(!opened)
@@ -894,6 +828,73 @@
else
spark_system.start()
return ..()
+
+/mob/living/silicon/robot/emag_act(user as mob)
+ if(!ishuman(user))
+ return
+ var/mob/living/carbon/human/H = user
+ if(!opened)//Cover is closed
+ if(locked)
+ if(prob(90))
+ user << "You emag the cover lock."
+ locked = 0
+ else
+ user << "You fail to emag the cover lock."
+ if(prob(25))
+ src << "Hack attempt detected."
+ else
+ user << "The cover is already unlocked."
+ return
+
+ if(opened)//Cover is open
+ if(emagged) return//Prevents the X has hit Y with Z message also you cant emag them twice
+ if(wiresexposed)
+ user << "You must close the panel first"
+ return
+ else
+ sleep(6)
+ if(prob(50))
+ emagged = 1
+ if(H.hud_used)
+ H.hud_used.update_robot_modules_display() //Shows/hides the emag item if the inventory screen is already open.
+ lawupdate = 0
+ connected_ai = null
+ user << "You emag [src]'s interface."
+// message_admins("[key_name_admin(user)] emagged cyborg [key_name_admin(src)]. Laws overridden.")
+ log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.")
+ clear_supplied_laws()
+ clear_inherent_laws()
+ laws = new /datum/ai_laws/syndicate_override
+ var/time = time2text(world.realtime,"hh:mm:ss")
+ lawchanges.Add("[time] : [H.name]([H.key]) emagged [name]([key])")
+ set_zeroth_law("Only [H.real_name] and people he designates as being such are Syndicate Agents.")
+ src << "\red ALERT: Foreign software detected."
+ sleep(5)
+ src << "\red Initiating diagnostics..."
+ sleep(20)
+ src << "\red SynBorg v1.7 loaded."
+ sleep(5)
+ src << "\red LAW SYNCHRONISATION ERROR"
+ sleep(5)
+ src << "\red Would you like to send a report to NanoTraSoft? Y/N"
+ sleep(10)
+ src << "\red > N"
+ sleep(20)
+ src << "\red ERRORERRORERROR"
+ src << "Obey these laws:"
+ laws.show_laws(src)
+ src << "\red \b ALERT: [H.real_name] is your new master. Obey your new laws and his commands."
+ if(src.module && istype(src.module, /obj/item/weapon/robot_module/miner))
+ for(var/obj/item/weapon/pickaxe/borgdrill/D in src.module.modules)
+ del(D)
+ src.module.modules += new /obj/item/weapon/pickaxe/diamonddrill(src.module)
+ src.module.rebuild()
+ updateicon()
+ else
+ user << "You fail to [ locked ? "unlock" : "lock"] [src]'s interface."
+ if(prob(25))
+ src << "Hack attempt detected."
+ return
/mob/living/silicon/robot/verb/unlock_own_cover()
set category = "Robot Commands"
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 92a8f1fd557..7a14f816197 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -220,7 +220,7 @@
New()
src.modules += new /obj/item/device/flashlight/seclite(src)
src.modules += new /obj/item/device/flash/cyborg(src)
- src.modules += new /obj/item/weapon/handcuffs/cyborg(src)
+ src.modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
src.modules += new /obj/item/weapon/melee/baton/robot(src)
src.modules += new /obj/item/weapon/gun/energy/disabler/cyborg(src)
src.modules += new /obj/item/taperoll/police(src)
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index 9b638505e28..acf6333afce 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -471,14 +471,12 @@
icon_living = "borgi"
var/emagged = 0
-/mob/living/simple_animal/corgi/Ian/borgi/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if (istype(O, /obj/item/weapon/card/emag) && !emagged)
+/mob/living/simple_animal/corgi/Ian/borgi/emag_act(user as mob)
+ if (!emagged)
emagged = 1
visible_message("[user] swipes a card through [src].", "You overload [src]s internal reactor.")
spawn (1000)
src.explode()
- return
- ..()
/mob/living/simple_animal/corgi/Ian/borgi/proc/explode()
for(var/mob/M in viewers(src, null))
diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
index aa64a6fe921..73c4018e3b9 100644
--- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
+++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
@@ -125,18 +125,6 @@
else
user << "\red You swipe your card, with no effect."
return 0
- else if (istype(O, /obj/item/weapon/card/emag))
- if (emagged)
- user << "\red [src] is already overloaded - better run."
- return 0
- else
- var/obj/item/weapon/card/emag/emag = O
- emag.uses--
- emagged = 1
- user << "\blue You short out the security protocols and overload [src]'s cell, priming it to explode in a short time."
- spawn(100) src << "\red Your cell seems to be outputting a lot of power..."
- spawn(200) src << "\red Internal heat sensors are spiking! Something is badly wrong with your cell!"
- spawn(300) src.explode()
else
if(O.force)
@@ -152,6 +140,17 @@
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message("\red [user] gently taps [src] with the [O]. ")
+
+/mob/living/simple_animal/spiderbot/emag_act(user as mob)
+ if (emagged)
+ user << "\red [src] is already overloaded - better run."
+ return 0
+ else
+ emagged = 1
+ user << "\blue You short out the security protocols and overload [src]'s cell, priming it to explode in a short time."
+ spawn(100) src << "\red Your cell seems to be outputting a lot of power..."
+ spawn(200) src << "\red Internal heat sensors are spiking! Something is badly wrong with your cell!"
+ spawn(300) src.explode()
/mob/living/simple_animal/spiderbot/proc/transfer_personality(var/obj/item/device/mmi/M as obj)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index d865cb2dde5..d2d705ee960 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -399,13 +399,13 @@ var/list/slot_equipment_priority = list( \
if(slot_handcuffed)
if(H.handcuffed)
return 0
- if(!istype(src, /obj/item/weapon/handcuffs))
+ if(!istype(src, /obj/item/weapon/restraints/handcuffs))
return 0
return 1
if(slot_legcuffed)
if(H.legcuffed)
return 0
- if(!istype(src, /obj/item/weapon/legcuffs))
+ if(!istype(src, /obj/item/weapon/restraints/legcuffs))
return 0
return 1
if(slot_in_backpack)
@@ -883,6 +883,7 @@ var/list/slot_equipment_priority = list( \
stat(null, "PiNet-[master_controller.networks_cost]\t#[pipe_networks.len]")
stat(null, "Ponet-[master_controller.powernets_cost]\t#[powernets.len]")
stat(null, "NanoUI-[master_controller.nano_cost]\t#[nanomanager.processing_uis.len]")
+ stat(null,"Events-[master_controller.events_cost]\t#[event_manager.active_events.len]")
// stat(null, "GC-[master_controller.gc_cost]\t#[garbage.queue.len]")
stat(null, "Tick-[master_controller.ticker_cost]")
stat(null, "ALL-[master_controller.total_cost]")
diff --git a/code/modules/paperwork/fax.dm b/code/modules/paperwork/fax.dm
new file mode 100644
index 00000000000..926463a7dca
--- /dev/null
+++ b/code/modules/paperwork/fax.dm
@@ -0,0 +1,88 @@
+// Fax datum - holds all faxes sent during the round
+var/list/faxes = list()
+var/list/adminfaxes = list()
+
+/datum/fax
+ var/name = "fax"
+ var/from_department = null
+ var/to_department = null
+ var/origin = null
+ var/message = null
+ var/sent_by = null
+ var/sent_at = null
+
+/datum/fax/New()
+ faxes += src
+
+/datum/fax/admin
+ var/list/reply_to = null
+
+/datum/fax/admin/New()
+ adminfaxes += src
+
+// Fax panel - lets admins check all faxes sent during the round
+/client/proc/fax_panel()
+ set name = "Fax Panel"
+ set category = "Admin"
+ if(holder)
+ holder.fax_panel(usr)
+ feedback_add_details("admin_verb","FXP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ return
+
+/datum/admins/proc/fax_panel(var/mob/living/user)
+ var/html = "Refresh"
+ html += "Create Fax"
+
+ html += ""
+ html += "
Admin Faxes
"
+ html += "
"
+ html += "| Name | From Department | To Department | Sent At | Sent By | View | Reply | Replied To |
"
+ for(var/datum/fax/admin/A in adminfaxes)
+ html += ""
+ html += "| [A.name] | "
+ html += "[A.from_department] | "
+ html += "[A.to_department] | "
+ html += "[worldtime2text(A.sent_at)] | "
+ if(A.sent_by)
+ var/mob/living/S = A.sent_by
+ html += "[S.name] | "
+ else
+ html += "Unknown | "
+ html += "View | "
+ if(!A.reply_to)
+ if(A.from_department == "Administrator")
+ html += "N/A | "
+ else
+ html += "Reply | "
+ html += "N/A | "
+ else
+ html += "N/A | "
+ html += "Original | "
+ html += "
"
+ html += "
"
+ html += "
"
+
+ html += ""
+ html += "
Departmental Faxes
"
+ html += "
"
+ html += "| Name | From Department | To Department | Sent At | Sent By | View |
"
+ for(var/datum/fax/F in faxes)
+ html += ""
+ html += "| [F.name] | "
+ html += "[F.from_department] | "
+ html += "[F.to_department] | "
+ html += "[worldtime2text(F.sent_at)] | "
+ if(F.sent_by)
+ var/mob/living/S = F.sent_by
+ html += "[S.name] | "
+ else
+ html += "Unknown | "
+ html += "View | "
+ html += "
"
+ html += "
"
+ html += "
"
+
+ var/datum/browser/popup = new(user, "fax_panel", "Fax Panel", 950, 450)
+ popup.set_content(html)
+ popup.open()
+
\ No newline at end of file
diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm
index a727a3f59c3..98726004ea4 100644
--- a/code/modules/paperwork/faxmachine.dm
+++ b/code/modules/paperwork/faxmachine.dm
@@ -1,9 +1,8 @@
var/list/obj/machinery/photocopier/faxmachine/allfaxes = list()
var/list/admin_departments = list("Central Command")
+var/list/hidden_admin_departments = list("Syndicate")
var/list/alldepartments = list()
-var/list/adminfaxes = list() //cache for faxes that have been sent to admins
-
/obj/machinery/photocopier/faxmachine
name = "fax machine"
icon = 'icons/obj/library.dmi'
@@ -22,6 +21,8 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
var/department = "Unknown" // our department
var/destination = "Central Command" // the department we're sending to
+
+ var/data[0]
/obj/machinery/photocopier/faxmachine/New()
..()
@@ -31,111 +32,146 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
alldepartments |= department
/obj/machinery/photocopier/faxmachine/attack_hand(mob/user as mob)
- user.set_machine(src)
-
- var/dat = "Fax Machine
"
-
- var/scan_name
+ ui_interact(user)
+
+/obj/machinery/photocopier/faxmachine/attackby(obj/item/weapon/item, mob/user)
+ if(istype(item,/obj/item/weapon/card/id) && !scan)
+ scan(item)
+ else if(istype(item, /obj/item/weapon/paper) || istype(item, /obj/item/weapon/photo) || istype(item, /obj/item/weapon/paper_bundle))
+ ..()
+ nanomanager.update_uis(src)
+ else
+ return ..()
+
+/obj/machinery/photocopier/faxmachine/emag_act(user as mob)
+ if(!emagged)
+ emagged = 1
+ user << "The transmitters realign to an unknown source!"
+ else
+ user << "You swipe the card through [src], but nothing happens."
+
+/obj/machinery/photocopier/faxmachine/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
if(scan)
- scan_name = scan.name
+ data["scan_name"] = scan.name
else
- scan_name = "--------"
-
- dat += "Confirm Identity: [scan_name]
"
-
- if(authenticated)
- dat += "{Log Out}"
+ data["scan_name"] = "-----"
+ data["authenticated"] = authenticated
+ if(!authenticated)
+ data["network"] = "Disconnected"
+ else if(!emagged)
+ data["network"] = "Central Command Quantum Entanglement Network"
else
- dat += "{Log In}"
-
- dat += "
"
-
- if(authenticated)
- dat += "Logged in to: Central Command Quantum Entanglement Network
"
-
- if(copyitem)
- dat += "Remove Item
"
-
- if(sendcooldown)
- dat += "Transmitter arrays realigning. Please stand by.
"
-
- else
-
- dat += "Send
"
- dat += "Currently sending: [copyitem.name]
"
- dat += "Sending to: [destination]
"
-
- else
- if(sendcooldown)
- dat += "Please insert paper to send via secure connection.
"
- dat += "Transmitter arrays realigning. Please stand by.
"
- else
- dat += "Please insert paper to send via secure connection.
"
-
+ data["network"] = "ERR*?*%!*"
+ if(copyitem)
+ data["paper"] = copyitem.name
+ data["paperinserted"] = 1
else
- dat += "Proper authentication is required to use this device.
"
+ data["paper"] = "-----"
+ data["paperinserted"] = 0
+ data["destination"] = destination
+ data["cooldown"] = sendcooldown
+ if((destination in admin_departments) || (destination in hidden_admin_departments))
+ data["respectcooldown"] = 1
+ else
+ data["respectcooldown"] = 0
- if(copyitem)
- dat += "Remove Item
"
-
- user << browse(dat, "window=copier")
- onclose(user, "copier")
- return
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "faxmachine.tmpl", "Fax Machine UI", 540, 450)
+ ui.set_initial_data(data)
+ ui.open()
/obj/machinery/photocopier/faxmachine/Topic(href, href_list)
+ if(..())
+ return 1
+
if(href_list["send"])
- if(copyitem)
- if (destination in admin_departments)
+ if(copyitem && authenticated)
+ if ((destination in admin_departments) || (destination in hidden_admin_departments))
send_admin_fax(usr, destination)
else
- sendfax(destination)
+ sendfax(destination,usr)
if (sendcooldown)
spawn(sendcooldown) // cooldown time
sendcooldown = 0
+ nanomanager.update_uis(src)
- else if(href_list["remove"])
+ if(href_list["paper"])
if(copyitem)
copyitem.loc = usr.loc
usr.put_in_hands(copyitem)
usr << "You take \the [copyitem] out of \the [src]."
copyitem = null
- updateUsrDialog()
+ else
+ var/obj/item/I = usr.get_active_hand()
+ if (istype(I, /obj/item/weapon/paper) || istype(I, /obj/item/weapon/photo) || istype(I, /obj/item/weapon/paper_bundle))
+ usr.drop_item()
+ copyitem = I
+ I.loc = src
+ usr << "You insert \the [I] into \the [src]."
+ flick(insert_anim, src)
if(href_list["scan"])
- if (scan)
- if(ishuman(usr))
- scan.loc = usr.loc
- if(!usr.get_active_hand())
- usr.put_in_hands(scan)
- scan = null
- else
- scan.loc = src.loc
- scan = null
+ scan()
+
+ if(href_list["dept"])
+ if(authenticated)
+ var/lastdestination = destination
+ var/list/combineddepartments = alldepartments + admin_departments
+ if(emagged)
+ combineddepartments += hidden_admin_departments
+ destination = input(usr, "To which department?", "Choose a department", "") as null|anything in combineddepartments
+ if(!destination)
+ destination = lastdestination
+
+ if(href_list["auth"])
+ if((!authenticated) && scan)
+ if(check_access(scan))
+ authenticated = 1
+ else if(authenticated)
+ authenticated = 0
+
+ if(href_list["rename"])
+ if(copyitem)
+ var/n_name = copytext(sanitize(input(usr, "What would you like to label the fax?", "Fax Labelling", copyitem.name) as text), 1, MAX_MESSAGE_LEN)
+ if((copyitem && copyitem.loc == src && usr.stat == 0))
+ if (istype(copyitem, /obj/item/weapon/paper))
+ copyitem.name = "[(n_name ? text("[n_name]") : initial(copyitem.name))]"
+ copyitem.desc = "This is a paper titled '" + copyitem.name + "'."
+ else if(istype(copyitem, /obj/item/weapon/photo))
+ copyitem.name = "[(n_name ? text("[n_name]") : "photo")]"
+ else if(istype(copyitem, /obj/item/weapon/paper_bundle))
+ copyitem.name = "[(n_name ? text("[n_name]") : "paper")]"
+ data["name"] = copyitem.name
+
+ nanomanager.update_uis(src)
+
+/obj/machinery/photocopier/faxmachine/proc/scan(var/obj/item/weapon/card/id/card = null)
+ if(scan) // Card is in machine
+ if(ishuman(usr))
+ scan.loc = usr.loc
+ if(!usr.get_active_hand())
+ usr.put_in_hands(scan)
+ scan = null
else
+ scan.loc = src.loc
+ scan = null
+ else
+ if(!card)
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card/id))
usr.drop_item()
I.loc = src
scan = I
- authenticated = 0
+ else
+ if(istype(card))
+ usr.drop_item()
+ card.loc = src
+ scan = card
+ nanomanager.update_uis(src)
- if(href_list["dept"])
- var/lastdestination = destination
- destination = input(usr, "Which department?", "Choose a department", "") as null|anything in (alldepartments + admin_departments)
- if(!destination) destination = lastdestination
-
- if(href_list["auth"])
- if ( (!( authenticated ) && (scan)) )
- if (check_access(scan))
- authenticated = 1
-
- if(href_list["logout"])
- authenticated = 0
-
- updateUsrDialog()
-
-/obj/machinery/photocopier/faxmachine/proc/sendfax(var/destination)
+/obj/machinery/photocopier/faxmachine/proc/sendfax(var/destination,var/mob/sender)
if(stat & (BROKEN|NOPOWER))
return
@@ -144,15 +180,24 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
var/success = 0
for(var/obj/machinery/photocopier/faxmachine/F in allfaxes)
if( F.department == destination )
- success = F.recievefax(copyitem)
+ success = F.receivefax(copyitem)
if (success)
+ var/datum/fax/F = new /datum/fax()
+ F.name = copyitem.name
+ F.from_department = department
+ F.to_department = destination
+ F.origin = src
+ F.message = copyitem
+ F.sent_by = sender
+ F.sent_at = world.time
+
visible_message("[src] beeps, \"Message transmitted successfully.\"")
//sendcooldown = 600
else
visible_message("[src] beeps, \"Error transmitting message.\"")
-/obj/machinery/photocopier/faxmachine/proc/recievefax(var/obj/item/incoming)
+/obj/machinery/photocopier/faxmachine/proc/receivefax(var/obj/item/incoming)
if(stat & (BROKEN|NOPOWER))
return 0
@@ -195,20 +240,29 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
return
rcvdcopy.loc = null //hopefully this shouldn't cause trouble
- adminfaxes += rcvdcopy
+
+ var/datum/fax/admin/A = new /datum/fax/admin()
+ A.name = rcvdcopy.name
+ A.from_department = department
+ A.to_department = destination
+ A.origin = src
+ A.message = rcvdcopy
+ A.sent_by = sender
+ A.sent_at = world.time
//message badmins that a fax has arrived
switch(destination)
if ("Central Command")
- message_admins(sender, "CENTCOMM FAX", rcvdcopy, "CentcommFaxReply", "#006100")
-
+ message_admins(sender, "CENTCOM FAX", destination, rcvdcopy, "#006100")
+ if ("Syndicate")
+ message_admins(sender, "SYNDICATE FAX", destination, rcvdcopy, "#DC143C")
sendcooldown = 1800
sleep(50)
visible_message("[src] beeps, \"Message transmitted successfully.\"")
-/obj/machinery/photocopier/faxmachine/proc/message_admins(var/mob/sender, var/faxname, var/obj/item/sent, var/reply_type, font_colour="#006100")
- var/msg = "\blue [faxname]: [key_name(sender, 1)] (PP) (VV) (SM) (JMP) (CA) (REPLY): Receiving '[sent.name]' via secure connection ... view message"
+/obj/machinery/photocopier/faxmachine/proc/message_admins(var/mob/sender, var/faxname, var/faxtype, var/obj/item/sent, font_colour="#006100")
+ var/msg = "\blue [faxname]: [key_name(sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (REPLY): Receiving '[sent.name]' via secure connection... view message"
for(var/client/C in admins)
if(R_ADMIN & C.holder.rights)
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index edbe96a1cdc..a1cf50822a5 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -76,7 +76,7 @@
if((M_CLUMSY in usr.mutations) && prob(50))
usr << "You cut yourself on the paper."
return
- var/n_name = copytext(sanitize(input(usr, "What would you like to label the paper?", "Paper Labelling", null) as text), 1, MAX_MESSAGE_LEN)
+ var/n_name = copytext(sanitize(input(usr, "What would you like to label the paper?", "Paper Labelling", name) as text), 1, MAX_MESSAGE_LEN)
if((loc == usr && usr.stat == 0))
name = "[(n_name ? text("[n_name]") : initial(name))]"
if(name != "paper")
diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm
index c3ddfb3cbbb..2e834fe0562 100644
--- a/code/modules/paperwork/paper_bundle.dm
+++ b/code/modules/paperwork/paper_bundle.dm
@@ -189,9 +189,9 @@
set category = "Object"
set src in usr
- var/n_name = copytext(sanitize(input(usr, "What would you like to label the bundle?", "Bundle Labelling", null) as text), 1, MAX_MESSAGE_LEN)
+ var/n_name = copytext(sanitize(input(usr, "What would you like to label the bundle?", "Bundle Labelling", name) as text), 1, MAX_MESSAGE_LEN)
if((loc == usr && usr.stat == 0))
- name = "[(n_name ? text("[n_name]") : "paper")]"
+ name = "[(n_name ? text("[n_name]") : "paper bundle")]"
add_fingerprint(usr)
return
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index 59973b019f8..e7ee680586a 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -90,7 +90,7 @@
set category = "Object"
set src in usr
- var/n_name = copytext(sanitize(input(usr, "What would you like to label the photo?", "Photo Labelling", null) as text), 1, MAX_MESSAGE_LEN)
+ var/n_name = copytext(sanitize(input(usr, "What would you like to label the photo?", "Photo Labelling", name) as text), 1, MAX_MESSAGE_LEN)
//loc.loc check is for making possible renaming photos in clipboards
if(( (loc == usr || (loc.loc && loc.loc == usr)) && usr.stat == 0))
name = "[(n_name ? text("[n_name]") : "photo")]"
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 6de3d9cea23..15699572da4 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -458,23 +458,6 @@
update_icon()
else
user << "\red Access denied."
- else if (istype(W, /obj/item/weapon/card/emag) && !(emagged || malfhack)) // trying to unlock with an emag card
- if(opened)
- user << "You must close the cover to swipe an ID card."
- else if(wiresexposed)
- user << "You must close the panel first"
- else if(stat & (BROKEN|MAINT))
- user << "Nothing happens."
- else
- flick("apc-spark", src)
- if (do_after(user,6))
- if(prob(50))
- emagged = 1
- locked = 0
- user << "You emag the APC interface."
- update_icon()
- else
- user << "You fail to [ locked ? "unlock" : "lock"] the APC interface."
else if (istype(W, /obj/item/stack/cable_coil) && !terminal && opened && has_electronics!=2)
if (src.loc:intact)
user << "\red You must remove the floor plating in front of the APC first."
@@ -598,8 +581,26 @@
"\red You hit the [src.name] with your [W.name]!", \
"You hear bang")
+/obj/machinery/power/apc/emag_act(user as mob)
+ if (!(emagged || malfhack)) // trying to unlock with an emag card
+ if(opened)
+ user << "You must close the cover to swipe an ID card."
+ else if(wiresexposed)
+ user << "You must close the panel first"
+ else if(stat & (BROKEN|MAINT))
+ user << "Nothing happens."
+ else
+ flick("apc-spark", src)
+ if (do_after(user,6))
+ if(prob(50))
+ emagged = 1
+ locked = 0
+ user << "You emag the APC interface."
+ update_icon()
+ else
+ user << "You fail to [ locked ? "unlock" : "lock"] the APC interface."
+
// attack with hand - remove cell (if cover open) or interact with the APC
-
/obj/machinery/power/apc/attack_hand(mob/user)
// if (!can_use(user)) This already gets called in interact() and in topic()
// return
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index c688127ad2b..ea0e85080d6 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -270,7 +270,7 @@
if(src.amount <= 14)
usr << "\red You need at least 15 lengths to make restraints!"
return
- var/obj/item/weapon/handcuffs/cable/B = new /obj/item/weapon/handcuffs/cable(usr.loc)
+ var/obj/item/weapon/restraints/handcuffs/cable/B = new /obj/item/weapon/restraints/handcuffs/cable(usr.loc)
B.icon_state = "cuff_[_color]"
usr << "\blue You wind some cable together to make some restraints."
src.use(15)
diff --git a/code/modules/power/pacman2.dm b/code/modules/power/pacman2.dm
index 89d65a6ae21..9402a4c234f 100644
--- a/code/modules/power/pacman2.dm
+++ b/code/modules/power/pacman2.dm
@@ -81,14 +81,6 @@
user.drop_item()
O.loc = src
user << "\blue You add the plasma tank to the generator."
- else if (istype(O, /obj/item/weapon/card/emag))
- var/obj/item/weapon/card/emag/E = O
- if(E.uses)
- E.uses--
- else
- return
- emagged = 1
- emp_act(1)
else if(!active)
if(istype(O, /obj/item/weapon/wrench))
anchored = !anchored
@@ -114,6 +106,11 @@
new_frame.state = 2
new_frame.icon_state = "box_1"
del(src)
+
+ emag_act(user as mob)
+ if(!emagged)
+ emagged = 1
+ emp_act(1)
attack_hand(mob/user as mob)
..()
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index a334782cce1..d918ec86711 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -211,9 +211,6 @@ display round(lastgen) and plasmatank amount
addstack.use(amount)
updateUsrDialog()
return
- else if (istype(O, /obj/item/weapon/card/emag))
- emagged = 1
- emp_act(1)
else if(!active)
if(istype(O, /obj/item/weapon/wrench))
if(!anchored && !isinspace())
@@ -239,6 +236,10 @@ display round(lastgen) and plasmatank amount
else if(istype(O, /obj/item/weapon/crowbar) && panel_open)
default_deconstruction_crowbar(O)
+/obj/machinery/power/port_gen/pacman/emag_act(user as mob)
+ emagged = 1
+ emp_act(1)
+
/obj/machinery/power/port_gen/pacman/attack_hand(mob/user as mob)
..()
if (!anchored)
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 601d7191f7b..8e9e16c9943 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -222,12 +222,14 @@
user << "\red Access denied."
return
-
- if(istype(W, /obj/item/weapon/card/emag) && !emagged)
+ ..()
+ return
+
+/obj/machinery/power/emitter/emag_act(user as mob)
+ if(!emagged)
+ if(!ishuman(user))
+ return
+ var/mob/living/carbon/human/H = user
locked = 0
emagged = 1
- user.visible_message("[user.name] emags the [src.name].","\red You short out the lock.")
- return
-
- ..()
- return
\ No newline at end of file
+ H.visible_message("[H.name] emags the [src.name].","\red You short out the lock.")
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index a129dde7472..5620f5dcd7a 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -440,7 +440,7 @@
id = "handcuffs"
build_type = AUTOLATHE
materials = list("$metal" = 500)
- build_path = /obj/item/weapon/handcuffs
+ build_path = /obj/item/weapon/restraints/handcuffs
category = list("hacked", "Security")
/datum/design/incendiary_slug
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 90e7ff47ace..7aca9b588bf 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -165,16 +165,17 @@ won't update every console in existence) but it's more of a hassle to do. Also,
user.drop_item()
D.loc = src
user << " You add the disk to the machine!"
- else if(istype(D,/obj/item/weapon/card/emag))
- if(!emagged)
- playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
- emagged = 1
- user << "You you disable the security protocols"
else
..()
src.updateUsrDialog()
return
+/obj/machinery/computer/rdconsole/emag_act(user as mob)
+ if(!emagged)
+ playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
+ emagged = 1
+ user << "You disable the security protocols"
+
/obj/machinery/computer/rdconsole/Topic(href, href_list)
if(..())
return
@@ -207,7 +208,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
t_disk = null
screen = 1.0
- else if(href_list["copy_tech"]) //Copys some technology data from the research holder to the disk.
+ else if(href_list["copy_tech"]) //Copy some technology data from the research holder to the disk.
for(var/datum/tech/T in files.known_tech)
if(href_list["copy_tech_ID"] == T.id)
t_disk.stored = T
@@ -371,6 +372,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(being_built)
var/power = 2000
var/amount=text2num(href_list["amount"])
+ var/old_screen = screen
amount = max(1, min(10, amount))
for(var/M in being_built.materials)
power += round(being_built.materials[M] * amount / 5)
@@ -436,7 +438,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
else
new_item.loc = linked_lathe.loc
linked_lathe.busy = 0
- screen = 3.15
+ screen = old_screen
updateUsrDialog()
else if(href_list["imprint"]) //Causes the Circuit Imprinter to build something.
@@ -450,6 +452,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
break
if(being_built)
var/power = 2000
+ var/old_screen = screen
for(var/M in being_built.materials)
power += round(being_built.materials[M] / 5)
power = max(2000, power)
@@ -488,7 +491,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
new_item.reliability = R
new_item.loc = linked_imprinter.loc
linked_imprinter.busy = 0
- screen = 4.1
+ screen = old_screen
updateUsrDialog()
else if(href_list["disposeI"] && linked_imprinter) //Causes the circuit imprinter to dispose of a single reagent (all of it)
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index 109ab110d71..f6e00bc69b4 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -319,14 +319,12 @@
onclose(user, "server_control")
return
-/obj/machinery/computer/rdservercontrol/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob)
- if(istype(D, /obj/item/weapon/card/emag) && !emagged)
+/obj/machinery/computer/rdservercontrol/emag_act(user as mob)
+ if(!emagged)
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
emagged = 1
user << "\blue You you disable the security protocols"
src.updateUsrDialog()
- return ..()
-
/obj/machinery/r_n_d/server/robotics
name = "Robotics R&D Server"
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm b/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm
index d770c0def1d..566e2382947 100644
--- a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm
+++ b/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm
@@ -51,7 +51,7 @@
/obj/item/weapon/stock_parts/cell,\
/obj/item/weapon/circular_saw,\
/obj/item/weapon/hatchet,\
- /obj/item/weapon/handcuffs,\
+ /obj/item/weapon/restraints/handcuffs,\
/obj/item/weapon/hemostat,\
/obj/item/weapon/kitchenknife,\
/obj/item/weapon/lighter,\
diff --git a/code/modules/research/xenoarchaeology/finds/finds.dm b/code/modules/research/xenoarchaeology/finds/finds.dm
index e2b4215128b..6b07fbb16a9 100644
--- a/code/modules/research/xenoarchaeology/finds/finds.dm
+++ b/code/modules/research/xenoarchaeology/finds/finds.dm
@@ -183,12 +183,12 @@
apply_image_decorations = 1
if(8)
item_type = "handcuffs"
- new_item = new /obj/item/weapon/handcuffs(src.loc)
+ new_item = new /obj/item/weapon/restraints/handcuffs(src.loc)
additional_desc = "[pick("They appear to be for securing two things together","Looks kinky","Doesn't seem like a children's toy")]."
if(9)
item_type = "[pick("wicked","evil","byzantine","dangerous")] looking [pick("device","contraption","thing","trap")]"
apply_prefix = 0
- new_item = new /obj/item/weapon/legcuffs/beartrap(src.loc)
+ new_item = new /obj/item/weapon/restraints/legcuffs/beartrap(src.loc)
additional_desc = "[pick("It looks like it could take a limb off",\
"Could be some kind of animal trap",\
"There appear to be [pick("dark red","dark purple","dark green","dark blue")] stains along part of it")]."
diff --git a/code/modules/shuttles/escape_pods.dm b/code/modules/shuttles/escape_pods.dm
index 0261997a9d3..17a97b79fe7 100644
--- a/code/modules/shuttles/escape_pods.dm
+++ b/code/modules/shuttles/escape_pods.dm
@@ -89,19 +89,14 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/card/emag) && !emagged)
+/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth/emag_act(user as mob)
+ if (!emagged)
user << "\blue You emag the [src], arming the escape pod!"
emagged = 1
if (istype(docking_program, /datum/computer/file/embedded_program/docking/simple/escape_pod))
var/datum/computer/file/embedded_program/docking/simple/escape_pod/P = docking_program
if (!P.armed)
P.arm()
- return
-
- ..()
-
-
//A docking controller program for a simple door based docking port
/datum/computer/file/embedded_program/docking/simple/escape_pod
diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm
index f1ca624e73b..e6e7a8d4112 100644
--- a/code/modules/shuttles/shuttle_console.dm
+++ b/code/modules/shuttles/shuttle_console.dm
@@ -97,15 +97,11 @@
return
shuttle.cancel_launch(user)
-/obj/machinery/computer/shuttle_control/attackby(obj/item/weapon/W as obj, mob/user as mob)
-
- if (istype(W, /obj/item/weapon/card/emag))
- src.req_access = list()
- src.req_one_access = list()
- hacked = 1
- usr << "You short out the console's ID checking system. It's now available to everyone!"
- else
- ..()
+/obj/machinery/computer/shuttle_control/emag_act(user as mob)
+ src.req_access = list()
+ src.req_one_access = list()
+ hacked = 1
+ usr << "You short out the console's ID checking system. It's now available to everyone!"
/obj/machinery/computer/shuttle_control/bullet_act(var/obj/item/projectile/Proj)
visible_message("[Proj] ricochets off [src]!")
diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm
index b5268fd2ca5..29baa07c1b0 100644
--- a/code/modules/shuttles/shuttle_emergency.dm
+++ b/code/modules/shuttles/shuttle_emergency.dm
@@ -153,14 +153,15 @@
/obj/machinery/computer/shuttle_control/emergency/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/card/emag) && !emagged)
+ read_authorization(W)
+ ..()
+
+/obj/machinery/computer/shuttle_control/emergency/emag_act(user as mob)
+ if (!emagged)
user << "\blue You short out the [src]'s authorization protocols."
emagged = 1
return
- read_authorization(W)
- ..()
-
/obj/machinery/computer/shuttle_control/emergency/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
var/data[0]
var/datum/shuttle/ferry/emergency/shuttle = shuttle_controller.shuttles[shuttle_tag]
diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm
index 21283526863..42ee7f3786f 100644
--- a/code/modules/telesci/telepad.dm
+++ b/code/modules/telesci/telepad.dm
@@ -147,11 +147,12 @@
playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
user << " You calibrate the telepad locator."
-/obj/item/weapon/rcs/attackby(obj/item/W, mob/user)
- if(istype(W, /obj/item/weapon/card/emag) && emagged == 0)
+/obj/item/weapon/rcs/emag_act(user as mob)
+ if(!emagged)
emagged = 1
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
user << " You emag the RCS. Click on it to toggle between modes."
- return
\ No newline at end of file
+ return
+
\ No newline at end of file
diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm
index f37ec393860..e4b7986ab1a 100644
--- a/code/modules/telesci/telesci_computer.dm
+++ b/code/modules/telesci/telesci_computer.dm
@@ -55,12 +55,6 @@
return
/obj/machinery/computer/telescience/attackby(obj/item/W, mob/user)
- if(istype(W,/obj/item/weapon/card/emag))
- if (emagged == 0)
- user << "\blue You scramble the Telescience authentication key to an unknown signal. You should be able to teleport to more places now!"
- emagged = 1
- else
- user << "\red The machine seems unaffected by the card swipe..."
if(istype(W, /obj/item/bluespace_crystal))
if(crystals.len >= max_crystals)
user << "There are not enough crystal slots."
@@ -86,6 +80,13 @@
updateUsrDialog()
else
..()
+
+/obj/machinery/computer/telescience/emag_act(user as mob)
+ if (!emagged)
+ user << "\blue You scramble the Telescience authentication key to an unknown signal. You should be able to teleport to more places now!"
+ emagged = 1
+ else
+ user << "\red The machine seems unaffected by the card swipe..."
/obj/machinery/computer/telescience/attack_ai(mob/user)
src.attack_hand(user)
diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm
index a929e4499d9..4c62455bf07 100644
--- a/code/modules/vehicles/vehicle.dm
+++ b/code/modules/vehicles/vehicle.dm
@@ -87,8 +87,6 @@
user << "[src] does not need a repair."
else
user << "Unable to repair while [src] is off."
- else if(istype(W, /obj/item/weapon/card/emag) && !emagged)
- Emag(user)
else if(hasvar(W,"force") && hasvar(W,"damtype"))
switch(W.damtype)
if("fire")
@@ -99,6 +97,10 @@
healthcheck()
else
..()
+
+/obj/vehicle/emag_act(user as mob)
+ if(!emagged)
+ Emag(user)
/obj/vehicle/attack_animal(var/mob/living/simple_animal/M as mob)
if(M.melee_damage_upper == 0) return
diff --git a/icons/mob/custom-synthetic.dmi b/icons/mob/custom-synthetic.dmi
index 77cef2656fb..1c61475e89e 100644
Binary files a/icons/mob/custom-synthetic.dmi and b/icons/mob/custom-synthetic.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index 9d85238456b..b85721bcc27 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/maps/RandomZLevels/blackmarketpackers.dmm b/maps/RandomZLevels/blackmarketpackers.dmm
index defb234b95b..be1160e8830 100644
--- a/maps/RandomZLevels/blackmarketpackers.dmm
+++ b/maps/RandomZLevels/blackmarketpackers.dmm
@@ -32,7 +32,7 @@
"aF" = (/turf/simulated/shuttle/wall,/area/awaymission/BMPship/Aft)
"aG" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft)
"aH" = (/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft)
-"aI" = (/obj/item/weapon/handcuffs,/obj/structure/closet/crate,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft)
+"aI" = (/obj/item/weapon/restraints/handcuffs,/obj/structure/closet/crate,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft)
"aJ" = (/obj/item/weapon/scalpel,/obj/structure/closet/crate,/obj/item/weapon/tank/anesthetic,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft)
"aK" = (/obj/item/bodybag,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft)
"aL" = (/obj/item/weapon/storage/box/syringes,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft)
diff --git a/maps/RandomZLevels/centcomAway.dmm b/maps/RandomZLevels/centcomAway.dmm
index bc0a122da9f..5d1ce00b508 100644
--- a/maps/RandomZLevels/centcomAway.dmm
+++ b/maps/RandomZLevels/centcomAway.dmm
@@ -629,7 +629,7 @@
"me" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/thunderdome)
"mf" = (/obj/structure/stool/bed/chair,/turf/simulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/awaymission/centcomAway/thunderdome)
"mg" = (/turf/simulated/floor{dir = 8; icon_state = "red"},/area/awaymission/centcomAway/thunderdome)
-"mh" = (/obj/structure/rack,/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/twohanded/fireaxe,/turf/simulated/floor{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome)
+"mh" = (/obj/structure/rack,/obj/item/weapon/restraints/legcuffs/beartrap,/obj/item/weapon/twohanded/fireaxe,/turf/simulated/floor{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome)
"mi" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/awaymission/centcomAway/thunderdome)
"mj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/centcomAway/thunderdome)
"mk" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/awaymission/centcomAway/thunderdome)
diff --git a/maps/RandomZLevels/spacehotel.dmm b/maps/RandomZLevels/spacehotel.dmm
index ebcd1b49470..78fe2b7b35d 100644
--- a/maps/RandomZLevels/spacehotel.dmm
+++ b/maps/RandomZLevels/spacehotel.dmm
@@ -227,7 +227,7 @@
"es" = (/obj/structure/rack,/obj/item/key,/obj/item/key,/obj/item/key,/obj/item/key,/obj/item/key,/turf/simulated/floor/carpet,/area/awaymission)
"et" = (/obj/structure/stool/bed/chair/comfy,/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/carpet,/area/awaymission)
"eu" = (/obj/structure/stool/bed/chair/comfy,/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/carpet,/area/awaymission)
-"ev" = (/obj/item/weapon/legcuffs,/turf/simulated/floor/engine/cult,/area/awaymission)
+"ev" = (/obj/item/weapon/restraints/legcuffs,/turf/simulated/floor/engine/cult,/area/awaymission)
"ew" = (/obj/machinery/space_heater,/turf/simulated/floor/carpet,/area/awaymission)
"ex" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/awaymission)
"ey" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Not used to spy on hotel rooms."; dir = 1; network = "Hotel"; use_power = 0},/turf/simulated/floor/carpet,/area/awaymission)
diff --git a/maps/RandomZLevels/undergroundoutpost45.dmm b/maps/RandomZLevels/undergroundoutpost45.dmm
index ac64937fec2..53165c7d8a9 100644
--- a/maps/RandomZLevels/undergroundoutpost45.dmm
+++ b/maps/RandomZLevels/undergroundoutpost45.dmm
@@ -787,7 +787,7 @@
"pg" = (/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = -27},/turf/simulated/floor{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"ph" = (/obj/structure/filingcabinet,/turf/simulated/floor{dir = 10; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"pi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door_control{desc = "A remote control-switch whichs locks the research division down in the event of a biohazard leak or contamination."; id = "UO45_biohazard"; name = "Biohazard Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "201"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"pj" = (/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "201"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/item/weapon/handcuffs,/obj/item/device/flash,/obj/item/weapon/reagent_containers/spray/pepper,/turf/simulated/floor{dir = 6; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"pj" = (/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "201"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/item/weapon/restraints/handcuffs,/obj/item/device/flash,/obj/item/weapon/reagent_containers/spray/pepper,/turf/simulated/floor{dir = 6; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"pk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"pl" = (/obj/structure/flora/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 10; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"pm" = (/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
diff --git a/maps/cyberiad.dmm b/maps/cyberiad.dmm
index 8d56da4d315..a541da06805 100644
--- a/maps/cyberiad.dmm
+++ b/maps/cyberiad.dmm
@@ -560,7 +560,7 @@
"akN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/main)
"akO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/security/main)
"akP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable,/turf/simulated/floor/plating,/area/security/main)
-"akQ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/reinforced,/obj/item/weapon/handcuffs,/obj/item/device/flash,/obj/machinery/light{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/main)
+"akQ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/reinforced,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flash,/obj/machinery/light{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/main)
"akR" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/main)
"akS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor,/area/security/main)
"akT" = (/obj/structure/closet/secure_closet/security,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/security/main)
@@ -605,7 +605,7 @@
"alG" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/siberia/station)
"alH" = (/obj/machinery/computer/shuttle_control/labor_camp,/obj/machinery/embedded_controller/radio/simple_docking_controller{id_tag = "labor_shuttle"; pixel_x = -25; pixel_y = 0; req_one_access_txt = "13"; tag_door = "labor_shuttle_hatch"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia/station)
"alI" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia/station)
-"alJ" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/handcuffs,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia/station)
+"alJ" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/restraints/handcuffs,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia/station)
"alK" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/prisonershuttle)
"alL" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/prisonershuttle)
"alM" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/prisonershuttle)
@@ -900,7 +900,7 @@
"arp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison/cell_block/C)
"arq" = (/obj/item/weapon/storage/secure/safe{pixel_x = -23},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
"arr" = (/obj/structure/stool,/turf/simulated/floor/carpet,/area/security/detectives_office)
-"ars" = (/obj/structure/table/woodentable,/obj/structure/noticeboard{pixel_x = 30; pixel_y = 0},/obj/item/weapon/book/manual/security_space_law,/obj/item/weapon/handcuffs,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
+"ars" = (/obj/structure/table/woodentable,/obj/structure/noticeboard{pixel_x = 30; pixel_y = 0},/obj/item/weapon/book/manual/security_space_law,/obj/item/weapon/restraints/handcuffs,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
"art" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"aru" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"arv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
@@ -1308,7 +1308,7 @@
"azh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/magistrateoffice)
"azi" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/stool/bed/chair/comfy/black,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/magistrateoffice)
"azj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/table/reinforced,/obj/item/device/megaphone,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/carpet,/area/magistrateoffice)
-"azk" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "Internal Affairs"},/turf/simulated/floor{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"azk" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "Internal Affairs Office"},/turf/simulated/floor{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
"azl" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
"azm" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Internal Affairs Agent"},/turf/simulated/floor{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
"azn" = (/obj/structure/table/reinforced,/turf/simulated/floor{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
@@ -5023,7 +5023,7 @@
"bSE" = (/obj/structure/table,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/machinery/requests_console{department = "Janitorial"; departmentType = 1; pixel_y = -29},/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor,/area/janitor)
"bSF" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor,/area/janitor)
"bSG" = (/obj/machinery/light,/obj/structure/janitorialcart,/turf/simulated/floor,/area/janitor)
-"bSH" = (/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/mousetraps,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor,/area/janitor)
+"bSH" = (/obj/item/weapon/restraints/legcuffs/beartrap,/obj/item/weapon/restraints/legcuffs/beartrap,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/mousetraps,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor,/area/janitor)
"bSI" = (/turf/simulated/floor,/area/janitor)
"bSJ" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor,/area/janitor)
"bSK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
@@ -8199,7 +8199,7 @@
"dbI" = (/turf/space/transit/north/shuttlespace_ns8,/area/shuttle/escape_pod2/transit)
"dbJ" = (/obj/structure/AIcore,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox/station)
"dbK" = (/obj/item/weapon/spacecash/c200,/obj/item/weapon/spacecash/c50,/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox/station)
-"dbL" = (/obj/structure/jungle_plant,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox/station)
+"dbL" = (/obj/item/weapon/storage/box/zipties,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox/station)
"dbM" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"},/area/syndicate_mothership)
"dbN" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/syndicate_station/start)
"dbO" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_station/start)
@@ -8245,7 +8245,7 @@
"dcC" = (/obj/machinery/door/airlock/centcom{name = "Study"; opacity = 1; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"dcD" = (/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership)
"dcE" = (/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/weapon/crowbar/red,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
-"dcF" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
+"dcF" = (/obj/structure/table,/obj/item/weapon/storage/box/zipties,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
"dcG" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{tag = "icon-gravsnow_surround (WEST)"; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_surround"; dir = 8},/area/syndicate_mothership)
"dcH" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{tag = "icon-gravsnow_corner (SOUTHEAST)"; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 6},/area/syndicate_mothership)
"dcI" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/cans/beer{pixel_x = -2; pixel_y = 5},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
@@ -9092,7 +9092,7 @@
"dsR" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin)
"dsS" = (/obj/structure/table,/obj/item/weapon/rcd,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/storage/pill_bottle/random_drug_bottle,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin)
"dsT" = (/obj/structure/table,/obj/item/weapon/scalpel,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
-"dsU" = (/obj/structure/table,/obj/item/weapon/kitchen/utensil/fork,/obj/item/weapon/lighter,/obj/item/weapon/handcuffs/cable/red,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/pen,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
+"dsU" = (/obj/structure/table,/obj/item/weapon/kitchen/utensil/fork,/obj/item/weapon/lighter,/obj/item/weapon/restraints/handcuffs/cable/red,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/pen,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"dsV" = (/obj/structure/table,/obj/item/weapon/tank/plasma,/obj/item/device/multitool,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"dsW" = (/obj/structure/table,/obj/random/toolbox,/obj/random/bomb_supply,/obj/item/weapon/storage/fancy/cigarettes,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"dsX" = (/obj/machinery/recharger/wallcharger{pixel_x = 30},/obj/structure/rack,/obj/item/weapon/gun/energy/pulse_rifle/M1911,/obj/item/weapon/gun/energy/pulse_rifle/M1911{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
diff --git a/nano/templates/faxmachine.tmpl b/nano/templates/faxmachine.tmpl
new file mode 100644
index 00000000000..9dd7b910fda
--- /dev/null
+++ b/nano/templates/faxmachine.tmpl
@@ -0,0 +1,67 @@
+
+
+
Authorization
+
+
+
+ Confirm identity:
+
+
+ {{:helper.link(data.scan_name, 'eject', {'scan' : 1})}}
+
+
+
+
+ Authorize:
+
+
+ {{:helper.link(data.authenticated ? 'Log Out' : 'Log In', data.authenticated ? 'unlocked' : 'locked', {'auth' : 1})}}
+
+
+
+
+
Fax Menu
+
+
+
+ Network:
+
+
+
+ {{:data.network}}
+
+
+
+
+ Currently sending:
+
+
+ {{:helper.link(data.paper, 'eject', {'paper' : 1})}}
+ {{if data.paperinserted}}
+ {{:helper.link('Rename', 'pencil', {'rename' : 1})}}
+ {{/if}}
+
+
+
+
+ Sending to:
+
+
+ {{:helper.link(data.destination, 'print', {'dept' : 1}, !data.authenticated ? 'disabled' : '')}}
+
+
+
+
+ Action:
+
+
+ {{if data.authenticated}}
+ {{:helper.link(data.cooldown && data.respectcooldown ? "Realigning" : "Send", data.cooldown && data.respectcooldown ? 'clock' : "mail-closed", {'send' : 1}, data.cooldown && data.respectcooldown ? 'disabled' : "")}}
+ {{else}}
+ {{:helper.link(data.cooldown && data.respectcooldown ? "Realigning" : "Send", data.cooldown && data.respectcooldown ? 'clock' : "mail-closed", null, !data.authenticated ? 'disabled' : "")}}
+ {{/if}}
+
+
\ No newline at end of file
diff --git a/nano/templates/vending_machine.tmpl b/nano/templates/vending_machine.tmpl
new file mode 100644
index 00000000000..93d5c1007c9
--- /dev/null
+++ b/nano/templates/vending_machine.tmpl
@@ -0,0 +1,56 @@
+
+
+{{if data.mode == 0}}
+Items available
+
+ {{for data.products}}
+
+
+ {{if value.price > 0}}
+ {{:helper.link('Buy (' + value.price + ')', 'cart', { "vend" : value.key }, value.amount > 0 ? null : 'disabled')}}
+ {{else}}
+ {{:helper.link('Vend', 'circle-arrow-s', { "vend" : value.key }, value.amount > 0 ? null : 'disabled')}}
+ {{/if}}
+
+
+ {{if value.color}}{{:value.name}}
+ {{else}}{{:value.name}}
+ {{/if}}
+ ({{:value.amount ? value.amount : "NONE LEFT"}})
+
+
+ {{empty}}
+ No items available!
+ {{/for}}
+
+{{if data.coin}}
+Coin
+
+
Coin deposited:
+
{{:helper.link(data.coin, 'eject', {'remove_coin' : 1})}}
+
+{{/if}}
+{{else data.mode == 1}}
+Item selected
+
+
+
Item selected:
{{:data.product}}
+
Charge:
{{:data.price}}
+
+
+ {{if data.message_err}} {{/if}} {{:data.message}}
+
+
+ {{:helper.link('Cancel', 'arrowreturn-1-w', {'cancelpurchase' : 1})}}
+
+
+{{/if}}
+{{if data.panel}}
+Maintenance panel
+
+
Speaker
{{:helper.link(data.speaker ? 'Enabled' : 'Disabled', 'gear', {'togglevoice' : 1})}}
+
+{{/if}}
\ No newline at end of file
diff --git a/paradise.dme b/paradise.dme
index 9339ab8b631..8b128080271 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1390,6 +1390,7 @@
#include "code\modules\organs\wound.dm"
#include "code\modules\paperwork\carbonpaper.dm"
#include "code\modules\paperwork\clipboard.dm"
+#include "code\modules\paperwork\fax.dm"
#include "code\modules\paperwork\faxmachine.dm"
#include "code\modules\paperwork\filingcabinet.dm"
#include "code\modules\paperwork\folders.dm"