diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index d4c191cfb80..f6efaf46f71 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -464,16 +464,6 @@ Turf and target are seperate in case you want to teleport some distance from a t
else . = pick(ais)
return .
-//this is like the above function, but for alien borgs. Im not going to go over verbose with the name.
-/proc/select_active_alien_ai()
- var/mob/living/silicon/ai/selected
- var/list/active = active_ais()
- for(var/mob/living/silicon/ai/A in active)
- if(!selected || ((selected.connected_robots > A.connected_robots) && selected.alienAI))
- selected = A
- return selected
-
-
/proc/get_sorted_mobs()
var/list/old_list = getmobs()
var/list/AI_list = list()
diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm
index 0dc271e4364..ca02a66a463 100644
--- a/code/_onclick/ai.dm
+++ b/code/_onclick/ai.dm
@@ -34,9 +34,6 @@
if(control_disabled || stat)
return
- if(alienAI)
- return
-
var/list/modifiers = params2list(params)
if(modifiers["shift"] && modifiers["ctrl"])
CtrlShiftClickOn(A)
diff --git a/code/game/machinery/bees_apiary.dm b/code/game/machinery/bees_apiary.dm
index 9021c4ba84d..a8a1fdd291d 100644
--- a/code/game/machinery/bees_apiary.dm
+++ b/code/game/machinery/bees_apiary.dm
@@ -232,6 +232,9 @@
set name = "Harvest honeycomb"
set category = "Object"
+ if(usr.stat || !usr.canmove || usr.restrained())
+ return
+
while(health > 15)
health -= 15
var/obj/item/weapon/reagent_containers/food/snacks/honeycomb/H = new(src.loc)
diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm
index 1bb6d353cff..064814b7846 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/machinery/computer/ai_core.dm
@@ -5,7 +5,7 @@
icon = 'icons/mob/AI.dmi'
icon_state = "0"
var/state = 0
- var/datum/ai_laws/laws = new()
+ var/datum/ai_laws/laws = null
var/obj/item/weapon/circuitboard/circuit = null
var/obj/item/device/mmi/brain = null
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 6a0bcbf496f..eac8e4d8121 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -200,9 +200,6 @@ Class Procs:
////////////////////////////////////////////////////////////////////////////////////////////
/obj/machinery/attack_ai(var/mob/user as mob)
- if(isAI(user))
- var/mob/living/silicon/ai/A = user
- if(A.alienAI) return
if(isrobot(user))
// For some reason attack_robot doesn't work
// This is to stop robots from using cameras to remotely control machines.
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 786caf13331..0b35fe1fe98 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -548,6 +548,9 @@
usr << "Access denied." //Unless emagged of course
flick(src.icon_deny,src)
return
+ if(!R.amount)
+ user << "\red The vending machine has ran out of that product."
+ return
src.vend_ready = 0 //One thing at a time!!
src.status_message = "Vending..."
src.status_error = 0
diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm
index 85de627f0b8..f9bbd9f0c69 100644
--- a/code/game/objects/items/weapons/storage/lockbox.dm
+++ b/code/game/objects/items/weapons/storage/lockbox.dm
@@ -34,23 +34,9 @@
return
else
user << "\red Access Denied"
- else if((istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade)) && !src.broken)
- broken = 1
- locked = 0
- desc = "It appears to be broken."
- icon_state = src.icon_broken
- if(istype(W, /obj/item/weapon/melee/energy/blade))
- var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
- spark_system.set_up(5, 0, src.loc)
- spark_system.start()
- playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1)
- playsound(src.loc, "sparks", 50, 1)
- for(var/mob/O in viewers(user, 3))
- O.show_message(text("\blue The locker has been sliced open by [] with an energy blade!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2)
- else
- for(var/mob/O in viewers(user, 3))
- O.show_message(text("\blue The locker has been broken by [] with an electromagnetic card!", user), 1, text("You hear a faint electrical spark."), 2)
-
+ else if((istype(W, /obj/item/weapon/card/emag) || istype(W, /obj/item/weapon/melee/energy/blade)) && !broken)
+ emag_act(user)
+ return
if(!locked)
..()
else
@@ -65,6 +51,14 @@
..()
return
+/obj/item/weapon/storage/lockbox/emag_act(user as mob)
+ if(!broken)
+ broken = 1
+ locked = 0
+ desc = "It appears to be broken."
+ icon_state = src.icon_broken
+ user << "You unlock \the [src]."
+ return
/obj/item/weapon/storage/lockbox/loyalty
name = "Lockbox (Loyalty Implants)"
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 1375ed71d61..fdcab98cefc 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -186,6 +186,9 @@
if(istype(W, /obj/item/weapon/rcs) && !src.opened)
var/obj/item/weapon/rcs/E = W
if(E.rcharges != 0)
+ if(!(src.z in config.contact_levels))
+ user << "The rapid-crate-sender can't locate any telepads!"
+ return
if(E.mode == 0)
if(!E.teleporting)
var/list/L = list()
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
index d0c2f8f006e..d88b6af97ff 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
@@ -87,8 +87,8 @@
src.desc = "Owned by [I.registered_name]."
else
user << "\red Access Denied"
- else if((istype(W, /obj/item/weapon/card/emag)) && !src.broken)
- emag_act()
+ else if((istype(W, /obj/item/weapon/card/emag) || istype(W, /obj/item/weapon/melee/energy/blade)) && !broken)
+ emag_act(user)
else
user << "\red Access Denied"
return
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
index 16bc29de13e..9dd81f658ec 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
@@ -77,20 +77,21 @@
user.drop_item()
if(W)
W.loc = src.loc
- else if((istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade)) && !src.broken)
- emag_act()
+ else if((istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade)) && !broken)
+ emag_act(user)
else if(istype(W,/obj/item/stack/packageWrap) || istype(W,/obj/item/weapon/weldingtool))
return ..(W,user)
else
togglelock(user)
-/obj/structure/closet/secure_closet/emag_act()
- broken = 1
- locked = 0
- desc = "It appears to be broken."
- icon_state = icon_off
- flick(icon_broken, src)
- usr<< "You unlock \the [src]."
+/obj/structure/closet/secure_closet/emag_act(user as mob)
+ if(!broken)
+ broken = 1
+ locked = 0
+ desc = "It appears to be broken."
+ icon_state = icon_off
+ flick(icon_broken, src)
+ user << "You unlock \the [src]."
/obj/structure/closet/secure_closet/attack_hand(mob/user as mob)
src.add_fingerprint(user)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index cf6e23615e2..8a7202b1925 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -82,6 +82,9 @@
if(istype(W, /obj/item/weapon/rcs) && !src.opened)
var/obj/item/weapon/rcs/E = W
if(E.rcharges != 0)
+ if(!(src.z in config.player_levels))
+ user << "The rapid-crate-sender can't locate any telepads!"
+ return
if(E.mode == 0)
if(!E.teleporting)
var/list/L = list()
@@ -294,23 +297,24 @@
/obj/structure/closet/crate/secure/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(is_type_in_list(W, list(/obj/item/stack/packageWrap, /obj/item/stack/cable_coil, /obj/item/device/radio/electropack, /obj/item/weapon/wirecutters)))
return ..()
- if(locked && (istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade)))
- emag_act()
+ if((istype(W, /obj/item/weapon/card/emag) || istype(W, /obj/item/weapon/melee/energy/blade)))
+ emag_act(user)
return
if(!opened)
src.togglelock(user)
return
return ..()
-/obj/structure/closet/crate/secure/emag_act()
- overlays += sparks
- spawn(6) overlays -= sparks //Tried lots of stuff but nothing works right. so i have to use this *sadface*
- playsound(src.loc, "sparks", 60, 1)
- src.locked = 0
- src.broken = 1
- update_icon()
- usr << "You unlock \the [src]."
- return
+/obj/structure/closet/crate/secure/emag_act(user as mob)
+ if(locked)
+ overlays += sparks
+ spawn(6) overlays -= sparks //Tried lots of stuff but nothing works right. so i have to use this *sadface*
+ playsound(src.loc, "sparks", 60, 1)
+ src.locked = 0
+ src.broken = 1
+ update_icon()
+ user << "You unlock \the [src]."
+ return
/obj/structure/closet/crate/secure/emp_act(severity)
for(var/obj/O in src)
diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm
index 63dbfac240c..013d4d56a98 100644
--- a/code/modules/mob/living/carbon/give.dm
+++ b/code/modules/mob/living/carbon/give.dm
@@ -48,8 +48,8 @@
I.add_fingerprint(target)
src.update_inv_l_hand()
src.update_inv_r_hand()
- usr.update_inv_l_hand()
- usr.update_inv_r_hand()
+ target.update_inv_l_hand()
+ target.update_inv_r_hand()
target.visible_message(" [usr.name] handed \the [I.name] to [target.name].")
if("No")
target.visible_message(" [usr.name] tried to hand [I.name] to [target.name] but [target.name] didn't want it.")
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index c189c1e19ff..3782a996a3f 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -61,7 +61,6 @@ var/list/ai_verbs_default = list(
var/obj/item/device/pda/ai/aiPDA = null
var/obj/item/device/multitool/aiMulti = null
var/custom_sprite = 0 //For our custom sprites
- var/alienAI = 0
var/obj/item/device/radio/headset/heads/ai_integrated/aiRadio = null
diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm
index aa738458144..80dbd9811b4 100644
--- a/code/modules/mob/living/silicon/pai/software_modules.dm
+++ b/code/modules/mob/living/silicon/pai/software_modules.dm
@@ -479,16 +479,26 @@
id = "translator"
toggle(mob/living/silicon/pai/user)
- // Sol Common, Tradeband and Gutter are added with New() and are therefore the current default, always active languages
+ // Galactic Common, Sol Common, Tradeband, Gutter and Trinary are added with New() and are therefore the current default, always active languages
user.translator_on = !user.translator_on
if(user.translator_on)
user.add_language("Sinta'unathi")
user.add_language("Siik'tajr")
user.add_language("Skrellian")
+ user.add_language("Vox-pidgin")
+ user.add_language("Rootspeak")
+ user.add_language("Chittin")
+ user.add_language("Bubblish")
+ user.add_language("Clownish")
else
user.remove_language("Sinta'unathi")
user.remove_language("Siik'tajr")
user.remove_language("Skrellian")
+ user.remove_language("Vox-pidgin")
+ user.remove_language("Rootspeak")
+ user.remove_language("Chittin")
+ user.remove_language("Bubblish")
+ user.remove_language("Clownish")
is_active(mob/living/silicon/pai/user)
return user.translator_on
diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm
index 6aa5a5c7f38..d813c425acb 100644
--- a/code/modules/ninja/energy_katana.dm
+++ b/code/modules/ninja/energy_katana.dm
@@ -23,7 +23,7 @@
playsound(user, "sparks", 50, 1)
playsound(user, 'sound/weapons/blade1.ogg', 50, 1)
user.visible_message("[user] masterfully slices [target]!", "You masterfully slice [target]!")
- target.emag_act()
+ target.emag_act(user)
sleep(15)
cooldown = 0
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index d9dcfd5cfc6..290e6a428c1 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -37,6 +37,11 @@
icon_state = "pen_red"
colour = "red"
+/obj/item/weapon/pen/gray
+ name = "gray-ink pen"
+ desc = "It's a normal gray ink pen."
+ colour = "gray"
+
/obj/item/weapon/pen/invisible
desc = "It's an invisble pen marker."
icon_state = "pen"
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 26443a74569..cc6a7c9de42 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -158,15 +158,7 @@
/obj/machinery/photocopier/proc/copy(var/obj/item/weapon/paper/copy)
var/obj/item/weapon/paper/c = new /obj/item/weapon/paper (loc)
- if(toner > 10) //lots of toner, make it dark
- c.info = ""
- else //no toner? shitty copies for you!
- c.info = ""
- var/copied = html_decode(copy.info)
- copied = replacetext(copied, ""
+ c.info = copy.info
c.name = copy.name // -- Doohl
c.fields = copy.fields
c.stamps = copy.stamps
@@ -197,7 +189,16 @@
/obj/machinery/photocopier/proc/photocopy(var/obj/item/weapon/photo/photocopy)
var/obj/item/weapon/photo/p = new /obj/item/weapon/photo (loc)
p.name = photocopy.name
- p.icon = photocopy.icon
+ var/icon/I = icon(photocopy.icon, photocopy.icon_state)
+ if(toner > 10) //plenty of toner, go straight greyscale
+ I.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) //I'm not sure how expensive this is, but given the many limitations of photocopying, it shouldn't be an issue.
+ p.img.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
+ p.tiny.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
+ else //not much toner left, lighten the photo
+ I.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100))
+ p.img.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100))
+ p.tiny.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100))
+ p.icon = I
p.tiny = photocopy.tiny
p.img = photocopy.img
p.desc = photocopy.desc
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index c5c7eb6cc7c..7fa8d646e47 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -215,4 +215,9 @@
update_icon()
else
user << "You need at least ten lengths of cable if you want to make a sling."
- return
\ No newline at end of file
+ return
+
+/obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/sawoff(mob/user as mob)
+ user << "Shortening \the [src] will break it."
+ return
+
\ No newline at end of file
diff --git a/code/modules/research/designs/equipment_designs.dm b/code/modules/research/designs/equipment_designs.dm
index 2ae82c353ed..b2fbfcc736d 100644
--- a/code/modules/research/designs/equipment_designs.dm
+++ b/code/modules/research/designs/equipment_designs.dm
@@ -58,8 +58,8 @@
req_tech = list("materials" = 5, "magnets" = 5, "engineering" = 4)
build_type = PROTOLATHE
materials = list("$metal" = 300, "$glass" = 400, "$plasma" = 250, "$uranium" = 1000)
- build_path = /obj/item/clothing/glasses/meson
- category = list("Mining")
+ build_path = /obj/item/clothing/glasses/meson/night
+ category = list("Equipment")
/datum/design/mesons
name = "Optical Meson Scanners"
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index d901423368b..5425323b27c 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -252,8 +252,8 @@ won't update every console in existence) but it's more of a hassle to do. Also,
screen = 2.1
else if(href_list["maxresearch"]) //Eject the item inside the destructive analyzer.
- if(!usr.client.holder) return
- if(usr.client.holder & R_MENTOR) return
+ if(!check_rights(R_ADMIN))
+ return
screen = 0.0
if(alert("Are you sure you want to maximize research levels?","Confirmation","Yes","No")=="No")
return
@@ -769,7 +769,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "Disconnect from Research Network
"
dat += "Device Linkage Menu
"
dat += "Lock Console
"
- if(user.client.holder)
+ if(check_rights(R_ADMIN))
dat += "\[ADMIN\] Maximize Research Levels
"
dat += "Reset R&D Database"
diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm
index 9aefbc23297..b2645dc5d55 100644
--- a/code/modules/telesci/telepad.dm
+++ b/code/modules/telesci/telepad.dm
@@ -127,6 +127,7 @@
/obj/item/weapon/rcs/Destroy()
processing_objects.Remove(src)
..()
+
/obj/item/weapon/rcs/process()
if(rcharges > 10)
rcharges = 10