diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm
index d81b76e2e76..d584d5a50f5 100644
--- a/code/modules/mob/living/silicon/robot/component.dm
+++ b/code/modules/mob/living/silicon/robot/component.dm
@@ -22,8 +22,11 @@
/datum/robot_component/proc/install()
go_online()
+ owner.updatehealth("component '[src]' installed")
+
/datum/robot_component/proc/uninstall()
go_offline()
+ owner.updatehealth("component '[src]' removed")
/datum/robot_component/proc/destroy()
if(wrapped)
@@ -102,12 +105,6 @@
external_type = /obj/item/robot_parts/robot_component/actuator
max_damage = 50
-/datum/robot_component/actuator/go_online()
- owner.update_stat()
-
-/datum/robot_component/actuator/go_offline()
- owner.update_stat()
-
/datum/robot_component/cell
name = "power cell"
max_damage = 50
@@ -115,12 +112,6 @@
/datum/robot_component/cell/is_powered()
return ..() && owner.cell
-/datum/robot_component/cell/go_online()
- owner.update_stat()
-
-/datum/robot_component/cell/go_offline()
- owner.update_stat()
-
/datum/robot_component/cell/destroy()
..()
owner.cell = null
@@ -264,19 +255,25 @@
if(M.timeofdeath && M.stat == DEAD)
to_chat(user, "Time of Disable: [station_time_timestamp("hh:mm:ss", M.timeofdeath)]")
var/mob/living/silicon/robot/H = M
- var/list/damaged = H.get_damaged_components(1,1,1)
+ var/list/damaged = H.get_damaged_components(TRUE, TRUE, TRUE) // Get all except the missing ones
+ var/list/missing = H.get_missing_components()
to_chat(user, "Localized Damage:")
- if(length(damaged)>0)
- for(var/datum/robot_component/org in damaged)
- user.show_message(text("\t []: [][] - [] - [] - []", \
- capitalize(org.name), \
- (org.installed == -1) ? "DESTROYED " :"",\
- (org.electronics_damage > 0) ? "[org.electronics_damage]" :0, \
- (org.brute_damage > 0) ? "[org.brute_damage]" :0, \
- (org.toggled) ? "Toggled ON" : "Toggled OFF",\
- (org.powered) ? "Power ON" : "Power OFF"),1)
- else
+ if(!LAZYLEN(damaged) && !LAZYLEN(missing))
to_chat(user, "\t Components are OK.")
+ else
+ if(LAZYLEN(damaged))
+ for(var/datum/robot_component/org in damaged)
+ user.show_message(text("\t []: [][] - [] - [] - []", \
+ capitalize(org.name), \
+ (org.installed == -1) ? "DESTROYED " :"",\
+ (org.electronics_damage > 0) ? "[org.electronics_damage]" :0, \
+ (org.brute_damage > 0) ? "[org.brute_damage]" :0, \
+ (org.toggled) ? "Toggled ON" : "Toggled OFF",\
+ (org.powered) ? "Power ON" : "Power OFF"),1)
+ if(LAZYLEN(missing))
+ for(var/datum/robot_component/org in missing)
+ user.show_message("\t [capitalize(org.name)]: MISSING")
+
if(H.emagged && prob(5))
to_chat(user, "\t ERROR: INTERNAL SYSTEMS COMPROMISED")
@@ -287,22 +284,22 @@
to_chat(user, "External prosthetics:")
var/organ_found
- if(H.internal_organs.len)
+ if(LAZYLEN(H.internal_organs))
for(var/obj/item/organ/external/E in H.bodyparts)
if(!E.is_robotic())
continue
- organ_found = 1
+ organ_found = TRUE
to_chat(user, "[E.name]: [E.brute_dam] [E.burn_dam]")
if(!organ_found)
to_chat(user, "No prosthetics located.")
to_chat(user, "
")
to_chat(user, "Internal prosthetics:")
organ_found = null
- if(H.internal_organs.len)
+ if(LAZYLEN(H.internal_organs))
for(var/obj/item/organ/internal/O in H.internal_organs)
if(!O.is_robotic())
continue
- organ_found = 1
+ organ_found = TRUE
to_chat(user, "[capitalize(O.name)]: [O.damage]")
if(!organ_found)
to_chat(user, "No prosthetics located.")
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index ae6a832f6ac..18de2f413f4 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -157,6 +157,7 @@ var/list/robot_verbs_default = list(
var/datum/robot_component/cell_component = components["power cell"]
cell_component.wrapped = cell
cell_component.installed = 1
+ cell_component.install()
diag_hud_set_borgcell()
scanner = new(src)
@@ -438,8 +439,10 @@ var/list/robot_verbs_default = list(
var/dat = "[src.name] Self-Diagnosis Report\n"
for(var/V in components)
var/datum/robot_component/C = components[V]
- dat += "[C.name]
| Brute Damage: | [C.brute_damage] |
| Electronics Damage: | [C.electronics_damage] |
| Powered: | [C.is_powered() ? "Yes" : "No"] |
| Toggled: | [ C.toggled ? "Yes" : "No"] |
"
-
+ if(C.installed == 0)
+ dat += "[C.name]
MISSING
"
+ else
+ dat += "[C.name][C.installed == -1 ? "
DESTROYED" : ""]
| Brute Damage: | [C.brute_damage] |
| Electronics Damage: | [C.electronics_damage] |
| Powered: | [C.is_powered() ? "Yes" : "No"] |
| Toggled: | [ C.toggled ? "Yes" : "No"] |
"
return dat
/mob/living/silicon/robot/verb/self_diagnosis_verb()
@@ -591,6 +594,9 @@ var/list/robot_verbs_default = list(
if(!getBruteLoss())
to_chat(user, "Nothing to fix!")
return
+ else if(!getBruteLoss(TRUE))
+ to_chat(user, "The damaged components are beyond saving!")
+ return
var/obj/item/weldingtool/WT = W
user.changeNext_move(CLICK_CD_MELEE)
if(WT.remove_fuel(0))
@@ -603,11 +609,14 @@ var/list/robot_verbs_default = list(
return
- else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == INTENT_HELP && (wiresexposed || istype(src,/mob/living/silicon/robot/drone)))
+ else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == INTENT_HELP && (wiresexposed || istype(src, /mob/living/silicon/robot/drone)))
user.changeNext_move(CLICK_CD_MELEE)
if(!getFireLoss())
to_chat(user, "Nothing to fix!")
return
+ else if(!getFireLoss(TRUE))
+ to_chat(user, "The damaged components are beyond saving!")
+ return
var/obj/item/stack/cable_coil/coil = W
adjustFireLoss(-30)
updatehealth()
@@ -654,10 +663,10 @@ var/list/robot_verbs_default = list(
I.burn = C.electronics_damage
I.loc = src.loc
-
- if(C.installed == 1)
- C.uninstall()
+ var/was_installed = C.installed
C.installed = 0
+ if(was_installed)
+ C.uninstall()
else
if(locked)
@@ -1362,7 +1371,7 @@ var/list/robot_verbs_default = list(
..()
var/brute = 1000
var/burn = 1000
- var/list/datum/robot_component/borked_parts = get_damaged_components(brute,burn,1)
+ var/list/datum/robot_component/borked_parts = get_damaged_components(TRUE, TRUE, TRUE, TRUE)
for(var/datum/robot_component/borked_part in borked_parts)
brute = borked_part.brute_damage
burn = borked_part.electronics_damage
diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm
index e2a93fa0167..81700464ac0 100644
--- a/code/modules/mob/living/silicon/robot/robot_damage.dm
+++ b/code/modules/mob/living/silicon/robot/robot_damage.dm
@@ -8,18 +8,20 @@
handle_hud_icons_health()
diag_hud_set_health()
-/mob/living/silicon/robot/getBruteLoss()
+/mob/living/silicon/robot/getBruteLoss(repairable_only = FALSE)
var/amount = 0
for(var/V in components)
var/datum/robot_component/C = components[V]
- if(C.installed != 0) amount += C.brute_damage
+ if(C.installed != 0 && (!repairable_only || C.installed != -1)) // Installed ones only and if repair only remove the borked ones
+ amount += C.brute_damage
return amount
-/mob/living/silicon/robot/getFireLoss()
+/mob/living/silicon/robot/getFireLoss(repairable_only = FALSE)
var/amount = 0
for(var/V in components)
var/datum/robot_component/C = components[V]
- if(C.installed != 0) amount += C.electronics_damage
+ if(C.installed != 0 && (!repairable_only || C.installed != -1)) // Installed ones only and if repair only remove the borked ones
+ amount += C.electronics_damage
return amount
/mob/living/silicon/robot/adjustBruteLoss(amount, updating_health = TRUE)
@@ -36,11 +38,19 @@
heal_overall_damage(0, -amount, updating_health)
return STATUS_UPDATE_HEALTH
-/mob/living/silicon/robot/proc/get_damaged_components(var/brute, var/burn, var/get_all)
+/mob/living/silicon/robot/proc/get_damaged_components(get_brute, get_burn, get_borked = FALSE, get_missing = FALSE)
var/list/datum/robot_component/parts = list()
for(var/V in components)
var/datum/robot_component/C = components[V]
- if(C.installed == 1 || get_all) if((brute && C.brute_damage) || (burn && C.electronics_damage))
+ if((C.installed == 1 || (get_borked && C.installed == -1) || (get_missing && C.installed == 0)) && ((get_brute && C.brute_damage) || (get_burn && C.electronics_damage)))
+ parts += C
+ return parts
+
+/mob/living/silicon/robot/proc/get_missing_components()
+ var/list/datum/robot_component/parts = list()
+ for(var/V in components)
+ var/datum/robot_component/C = components[V]
+ if(C.installed == 0)
parts += C
return parts
@@ -48,41 +58,43 @@
var/list/rval = new
for(var/V in components)
var/datum/robot_component/C = components[V]
- if(C.installed == 1) rval += C
+ if(C.installed == 1)
+ rval += C
return rval
/mob/living/silicon/robot/proc/get_armour()
-
- if(!components.len) return 0
+ if(!LAZYLEN(components))
+ return 0
var/datum/robot_component/C = components["armour"]
if(C && C.installed == 1)
return C
return 0
/mob/living/silicon/robot/heal_organ_damage(brute, burn, updating_health = TRUE)
- var/list/datum/robot_component/parts = get_damaged_components(brute,burn)
- if(!parts.len) return
+ var/list/datum/robot_component/parts = get_damaged_components(brute, burn)
+ if(!LAZYLEN(parts))
+ return
var/datum/robot_component/picked = pick(parts)
- picked.heal_damage(brute,burn, updating_health)
+ picked.heal_damage(brute, burn, updating_health)
/mob/living/silicon/robot/take_organ_damage(brute = 0, burn = 0, updating_health = TRUE, sharp = 0, edge = 0)
var/list/components = get_damageable_components()
- if(!components.len)
+ if(!LAZYLEN(components))
return
//Combat shielding absorbs a percentage of damage directly into the cell.
var/obj/item/borg/combat/shield/shield
- if(module_state_1 && istype(module_state_1,/obj/item/borg/combat/shield))
+ if(module_state_1 && istype(module_state_1, /obj/item/borg/combat/shield))
shield = module_state_1
- else if(module_state_2 && istype(module_state_2,/obj/item/borg/combat/shield))
+ else if(module_state_2 && istype(module_state_2, /obj/item/borg/combat/shield))
shield = module_state_2
- else if(module_state_3 && istype(module_state_3,/obj/item/borg/combat/shield))
+ else if(module_state_3 && istype(module_state_3, /obj/item/borg/combat/shield))
shield = module_state_3
if(shield)
//Shields absorb a certain percentage of damage based on their power setting.
- var/absorb_brute = brute*shield.shield_level
- var/absorb_burn = burn*shield.shield_level
- var/cost = (absorb_brute+absorb_burn)*100
+ var/absorb_brute = brute * shield.shield_level
+ var/absorb_burn = burn * shield.shield_level
+ var/cost = (absorb_brute+absorb_burn) * 100
cell.charge -= cost
if(cell.charge <= 0)
@@ -102,9 +114,9 @@
C.take_damage(brute, burn, sharp, updating_health)
/mob/living/silicon/robot/heal_overall_damage(var/brute, var/burn, updating_health = TRUE)
- var/list/datum/robot_component/parts = get_damaged_components(brute,burn)
+ var/list/datum/robot_component/parts = get_damaged_components(brute, burn)
- while(parts.len && (brute>0 || burn>0) )
+ while(LAZYLEN(parts) && (brute > 0 || burn > 0) )
var/datum/robot_component/picked = pick(parts)
var/brute_was = picked.brute_damage
@@ -112,8 +124,8 @@
picked.heal_damage(brute,burn, updating_health)
- brute -= (brute_was-picked.brute_damage)
- burn -= (burn_was-picked.electronics_damage)
+ brute -= (brute_was - picked.brute_damage)
+ burn -= (burn_was - picked.electronics_damage)
parts -= picked
@@ -126,17 +138,17 @@
//Combat shielding absorbs a percentage of damage directly into the cell.
var/obj/item/borg/combat/shield/shield
- if(module_state_1 && istype(module_state_1,/obj/item/borg/combat/shield))
+ if(module_state_1 && istype(module_state_1, /obj/item/borg/combat/shield))
shield = module_state_1
- else if(module_state_2 && istype(module_state_2,/obj/item/borg/combat/shield))
+ else if(module_state_2 && istype(module_state_2, /obj/item/borg/combat/shield))
shield = module_state_2
- else if(module_state_3 && istype(module_state_3,/obj/item/borg/combat/shield))
+ else if(module_state_3 && istype(module_state_3, /obj/item/borg/combat/shield))
shield = module_state_3
if(shield)
//Shields absorb a certain percentage of damage based on their power setting.
- var/absorb_brute = brute*shield.shield_level
- var/absorb_burn = burn*shield.shield_level
- var/cost = (absorb_brute+absorb_burn)*100
+ var/absorb_brute = brute * shield.shield_level
+ var/absorb_burn = burn * shield.shield_level
+ var/cost = (absorb_brute+absorb_burn) * 100
cell.charge -= cost
if(cell.charge <= 0)
@@ -152,7 +164,7 @@
A.take_damage(brute, burn, sharp)
return
- while(parts.len && (brute>0 || burn>0) )
+ while(LAZYLEN(parts) && (brute > 0 || burn > 0) )
var/datum/robot_component/picked = pick(parts)
var/brute_was = picked.brute_damage
diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm
index 161b81e3cd2..85cc2ad5786 100644
--- a/code/modules/mob/living/silicon/robot/robot_defense.dm
+++ b/code/modules/mob/living/silicon/robot/robot_defense.dm
@@ -46,7 +46,9 @@
user.put_in_active_hand(cell)
to_chat(user, "You remove \the [cell].")
cell = null
- update_stat()
+ var/datum/robot_component/C = components["power cell"]
+ C.installed = 0
+ C.uninstall()
diag_hud_set_borgcell()
if(!opened)