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)