RIGsuit fixes

- Replaced /proc/toggle_seals with /proc/unseal and /proc/seal
- You can no longer retract anything but the helmet after you seal the
  suit (what the fuck was the point of having the seal if it does nothing
  but make it latch onto your back)
- Clicking on parts and popping them off shouldn't be a thing anymore
  (hopefully)
- Rewrote some of the nasty toggle_piece code.
This commit is contained in:
Tigercat2000
2016-04-20 15:40:16 -07:00
parent 8e36e2ade5
commit 9917906834
2 changed files with 265 additions and 183 deletions
+257 -165
View File
@@ -190,112 +190,217 @@
piece.flags &= ~(STOPSPRESSUREDMAGE|AIRTIGHT)
update_icon(1)
/obj/item/weapon/rig/proc/toggle_seals(var/mob/living/carbon/human/M, var/mob/living/user, var/instant)
if(sealing) return
if(!check_power_cost(M, 1)) //costs tiny amount of power to unseal/seal
/obj/item/weapon/rig/proc/seal(mob/living/user)
if(sealing)
return 0
deploy(M, instant)
if(!wearer || !user)
return
var/seal_target = (flags & NODROP)
var/failed_to_seal
var/sealed = (flags & NODROP)
if(sealed)
to_chat(user, "<span class='danger'>\The [src] is already sealed!</span>")
return 0
flags |= NODROP // No removing the suit while unsealing.
sealing = 1
if(!check_power_cost(user, 1)) //need power to seal the suit
return 0
if(!seal_target && !suit_is_deployed())
M.visible_message("<span class='danger'>[M]'s suit flashes an error light.</span>","<span class='danger'>Your suit flashes an error light. It can't function properly without being fully deployed.</span>")
failed_to_seal = 1
var/failed_to_seal = FALSE
if(!suit_is_deployed())
to_chat(user, "<span class='danger'>\The [src] cannot seal, as it is not fully deployed!</span>")
return 0
flags |= NODROP
sealing = TRUE
to_chat(user, "<span class='notice'>\The [src] begins to tighten it's seals.</span>")
wearer.visible_message("<span class='notice'>\The [wearer]'s suit emits a quiet hum as it begins to tighten it's seals.</span>",
"<span class='notice'>With a quiet hum, your suit begins to seal.")
if(seal_delay && !do_after(user, seal_delay, target = wearer))
to_chat(user, "<span class='warning'>You must remain still to seal \the [src]!</span>")
failed_to_seal = TRUE
if(!failed_to_seal)
deploy(user)
if(!instant)
M.visible_message("<font color='blue'>[M]'s suit emits a quiet hum as it begins to adjust its seals.</font>","<font color='blue'>With a quiet hum, the suit begins running checks and adjusting components.</font>")
if(seal_delay && !do_after(user, seal_delay, target = M))
if(user)
to_chat(user, "<span class='warning'>You must remain still while the suit is adjusting the components.</span>")
failed_to_seal = 1
var/list/pieces_data = list(list(wearer.shoes, boots, "boots", boot_type),
list(wearer.gloves, gloves, "gloves", glove_type),
list(wearer.head, helmet, "helmet", helm_type),
list(wearer.wear_suit, chest, "chest", chest_type))
if(!M)
failed_to_seal = 1
else
for(var/list/piece_data in list(list(M.shoes,boots,"boots",boot_type),list(M.gloves,gloves,"gloves",glove_type),list(M.head,helmet,"helmet",helm_type),list(M.wear_suit,chest,"chest",chest_type)))
for(var/list/piece_data in pieces_data)
var/obj/item/user_piece = piece_data[1]
var/obj/item/correct_piece = piece_data[2]
var/msg_type = piece_data[3]
var/piece_type = piece_data[4]
var/obj/item/piece = piece_data[1]
var/obj/item/compare_piece = piece_data[2]
var/msg_type = piece_data[3]
var/piece_type = piece_data[4]
if(!user_piece || !piece_type)
continue
if(!piece || !piece_type)
continue
if(user_piece != correct_piece)
to_chat(user, "<span class='danger'>\The [user_piece] is blocking \the [src] from deploying.</span>")
failed_to_seal = TRUE
if(!istype(M) || !istype(piece) || !istype(compare_piece) || !msg_type)
if(M)
to_chat(M, "<span class='warning'>You must remain still while the suit is adjusting the components.</span>")
failed_to_seal = 1
break
if(seal_delay && !do_after(user, seal_delay, needhand = 0, target = wearer))
to_chat(user, "<span class='warning'>You must remain still to seal \the [src]!</span>")
failed_to_seal = TRUE
if(!failed_to_seal && M.back == src && piece == compare_piece)
if(failed_to_seal)
break
if(seal_delay && !instant && !do_after(user, seal_delay, needhand = 0, target = M))
failed_to_seal = 1
correct_piece.icon_state = "[initial(icon_state)]_sealed"
switch(msg_type)
if("boots")
to_chat(wearer, "<font color='blue'>\The [correct_piece] seal around your feet.</font>")
if(user != wearer)
to_chat(user, "<span class='notice'>\The [correct_piece] has been sealed.</span>")
wearer.update_inv_shoes()
if("gloves")
to_chat(wearer, "<font color='blue'>\The [correct_piece] tighten around your fingers and wrists.</font>")
if(user != wearer)
to_chat(user, "<span class='notice'>\The [correct_piece] has been sealed.</span>")
wearer.update_inv_gloves()
if("chest")
to_chat(wearer, "<font color='blue'>\The [correct_piece] cinches tight again your chest.</font>")
if(user != wearer)
to_chat(user, "<span class='notice'>\The [correct_piece] has been sealed.</span>")
wearer.update_inv_wear_suit()
if("helmet")
to_chat(wearer, "<font color='blue'>\The [correct_piece] hisses closed.</font>")
if(user != wearer)
to_chat(user, "<span class='notice'>\The [correct_piece] has been sealed.</span>")
wearer.update_inv_head()
if(helmet)
helmet.update_light(wearer)
piece.icon_state = "[initial(icon_state)][!seal_target ? "_sealed" : ""]"
switch(msg_type)
if("boots")
to_chat(M, "<font color='blue'>\The [piece] [!seal_target ? "seal around your feet" : "relax their grip on your legs"].</font>")
M.update_inv_shoes()
if("gloves")
to_chat(M, "<font color='blue'>\The [piece] [!seal_target ? "tighten around your fingers and wrists" : "become loose around your fingers"].</font>")
M.update_inv_gloves()
if("chest")
to_chat(M, "<font color='blue'>\The [piece] [!seal_target ? "cinches tight again your chest" : "releases your chest"].</font>")
M.update_inv_wear_suit()
if("helmet")
to_chat(M, "<font color='blue'>\The [piece] hisses [!seal_target ? "closed" : "open"].</font>")
M.update_inv_head()
if(helmet)
helmet.update_light(wearer)
correct_piece.armor["bio"] = 100
//sealed pieces become airtight, protecting against diseases
if (!seal_target)
piece.armor["bio"] = 100
else
piece.armor["bio"] = src.armor["bio"]
else
failed_to_seal = 1
if((M && !(istype(M) && M.back == src) && !istype(M,/mob/living/silicon)) || (!seal_target && !suit_is_deployed()))
failed_to_seal = 1
sealing = null
sealing = FALSE
if(failed_to_seal)
for(var/obj/item/piece in list(helmet,boots,gloves,chest))
if(!piece) continue
piece.icon_state = "[initial(icon_state)][!seal_target ? "" : "_sealed"]"
if(seal_target)
flags |= NODROP
else
flags &= ~NODROP
for(var/obj/item/piece in list(helmet, boots, gloves, chest))
if(!piece)
continue
piece.icon_state = "[initial(icon_state)]"
flags &= ~NODROP
if(airtight)
update_component_sealed()
update_icon(1)
return 0
// Success!
if(seal_target)
flags &= ~NODROP
else
flags |= NODROP
to_chat(M, "<font color='blue'><b>Your entire suit [!(flags & NODROP) ? "loosens as the components relax" : "tightens around you as the components lock into place"].</b></font>")
if(user != wearer)
to_chat(user, "<span class='notice'>\The [src] has been loosened.</span>")
to_chat(wearer, "<span class='notice'>Your entire suit tightens around you as the components lock into place.</span>")
if(airtight)
update_component_sealed()
update_icon(1)
/obj/item/weapon/rig/proc/unseal(mob/living/user)
if(sealing)
return 0
if(!wearer || !user)
return
var/sealed = (flags & NODROP)
if(!sealed)
to_chat(user, "<span class='danger'>\The [src] is already unsealed!</span>")
return 0
sealing = TRUE
var/failed_to_seal = FALSE
if(!suit_is_deployed())
to_chat(user, "<span class='danger'>\The [src] cannot unseal, as it is not fully deployed!</span>")
failed_to_seal = TRUE
if(!failed_to_seal)
if(user != wearer)
to_chat(user, "<span class='notice'>\The [src] begins to loosen it's seals.</span>")
wearer.visible_message("<span class='notice'>\The [wearer]'s suit emits a quiet hum as it begins to loosen it's seals.</span>",
"<span class='notice'>With a quiet hum, your suit begins to unseal.")
if(seal_delay && !do_after(user, seal_delay, target = wearer))
to_chat(user, "<span class='warning'>You must remain still to unseal \the [src]!</span>")
failed_to_seal = TRUE
if(!failed_to_seal)
var/list/pieces_data = list(list(wearer.shoes, boots, "boots", boot_type),
list(wearer.gloves, gloves, "gloves", glove_type),
list(wearer.head, helmet, "helmet", helm_type),
list(wearer.wear_suit, chest, "chest", chest_type))
for(var/list/piece_data in pieces_data)
var/obj/item/user_piece = piece_data[1]
var/obj/item/correct_piece = piece_data[2]
var/msg_type = piece_data[3]
var/piece_type = piece_data[4]
if(!correct_piece || !piece_type)
continue
if(user_piece != correct_piece)
to_chat(user, "<span class='danger'>\The [user_piece] is blocking \the [src] from deploying.</span>")
failed_to_seal = TRUE
if(seal_delay && !do_after(user, seal_delay, needhand = 0, target = wearer))
to_chat(user, "<span class='warning'>You must remain still to unseal \the [src]!</span>")
failed_to_seal = TRUE
if(failed_to_seal)
break
correct_piece.icon_state = "[initial(icon_state)]"
switch(msg_type)
if("boots")
to_chat(wearer, "<font color='blue'>\The [correct_piece] relax their grip on your legs.</font>")
if(user != wearer)
to_chat(user, "<span class='notice'>\The [correct_piece] has been unsealed.</span>")
wearer.update_inv_shoes()
if("gloves")
to_chat(wearer, "<font color='blue'>\The [correct_piece] become loose around your fingers.</font>")
if(user != wearer)
to_chat(user, "<span class='notice'>\The [correct_piece] has been unsealed.</span>")
wearer.update_inv_gloves()
if("chest")
to_chat(wearer, "<font color='blue'>\The [correct_piece] releases your chest.</font>")
if(user != wearer)
to_chat(user, "<span class='notice'>\The [correct_piece] has been unsealed.</span>")
wearer.update_inv_wear_suit()
if("helmet")
to_chat(wearer, "<font color='blue'>\The [correct_piece] hisses open.</font>")
if(user != wearer)
to_chat(user, "<span class='notice'>\The [correct_piece] has been unsealed.</span>")
wearer.update_inv_head()
if(helmet)
helmet.update_light(wearer)
correct_piece.armor["bio"] = armor["bio"]
sealing = FALSE
if(failed_to_seal)
for(var/obj/item/piece in list(helmet, boots, gloves, chest))
if(!piece)
continue
piece.icon_state = "[initial(icon_state)]_sealed"
if(airtight)
update_component_sealed()
update_icon(1)
return 0
if(user != wearer)
to_chat(user, "<span class='notice'>\The [src] has been unsealed.</span>")
to_chat(wearer, "<span class='notice'>Your entire suit loosens as the components relax.</span>")
flags &= ~NODROP
for(var/obj/item/rig_module/module in installed_modules)
module.deactivate()
if(!(flags & NODROP))
for(var/obj/item/rig_module/module in installed_modules)
module.deactivate()
if(airtight)
update_component_sealed()
update_icon(1)
@@ -310,7 +415,6 @@
piece.flags |= AIRTIGHT
/obj/item/weapon/rig/process()
// If we've lost any parts, grab them back.
var/mob/living/M
for(var/obj/item/piece in list(gloves,boots,helmet,chest))
@@ -367,7 +471,6 @@
cell.use(module.process()*10)
/obj/item/weapon/rig/proc/check_power_cost(var/mob/living/user, var/cost, var/use_unconcious, var/obj/item/rig_module/mod, var/user_is_ai)
if(!istype(user))
return 0
@@ -524,7 +627,6 @@
return 1
//TODO: Fix Topic vulnerabilities for malfunction and AI override.
/obj/item/weapon/rig/Topic(href,href_list)
if(!check_suit_access(usr))
return 0
@@ -532,11 +634,13 @@
if(href_list["toggle_piece"])
if(ishuman(usr) && (usr.stat || usr.stunned || usr.lying))
return 0
toggle_piece(href_list["toggle_piece"], wearer, user = usr)
toggle_piece(href_list["toggle_piece"], usr)
else if(href_list["toggle_seals"])
toggle_seals(wearer, usr)
if(flags & NODROP)
unseal(usr)
else
seal(usr)
else if(href_list["interact_module"])
var/module_index = text2num(href_list["interact_module"])
if(module_index > 0 && module_index <= installed_modules.len)
@@ -559,7 +663,7 @@
locked = !locked
usr.set_machine(src)
src.add_fingerprint(usr)
add_fingerprint(usr)
return 0
/obj/item/weapon/rig/proc/notify_ai(var/message)
@@ -570,8 +674,11 @@
if(ai && ai.client && !ai.stat)
to_chat(ai, "[message]")
/obj/item/weapon/rig/equipped(mob/living/carbon/human/M)
/obj/item/weapon/rig/equipped(mob/living/carbon/human/M, slot)
..()
if(!istype(M) || slot != slot_back)
return //we don't care about picking up/nonhumans
spawn(1) //equipped() is called BEFORE the item is actually set as the slot
if(seal_delay > 0 && istype(M) && M.back == src)
@@ -588,115 +695,100 @@
wearer.wearing_rig = src
update_icon()
/obj/item/weapon/rig/proc/toggle_piece(var/piece, var/mob/living/carbon/human/H, var/deploy_mode, var/force, var/mob/living/user)
/obj/item/weapon/rig/proc/toggle_piece(var/piece, var/mob/living/user, var/deploy_mode, var/force)
if(!istype(wearer) || wearer.back != src)
if(force) //can only force retracting sorry
for(var/obj/item/uneq_piece in list(helmet, gloves, boots, chest))
if(uneq_piece)
if(isliving(uneq_piece.loc))
var/mob/living/L = uneq_piece.loc
L.unEquip(uneq_piece, 1)
uneq_piece.flags &= ~NODROP
uneq_piece.forceMove(src)
return 0
if(!force) //forces the hardsuit to ignore most checks, as the suit being dropped should retract all pieces regardless of power status
if(sealing || !cell || !cell.charge) //or else you have issues with shit getting stuck
return
if(sealing || !cell || !cell.charge)
return 0
if(!istype(wearer) || !wearer.back == src)
return
if(usr == wearer && (usr.stat||usr.paralysis||usr.stunned)) // If the usr isn't wearing the suit it's probably an AI.
return
if(user == wearer && user.incapacitated()) // If the user isn't wearing the suit it's probably an AI.
return 0
var/obj/item/check_slot
var/equip_to
var/obj/item/use_obj
if(!H)
return
switch(piece)
if("helmet")
equip_to = slot_head
use_obj = helmet
check_slot = H.head
check_slot = wearer.head
if("gauntlets")
equip_to = slot_gloves
use_obj = gloves
check_slot = H.gloves
check_slot = wearer.gloves
if("boots")
equip_to = slot_shoes
use_obj = boots
check_slot = H.shoes
check_slot = wearer.shoes
if("chest")
equip_to = slot_wear_suit
use_obj = chest
check_slot = H.wear_suit
check_slot = wearer.wear_suit
if(use_obj)
if(check_slot == use_obj && deploy_mode != ONLY_DEPLOY)
var/mob/living/carbon/human/holder
if(use_obj)
holder = use_obj.loc
if(istype(holder))
if(use_obj && check_slot == use_obj)
to_chat(H, "<font color='blue'><b>Your [use_obj.name] [use_obj.gender == PLURAL ? "retract" : "retracts"] swiftly.</b></font>")
use_obj.flags &= ~NODROP
holder.unEquip(use_obj, 1)
use_obj.forceMove(src)
else if (deploy_mode != ONLY_RETRACT)
if(check_slot)
if(check_slot != use_obj)
to_chat(H, "<span class='danger'>You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way.</span>")
if(check_slot == use_obj && deploy_mode != ONLY_DEPLOY) //user is wearing it, retract it if not forced to deploy
if((flags & NODROP) && equip_to != slot_head && !force) //you can only retract the helmet if the suit isn't unsealed
to_chat(user, "<span class='warning'>You can't retract \the [use_obj] while the suit is sealed!</span>")
return
else
use_obj.forceMove(H)
if(isliving(use_obj.loc))
var/mob/living/L = use_obj.loc
use_obj.flags &= ~NODROP
if(!H.equip_to_slot_if_possible(use_obj, equip_to, 0, 1))
use_obj.forceMove(src)
else
to_chat(H, "<span class='notice'>Your [use_obj.name] [use_obj.gender == PLURAL ? "deploy" : "deploys"] swiftly.</span>")
use_obj.flags |= NODROP
L.unEquip(use_obj, 1)
use_obj.forceMove(src)
to_chat(wearer, "<span class='notice'>Your [use_obj] [use_obj.gender == PLURAL ? "retract" : "retracts"] swiftly.")
else if(deploy_mode != ONLY_RETRACT)
if(check_slot && check_slot != use_obj)
to_chat(wearer, "<span class='danger'>You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way.</span>")
return
use_obj.forceMove(wearer)
use_obj.flags &= ~NODROP
if(!wearer.equip_to_slot_if_possible(use_obj, equip_to, 0, 1))
use_obj.forceMove(src)
else
to_chat(wearer, "<span class='notice'>Your [use_obj.name] [use_obj.gender == PLURAL ? "deploy" : "deploys"] swiftly.</span>")
use_obj.flags |= NODROP
if(piece == "helmet" && helmet)
helmet.update_light(H)
helmet.update_light(wearer)
/obj/item/weapon/rig/proc/deploy(mob/M,var/sealed, mob/user)
/obj/item/weapon/rig/proc/deploy(mob/user)
if(!wearer || !user)
return 0
var/mob/living/carbon/human/H = M
if(flags & NODROP)
if(wearer.head && wearer.head != helmet)
to_chat(user, "<span class='danger'>\The [wearer.head] is blocking \the [src] from deploying!</span>")
return 0
if(wearer.gloves && wearer.gloves != gloves)
to_chat(user, "<span class='danger'>\The [wearer.gloves] is preventing \the [src] from deploying!</span>")
return 0
if(wearer.shoes && wearer.shoes != boots)
to_chat(user, "<span class='danger'>\The [wearer.shoes] is preventing \the [src] from deploying!</span>")
return 0
if(wearer.wear_suit && wearer.wear_suit != chest)
to_chat(user, "<span class='danger'>\The [wearer.wear_suit] is preventing \the [src] from deploying!</span>")
return 0
if(!H || !istype(H)) return
if(H.back != src)
return
if(sealed)
if(H.head)
var/obj/item/garbage = H.head
H.unEquip(garbage)
H.head = null
qdel(garbage)
if(H.gloves)
var/obj/item/garbage = H.gloves
H.unEquip(garbage)
H.gloves = null
qdel(garbage)
if(H.shoes)
var/obj/item/garbage = H.shoes
H.unEquip(garbage)
H.shoes = null
qdel(garbage)
if(H.wear_suit)
var/obj/item/garbage = H.wear_suit
H.unEquip(garbage)
H.wear_suit = null
qdel(garbage)
for(var/piece in list("helmet","gauntlets","chest","boots"))
toggle_piece(piece, wearer, ONLY_DEPLOY, user = user)
for(var/piece in list("helmet", "gauntlets", "chest", "boots"))
toggle_piece(piece, user, ONLY_DEPLOY)
/obj/item/weapon/rig/dropped(var/mob/user)
..()
for(var/piece in list("helmet","gauntlets","chest","boots"))
toggle_piece(piece, wearer, ONLY_RETRACT, 1, user = user)
toggle_piece(piece, user, ONLY_RETRACT, 1)
if(wearer)
wearer.wearing_rig = null
wearer = null
@@ -1,6 +1,5 @@
// Interface for humans.
/obj/item/weapon/rig/verb/hardsuit_interface()
set name = "Open Hardsuit Interface"
set desc = "Open the hardsuit system interface."
set category = "Hardsuit"
@@ -10,7 +9,6 @@
ui_interact(usr)
/obj/item/weapon/rig/verb/toggle_vision()
set name = "Toggle Visor"
set desc = "Turns your rig visor off or on."
set category = "Hardsuit"
@@ -44,7 +42,6 @@
visor.deactivate()
/obj/item/weapon/rig/proc/toggle_helmet()
set name = "Toggle Helmet"
set desc = "Deploys or retracts your helmet."
set category = "Hardsuit"
@@ -61,10 +58,9 @@
if(M.incapacitated())
return
toggle_piece("helmet",wearer, user = usr)
toggle_piece("helmet", usr)
/obj/item/weapon/rig/proc/toggle_chest()
set name = "Toggle Chestpiece"
set desc = "Deploys or retracts your chestpiece."
set category = "Hardsuit"
@@ -77,10 +73,9 @@
if(M.incapacitated())
return
toggle_piece("chest",wearer, user = usr)
toggle_piece("chest", usr)
/obj/item/weapon/rig/proc/toggle_gauntlets()
set name = "Toggle Gauntlets"
set desc = "Deploys or retracts your gauntlets."
set category = "Hardsuit"
@@ -97,10 +92,9 @@
if(M.incapacitated())
return
toggle_piece("gauntlets",wearer, user = usr)
toggle_piece("gauntlets", usr)
/obj/item/weapon/rig/proc/toggle_boots()
set name = "Toggle Boots"
set desc = "Deploys or retracts your boots."
set category = "Hardsuit"
@@ -117,10 +111,9 @@
if(M.incapacitated())
return
toggle_piece("boots",wearer, user = usr)
toggle_piece("boots", usr)
/obj/item/weapon/rig/verb/deploy_suit()
set name = "Deploy Hardsuit"
set desc = "Deploys helmet, gloves and boots."
set category = "Hardsuit"
@@ -143,7 +136,6 @@
deploy(wearer, usr)
/obj/item/weapon/rig/verb/toggle_seals_verb()
set name = "Toggle Hardsuit"
set desc = "Activates or deactivates your rig."
set category = "Hardsuit"
@@ -160,10 +152,12 @@
if(M.incapacitated())
return
toggle_seals(wearer)
if(flags & NODROP)
unseal(usr)
else
seal(usr)
/obj/item/weapon/rig/verb/switch_vision_mode()
set name = "Switch Vision Mode"
set desc = "Switches between available vision modes."
set category = "Hardsuit"
@@ -197,7 +191,6 @@
visor.engage()
/obj/item/weapon/rig/verb/alter_voice()
set name = "Configure Voice Synthesiser"
set desc = "Toggles or configures your voice synthesizer."
set category = "Hardsuit"
@@ -225,7 +218,6 @@
speech.engage()
/obj/item/weapon/rig/verb/select_module()
set name = "Select Module"
set desc = "Selects a module as your primary system."
set category = "Hardsuit"
@@ -265,7 +257,6 @@
to_chat(usr, "<font color='blue'><b>Primary system is now: [selected_module.interface_name].</b></font>")
/obj/item/weapon/rig/verb/toggle_module()
set name = "Toggle Module"
set desc = "Toggle a system module."
set category = "Hardsuit"
@@ -307,7 +298,6 @@
module.activate()
/obj/item/weapon/rig/verb/engage_module()
set name = "Engage Module"
set desc = "Engages a system module."
set category = "Hardsuit"