diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 6c587701780..119e657df15 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -166,4 +166,11 @@ /obj/item/device/aicard/proc/clear() name = "inteliCard" - update_icon() \ No newline at end of file + update_icon() + +/obj/item/device/aicard/relaymove(var/mob/user, var/direction) + if(src.loc && istype(src.loc.loc, /obj/item/rig_module)) + var/obj/item/rig_module/module = src.loc.loc + if(!module.holder || !direction) + return + module.holder.forced_move(direction) \ No newline at end of file diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 42651ea7200..887d2a65a5e 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -11,6 +11,13 @@ var/looking_for_personality = 0 var/mob/living/silicon/pai/pai +/obj/item/device/paicard/relaymove(var/mob/user, var/direction) + if(src.loc && istype(src.loc.loc, /obj/item/rig_module)) + var/obj/item/rig_module/module = src.loc.loc + if(!module.holder || !direction) + return + module.holder.forced_move(direction) + /obj/item/device/paicard/New() ..() overlays += "pai-off" diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index 2d551195ad5..024919880d2 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -15,6 +15,7 @@ icon_state = "module" matter = list("metal" = 20000, "plastic" = 30000, "glass" = 5000) + var/damage = 0 var/obj/item/weapon/rig/holder var/module_cooldown = 10 @@ -51,6 +52,60 @@ var/activate_string = "Activate" var/deactivate_string = "Deactivate" +/obj/item/rig_module/examine() + ..() + switch(damage) + if(0) + usr << "It is undamaged." + if(1) + usr << "It is badly damaged." + if(2) + usr << "It is almost completely destroyed." + +/obj/item/rig_module/attackby(obj/item/W as obj, mob/user as mob) + + if(istype(W,/obj/item/stack/nanopaste)) + + if(damage == 0) + user << "There is no damage to mend." + return + + user << "You start mending the damaged portions of \the [src]..." + + if(!do_after(user,30) || !W || !src) + return + + var/obj/item/stack/nanopaste/paste = W + damage = 0 + user << "You mend the damage to [src] with [W]." + paste.use(1) + return + + else if(istype(W,/obj/item/stack/cable_coil)) + + switch(damage) + if(0) + user << "There is no damage to mend." + return + if(2) + user << "There is no damage that you are capable of mending with such crude tools." + return + + var/obj/item/stack/cable_coil/cable = W + if(!cable.amount >= 5) + user << "You need five units of cable to repair \the [src]." + return + + user << "You start mending the damaged portions of \the [src]..." + if(!do_after(user,30) || !W || !src) + return + + damage = 1 + user << "You mend some of damage to [src] with [W], but you will need more advanced tools to fix it completely." + cable.use(5) + return + ..() + /obj/item/rig_module/New() ..() if(suit_overlay_inactive) @@ -81,6 +136,9 @@ //Proc for one-use abilities like teleport. /obj/item/rig_module/proc/engage() + if(damage >= 2) + usr << "The [interface_name] is damaged beyond use!" + if(world.time < next_use) usr << "You cannot use the [interface_name] again so soon." return 0 diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 38837b3420e..cacc290efdf 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -58,6 +58,7 @@ var/malfunctioning = 0 var/malfunction_delay = 0 var/electrified = 0 + var/locked_down = 0 var/sealing // Keeps track of seal status independantly of canremove. var/offline = 1 // Should we be applying suit maluses? @@ -410,7 +411,8 @@ "passivecost" = module.passive_power_cost*10, "engagestring" = module.engage_string, "activatestring" = module.activate_string, - "deactivatestring" = module.deactivate_string + "deactivatestring" = module.deactivate_string, + "damage" = module.damage ) if(module.charges && module.charges.len) @@ -648,6 +650,7 @@ malfunctioning += severity*10 if(malfunction_delay <= 0) malfunction_delay = 20 + take_hit(severity*10,"electrical pulse") /obj/item/weapon/rig/proc/shock(mob/user) if (electrocute_mob(user, cell, src)) @@ -655,6 +658,41 @@ return 1 return 0 +/obj/item/weapon/rig/proc/take_hit(damage,source) + + if(!installed_modules.len) + return + + if(!prob(max(0,(damage-(chest ? chest.breach_threshold : 0))))) + return + + var/list/valid_modules = list() + for(var/obj/item/rig_module/module in installed_modules) + if(module.damage < 2) + valid_modules |= module + + if(!valid_modules.len) + return + + var/obj/item/rig_module/dam_module = pick(valid_modules) + dam_module.damage++ + + if(!source) + source = "hit" + + if(wearer) + wearer << "The [source] has [dam_module.damage >= 2 ? "destroyed" : "damaged"] your [dam_module.interface_name]!" + dam_module.deactivate() + +/obj/item/weapon/rig/proc/forced_move(dir) + if(locked_down) + return 0 + if(!control_overridden) + return + if(!wearer || wearer.back != src) + return 0 + wearer.Move(null,dir) + #undef ONLY_DEPLOY #undef ONLY_RETRACT #undef SEAL_DELAY \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 0c21befe295..2997b182d80 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -355,12 +355,11 @@ This function restores all organs. if ((damage > 25 && prob(20)) || (damage > 50 && prob(60))) emote("scream") - ..(damage, damagetype, def_zone, blocked) return 1 //Handle BRUTE and BURN damage - handle_suit_punctures(damagetype, damage) + handle_suit_punctures(damagetype, damage, def_zone) if(blocked >= 2) return 0 diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 5659f44a617..cd91d77cf35 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -414,13 +414,19 @@ emp_act w_uniform.add_blood(source) update_inv_w_uniform(0) -/mob/living/carbon/human/proc/handle_suit_punctures(var/damtype, var/damage) +/mob/living/carbon/human/proc/handle_suit_punctures(var/damtype, var/damage, var/def_zone) - if(!wear_suit) return - if(!istype(wear_suit,/obj/item/clothing/suit/space)) return + // Tox and oxy don't matter to suits. if(damtype != BURN && damtype != BRUTE) return - var/obj/item/clothing/suit/space/SS = wear_suit - var/penetrated_dam = max(0,(damage - SS.breach_threshold)) // - SS.damage)) - Consider uncommenting this if suits seem too hardy on dev. + // The rig might soak this hit, if we're wearing one. + if(back && istype(back,/obj/item/weapon/rig)) + var/obj/item/weapon/rig/rig = back + rig.take_hit(damage) - if(penetrated_dam) SS.create_breaches(damtype, penetrated_dam) + // We may also be taking a suit breach. + if(!wear_suit) return + if(!istype(wear_suit,/obj/item/clothing/suit/space)) return + var/obj/item/clothing/suit/space/SS = wear_suit + var/penetrated_dam = max(0,(damage - SS.breach_threshold)) + if(penetrated_dam) SS.create_breaches(damtype, penetrated_dam) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 1d40e99acd2..c49ba3b56be 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1369,14 +1369,14 @@ seer = 0 var/tmp/glasses_processed = 0 - var/obj/item/weapon/rig/rig = back if(istype(rig) && rig.visor) - if(rig.visor.vision && rig.visor.active && rig.visor.vision.glasses) - glasses_processed = 1 - process_glasses(rig.visor.vision.glasses) + if(!rig.helmet || (head && rig.helmet == head)) + if(rig.visor && rig.visor.vision && rig.visor.active && rig.visor.vision.glasses) + glasses_processed = 1 + process_glasses(rig.visor.vision.glasses) - if(glasses) + if(glasses && !glasses_processed) glasses_processed = 1 process_glasses(glasses) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 87f149cd7bd..8d62b618e18 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -599,6 +599,21 @@ var/list/ai_verbs_default = list( //src.cameraFollow = null src.view_core() +/mob/living/silicon/ai/verb/hardsuit_interface() + set category = "AI Commands" + set name = "Open Hardsuit Interface" + + if(!src.loc || !src.loc.loc || !istype(src.loc.loc, /obj/item/rig_module)) + usr << "You are not loaded into a hardsuit." + return + + var/obj/item/rig_module/module = src.loc.loc + if(!module.holder) + usr << "Your module is not installed in a hardsuit." + return + + module.holder.ui_interact(usr) + //Replaces /mob/living/silicon/ai/verb/change_network() in ai.dm & camera.dm //Adds in /mob/living/silicon/ai/proc/ai_network_change() instead diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 68310e4d14f..3e7aeb36c23 100755 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -222,6 +222,21 @@ src.reset_view(C) return 1 +/mob/living/silicon/pai/verb/hardsuit_interface() + set category = "pAI Commands" + set name = "Open Hardsuit Interface" + + if(!src.loc || !src.loc.loc || !istype(src.loc.loc, /obj/item/rig_module)) + usr << "You are not loaded into a hardsuit." + return + + var/obj/item/rig_module/module = src.loc.loc + if(!module.holder) + usr << "Your module is not installed in a hardsuit." + return + + module.holder.ui_interact(usr) + /mob/living/silicon/pai/cancel_camera() set category = "pAI Commands" set name = "Cancel Camera View" diff --git a/nano/templates/hardsuit.tmpl b/nano/templates/hardsuit.tmpl index 3cbed0d52fc..ad0dece2dcd 100644 --- a/nano/templates/hardsuit.tmpl +++ b/nano/templates/hardsuit.tmpl @@ -148,7 +148,15 @@ Used In File(s): /code/modules/clothing/spacesuits/rig/rig.dm
- {{:value.name}} [E: {{:value.engagecost}} | A: {{:value.activecost}} | P: {{:value.passivecost}}] + {{:value.name}} + {{if value.damage > 0}} + {{if value.damage == 1}} + (damaged) + {{else}} + (destroyed) + {{/if}} + {{/if}} + [E: {{:value.engagecost}} | A: {{:value.activecost}} | P: {{:value.passivecost}}]