diff --git a/code/game/gamemodes/events/space_ninja.dm b/code/game/gamemodes/events/space_ninja.dm
index 97bb3e2404..1bf2406db5 100644
--- a/code/game/gamemodes/events/space_ninja.dm
+++ b/code/game/gamemodes/events/space_ninja.dm
@@ -531,7 +531,19 @@ As such, it's hard-coded for now. No reason for it not to be, really.
else
equip_to_slot_or_del(new /obj/item/clothing/under/color/black(src), slot_w_uniform)
- equip_to_slot_or_del(new /obj/item/weapon/rig/light/ninja(src), slot_back)
+ var/obj/item/weapon/rig/light/ninja/ninjasuit = new(src)
+
+ // Make sure the ninja can actually equip the suit.
+ if(src.dna && src.dna.unique_enzymes)
+ src << "Suit hardware locked to your DNA hash."
+ ninjasuit.locked_dna = src.dna.unique_enzymes
+ else
+ ninjasuit.req_access = list()
+
+ equip_to_slot_or_del(ninjasuit,slot_back)
+ spawn(10)
+ ninjasuit.toggle_seals(src,1)
+
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/voice/space_ninja(src), slot_wear_mask)
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_belt)
equip_to_slot_or_del(new /obj/item/weapon/tank/oxygen(src), slot_s_store)
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index 0eec83e449..41c02cba10 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -63,6 +63,7 @@
var/malfunction_delay = 0
var/electrified = 0
var/locked_down = 0
+ var/locked_dna = null
var/sealing // Keeps track of seal status independantly of canremove.
var/offline = 1 // Should we be applying suit maluses?
@@ -139,12 +140,6 @@
piece.siemens_coefficient = siemens_coefficient
piece.permeability_coefficient = permeability_coefficient
- spawn(1)
- var/mob/M = loc
- if(istype(M))
- toggle_seals(M,1)
- update_icon()
-
/obj/item/weapon/rig/Del()
for(var/obj/item/piece in list(gloves,boots,helmet,chest))
var/mob/living/M = piece.loc
@@ -171,9 +166,6 @@
if(sealing) return
- if(M && !(istype(M) && M.back == src ) && !istype(M,/mob/living/silicon))
- return 0
-
if(!check_power_cost(M))
return 0
@@ -189,19 +181,13 @@
M << "The suit flashes an error light. It can't function properly without being fully deployed."
failed_to_seal = 1
- if(!failed_to_seal && instant)
- for(var/obj/item/piece in list(helmet,boots,gloves,chest))
- if(!piece) continue
- piece.icon_state = "[initial(icon_state)]_sealed"
- update_icon()
+ if(!failed_to_seal)
- else if(!failed_to_seal)
-
- M << "With a quiet hum, the suit begins running checks and adjusting components."
-
- if(!do_after(M,SEAL_DELAY))
- if(M) M << "You must remain still while the suit is adjusting the components."
- failed_to_seal = 1
+ if(!instant)
+ M << "With a quiet hum, the suit begins running checks and adjusting components."
+ if(!do_after(M,SEAL_DELAY))
+ if(M) M << "You must remain still while the suit is adjusting the components."
+ failed_to_seal = 1
if(!M)
failed_to_seal = 1
@@ -222,7 +208,12 @@
failed_to_seal = 1
break
- if(M.back == src && piece == compare_piece && do_after(M,SEAL_DELAY))
+ if(M.back == src && piece == compare_piece)
+
+ if(!instant)
+ if(!do_after(M,SEAL_DELAY))
+ failed_to_seal = 1
+
piece.icon_state = "[initial(icon_state)][!seal_target ? "_sealed" : ""]"
switch(msg_type)
if("boots")
@@ -292,6 +283,10 @@
piece.flags |= AIRTIGHT
update_icon(1)
+ if(instant && air_supply)
+ wearer.internals = air_supply
+ wearer.internals.icon_state = "internal1"
+
/obj/item/weapon/rig/process()
if(!istype(wearer) || loc != wearer || wearer.back != src || canremove || !cell || cell.charge <= 0)
@@ -477,45 +472,59 @@
wearer.update_inv_back()
return
+/obj/item/weapon/rig/proc/check_suit_access(var/mob/living/carbon/human/user)
+
+ if(!security_check_enabled)
+ return 1
+
+ if(istype(user))
+ if(user.back != src)
+ return 0
+ if(locked_dna)
+ if(!user.dna || user.dna.unique_enzymes != locked_dna)
+ user << "DNA scan mismatch. Access denied."
+ return 0
+ else if(!src.allowed(user))
+ user << "Unauthorized user. Access denied."
+ return 0
+
+ else if(user.loc && user.loc.loc && istype(user.loc.loc,/obj/item/rig_module/ai_container))
+ if(!ai_override_enabled)
+ user << "Synthetic access disabled. Please consult hardware provider."
+ return 0
+
+ return 1
+
/obj/item/weapon/rig/Topic(href,href_list)
- var/mob/living/carbon/human/H = usr
+ if(!check_suit_access(usr))
+ return
- if((istype(H) && H.back == src) || (istype(H,/mob/living/silicon)))
+ if(href_list["toggle_piece"])
+ toggle_piece(href_list["toggle_piece"], usr)
+ else if(href_list["toggle_seals"])
+ toggle_seals(usr)
+ else if(href_list["interact_module"])
- if(istype(H,/mob/living/silicon))
- if(!ai_override_enabled)
- usr << "Synthetic access disabled. Please consult hardware provider."
- return
- else if(security_check_enabled && !src.allowed(usr))
- usr << "Access denied."
- return
+ var/module_index = text2num(href_list["interact_module"])
- if(href_list["toggle_piece"])
- toggle_piece(href_list["toggle_piece"], H)
- else if(href_list["toggle_seals"])
- toggle_seals(H)
- else if(href_list["interact_module"])
-
- var/module_index = text2num(href_list["interact_module"])
-
- if(module_index > 0 && module_index <= installed_modules.len)
- var/obj/item/rig_module/module = installed_modules[module_index]
- switch(href_list["module_mode"])
- if("activate")
- module.activate()
- if("deactivate")
- module.deactivate()
- if("engage")
- module.engage()
- if("select")
- selected_module = module
- if("select_charge_type")
- module.charge_selected = href_list["charge_type"]
- else if(href_list["toggle_ai_control"])
- ai_override_enabled = !ai_override_enabled
- else if(href_list["toggle_suit_lock"])
- locked = !locked
+ if(module_index > 0 && module_index <= installed_modules.len)
+ var/obj/item/rig_module/module = installed_modules[module_index]
+ switch(href_list["module_mode"])
+ if("activate")
+ module.activate()
+ if("deactivate")
+ module.deactivate()
+ if("engage")
+ module.engage()
+ if("select")
+ selected_module = module
+ if("select_charge_type")
+ module.charge_selected = href_list["charge_type"]
+ else if(href_list["toggle_ai_control"])
+ ai_override_enabled = !ai_override_enabled
+ else if(href_list["toggle_suit_lock"])
+ locked = !locked
usr.set_machine(src)
src.add_fingerprint(usr)
diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
index 26a2621e2c..1b54b8f1ee 100644
--- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
@@ -20,6 +20,7 @@
user << "It looks like the locking system has been shorted out."
return
else if(istype(W, /obj/item/weapon/card/emag))
+ locked_dna = null
req_access = null
req_one_access = null
locked = 0
diff --git a/code/modules/clothing/spacesuits/rig/rig_verbs.dm b/code/modules/clothing/spacesuits/rig/rig_verbs.dm
index 5347bbc5b9..9ec6f03df7 100644
--- a/code/modules/clothing/spacesuits/rig/rig_verbs.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_verbs.dm
@@ -27,8 +27,7 @@
usr << "The suit is not active."
return
- if((security_check_enabled && !src.allowed(wearer)) || control_overridden)
- wearer << "Access denied."
+ if(!check_suit_access(usr))
return
if(!visor)
@@ -51,8 +50,7 @@
usr << "The hardsuit is not being worn."
return
- if((security_check_enabled && !src.allowed(wearer)) || control_overridden)
- wearer << "Access denied."
+ if(!check_suit_access(usr))
return
toggle_piece("helmet",wearer)
@@ -64,8 +62,7 @@
set category = "Hardsuit"
set src = usr.contents
- if((security_check_enabled && !src.allowed(wearer)) || control_overridden)
- wearer << "Access denied."
+ if(!check_suit_access(usr))
return
toggle_piece("chest",wearer)
@@ -81,8 +78,7 @@
usr << "The hardsuit is not being worn."
return
- if((security_check_enabled && !src.allowed(wearer)) || control_overridden)
- wearer << "Access denied."
+ if(!check_suit_access(usr))
return
toggle_piece("gauntlets",wearer)
@@ -98,8 +94,7 @@
usr << "The hardsuit is not being worn."
return
- if((security_check_enabled && !src.allowed(wearer)) || control_overridden)
- wearer << "Access denied."
+ if(!check_suit_access(usr))
return
toggle_piece("boots",wearer)
@@ -115,8 +110,7 @@
usr << "The hardsuit is not being worn."
return
- if((security_check_enabled && !src.allowed(wearer)) || control_overridden)
- wearer << "Access denied."
+ if(!check_suit_access(usr))
return
if(!check_power_cost(usr))
@@ -135,8 +129,7 @@
usr << "The hardsuit is not being worn."
return
- if((security_check_enabled && !src.allowed(wearer)) || control_overridden)
- wearer << "Access denied."
+ if(!check_suit_access(usr))
return
toggle_seals(wearer)