robot upgrade overhaul

This commit is contained in:
Kashargul
2024-01-27 13:29:19 +01:00
committed by GitHub
parent 6d1acf98db
commit d3b0c1ebe6
22 changed files with 796 additions and 548 deletions
@@ -381,15 +381,17 @@
if((organ in H.organs) || (organ in H.internal_organs))
qdel(organ)
if(H.organs) H.organs.Cut()
if(H.internal_organs) H.internal_organs.Cut()
if(H.organs_by_name) H.organs_by_name.Cut()
if(H.internal_organs_by_name) H.internal_organs_by_name.Cut()
if(H.organs) H.organs.Cut()
if(H.internal_organs) H.internal_organs.Cut()
if(H.organs_by_name) H.organs_by_name.Cut()
if(H.internal_organs_by_name) H.internal_organs_by_name.Cut()
if(H.bad_external_organs) H.bad_external_organs.Cut()
H.organs = list()
H.internal_organs = list()
H.organs_by_name = list()
H.internal_organs_by_name = list()
H.bad_external_organs = list()
for(var/limb_type in has_limbs)
var/list/organ_data = has_limbs[limb_type]
+113 -24
View File
@@ -6,6 +6,7 @@
icon_state = "robotanalyzer"
item_state = "analyzer"
desc = "A hand-held scanner able to diagnose robotic injuries."
description_info = "Alt-click to toggle between robot analysis and robot module scan mode."
slot_flags = SLOT_BELT
throwforce = 3
w_class = ITEMSIZE_SMALL
@@ -18,6 +19,10 @@
/obj/item/device/robotanalyzer/attack(mob/living/M as mob, mob/living/user as mob)
do_scan(M, user)
/obj/item/device/robotanalyzer/AltClick(mob/user)
mode = !mode
user.show_message(span_blue("[mode ? "Toggled to cyborg analyzing mode." : "Toggled to cyborg upgrade scan mode."]"), 1)
/obj/item/device/robotanalyzer/proc/do_scan(mob/living/M as mob, mob/living/user as mob)
if((CLUMSY in user.mutations) && prob(50))
to_chat(user, span_red("You try to analyze the floor's vitals!"))
@@ -43,30 +48,114 @@
user.visible_message("<span class='notice'>\The [user] has analyzed [M]'s components.</span>","<span class='notice'>You have analyzed [M]'s components.</span>")
switch(scan_type)
if("robot")
var/BU = M.getFireLoss() > 50 ? "<b>[M.getFireLoss()]</b>" : M.getFireLoss()
var/BR = M.getBruteLoss() > 50 ? "<b>[M.getBruteLoss()]</b>" : M.getBruteLoss()
user.show_message(span_blue("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.health - M.halloss]% functional"]"))
user.show_message("\t Key: [span_orange("Electronics")]/[span_red("Brute")]", 1)
user.show_message("\t Damage Specifics: [span_orange("[BU]")] - [span_red("[BR]")]")
if(M.tod && M.stat == DEAD)
user.show_message(span_blue("Time of Disable: [M.tod]"))
var/mob/living/silicon/robot/H = M
var/list/damaged = H.get_damaged_components(1,1,1)
user.show_message(span_blue("Localized Damage:"),1)
if(length(damaged)>0)
for(var/datum/robot_component/org in damaged)
user.show_message(span_blue(text("\t []: [][] - [] - [] - []", \
span_blue(capitalize(org.name)), \
(org.installed == -1) ? "[span_red("<b>DESTROYED</b>")] " :"",\
(org.electronics_damage > 0) ? "[span_orange("[org.electronics_damage]")]" :0, \
(org.brute_damage > 0) ? "[span_red("[org.brute_damage]")]" :0, \
(org.toggled) ? "Toggled ON" : "[span_red("Toggled OFF")]",\
(org.powered) ? "Power ON" : "[span_red("Power OFF")]")),1)
if(mode)
var/BU = M.getFireLoss() > 50 ? "<b>[M.getFireLoss()]</b>" : M.getFireLoss()
var/BR = M.getBruteLoss() > 50 ? "<b>[M.getBruteLoss()]</b>" : M.getBruteLoss()
user.show_message(span_blue("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.health - M.halloss]% functional"]"))
user.show_message("\t Key: [span_orange("Electronics")]/[span_red("Brute")]", 1)
user.show_message("\t Damage Specifics: [span_orange("[BU]")] - [span_red("[BR]")]")
if(M.tod && M.stat == DEAD)
user.show_message(span_blue("Time of Disable: [M.tod]"))
var/mob/living/silicon/robot/H = M
var/obj/item/weapon/cell/cell = H.get_cell()
if(cell)
var/cell_charge = round(cell.percent())
var/cell_text
if(cell_charge > 60)
cell_text = span_green("[cell_charge]")
else if (cell_charge > 30)
cell_text = span_yellow("[cell_charge]")
else if (cell_charge > 10)
cell_text = span_orange("[cell_charge]")
else if (cell_charge > 1)
cell_text = span_red("[cell_charge]")
else
cell_text = span_red("<b>[cell_charge]<b>")
user.show_message("\t Power Cell Status: [span_blue("[capitalize(cell.name)]")] at [cell_text]% charge")
var/list/damaged = H.get_damaged_components(1,1,1)
user.show_message(span_blue("Localized Damage:"),1)
if(length(damaged)>0)
for(var/datum/robot_component/org in damaged)
user.show_message(span_blue(text("\t []: [][] - [] - [] - []", \
span_blue(capitalize(org.name)), \
(org.installed == -1) ? "[span_red("<b>DESTROYED</b>")] " :"",\
(org.electronics_damage > 0) ? "[span_orange("[org.electronics_damage]")]" :0, \
(org.brute_damage > 0) ? "[span_red("[org.brute_damage]")]" :0, \
(org.toggled) ? "Toggled ON" : "[span_red("Toggled OFF")]",\
(org.powered) ? "Power ON" : "[span_red("Power OFF")]")),1)
else
user.show_message(span_blue("\t Components are OK."),1)
if(H.emagged && prob(5))
user.show_message(span_red("\t ERROR: INTERNAL SYSTEMS COMPROMISED"),1)
user.show_message(span_blue("Operating Temperature: [M.bodytemperature-T0C]&deg;C ([M.bodytemperature*1.8-459.67]&deg;F)"), 1)
else
user.show_message(span_blue("\t Components are OK."),1)
if(H.emagged && prob(5))
user.show_message(span_red("\t ERROR: INTERNAL SYSTEMS COMPROMISED"),1)
user.show_message(span_blue("Operating Temperature: [M.bodytemperature-T0C]&deg;C ([M.bodytemperature*1.8-459.67]&deg;F)"), 1)
var/mob/living/silicon/robot/H = M
var/obj/item/weapon/cell/cell = H.get_cell()
user.show_message(span_blue("Upgrade Analyzing Results for [M]:"))
if(cell)
user.show_message("\t Power Cell Details: [span_blue("[capitalize(cell.name)]")] with a capacity of [cell.maxcharge] at [round(cell.percent())]% charge")
var/show_title = TRUE
for(var/datum/design/item/prosfab/robot_upgrade/utility/upgrade)
var/needs_module = initial(initial(upgrade.build_path).require_module)
if((!H.module && needs_module) || !initial(upgrade.name) || (H.stat != DEAD && initial(upgrade.name) == "Emergency Restart Module"))
continue
if(show_title)
user.show_message("\t Utility Modules, used for modifying purposes:")
show_title = FALSE
if(H.stat == DEAD)
if(initial(upgrade.name) == "Emergency Restart Module")
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_green("Usable")]"))
else
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_green("Usable")]"))
show_title = TRUE
for(var/datum/design/item/prosfab/robot_upgrade/basic/upgrade)
var/needs_module = initial(initial(upgrade.build_path).require_module)
if((!H.module && needs_module) || !initial(upgrade.name) || H.stat == DEAD)
continue
if(show_title)
user.show_message("\t Basic Modules, used for direct upgrade purposes:")
show_title = FALSE
if(H.has_basic_upgrade(initial(upgrade.build_path)) == "")
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_red("<b>ERROR</b>")]"))
else
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [H.has_basic_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]"))
show_title = TRUE
for(var/datum/design/item/prosfab/robot_upgrade/advanced/upgrade)
var/needs_module = initial(initial(upgrade.build_path).require_module)
if((!H.module && needs_module) || !initial(upgrade.name) || H.stat == DEAD)
continue
if(show_title)
user.show_message("\t Advanced Modules, used for module upgrade purposes:")
show_title = FALSE
if(H.has_advanced_upgrade(initial(upgrade.build_path)) == "")
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_red("<b>ERROR</b>")]"))
else
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [H.has_advanced_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]"))
show_title = TRUE
for(var/datum/design/item/prosfab/robot_upgrade/restricted/upgrade)
var/needs_module = initial(initial(upgrade.build_path).require_module)
if((!H.module && needs_module) || !initial(upgrade.name) || !H.supports_upgrade(initial(upgrade.build_path)) || H.stat == DEAD)
continue
if(show_title)
user.show_message("\t Restricted Modules, used for module upgrade purposes on specific chassis:")
show_title = FALSE
if(H.has_restricted_upgrade(initial(upgrade.build_path)) == "")
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_red("<b>ERROR</b>")]"))
else
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [H.has_restricted_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]"))
show_title = TRUE
for(var/datum/design/item/prosfab/robot_upgrade/no_prod/upgrade)
var/needs_module = initial(initial(upgrade.build_path).require_module)
var/hidden = initial(initial(upgrade.build_path).hidden_from_scan)
if((!H.module && needs_module) || !initial(upgrade.name) || hidden || H.stat == DEAD)
continue
if(show_title)
user.show_message("\t Special Modules, used for recreation purposes:")
show_title = FALSE
if(H.has_no_prod_upgrade(initial(upgrade.build_path)) == "")
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_red("<b>ERROR</b>")]"))
else
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [H.has_no_prod_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]"))
if("prosthetics")
@@ -109,7 +198,7 @@
var/output = {"<span class='notice'>Analyzing Results for \the [Mecha]:</span><br>
<b>Chassis Integrity: </b> [integrity]%<br>
<b>Powercell charge: </b>[isnull(cell_charge)?"No powercell installed":"[Mecha.cell.percent()]%"]<br>
<b>Powercell charge: </b>[isnull(cell_charge)?"No powercell installed":"[capitalize(initial(Mecha.cell.name))] at [Mecha.cell.percent()]%"]<br>
<b>Air source: </b>[Mecha.use_internal_tank?"Internal Airtank":"Environment"]<br>
<b>Airtank pressure: </b>[tank_pressure]kPa<br>
<b>Airtank temperature: </b>[tank_temperature]K|[tank_temperature - T0C]&deg;C<br>
+74 -2
View File
@@ -1416,8 +1416,8 @@
return cell
/mob/living/silicon/robot/lay_down()
. = ..()
update_icon()
. = ..()
update_icon()
/mob/living/silicon/robot/verb/rest_style()
set name = "Switch Rest Style"
@@ -1437,3 +1437,75 @@
rest_style = tgui_alert(src, "Select resting pose", "Resting Pose", sprite_datum.rest_sprite_options)
if(!rest_style)
rest_style = "Default"
// Those basic ones require quite detailled checks on the robot's vars to see if they are installed!
/mob/living/silicon/robot/proc/has_basic_upgrade(var/given_type)
if(given_type == /obj/item/borg/upgrade/basic/vtec)
return (/mob/living/silicon/robot/proc/toggle_vtec in verbs)
else if(given_type == /obj/item/borg/upgrade/basic/sizeshift)
return (/mob/living/proc/set_size in verbs)
else if(given_type == /obj/item/borg/upgrade/basic/syndicate)
return emag_items
else if(given_type == /obj/item/borg/upgrade/basic/language)
return (speech_synthesizer_langs.len > 20) // Service with the most has 18
return null
// We check for the module only here
/mob/living/silicon/robot/proc/has_upgrade_module(var/given_type)
var/obj/T = locate(given_type) in module
if(!T)
T = locate(given_type) in module.contents
if(!T)
T = locate(given_type) in module.modules
return T
// Most of the advanced ones, we can easily check, but a few special cases exist and need to be handled specially
/mob/living/silicon/robot/proc/has_advanced_upgrade(var/given_type)
if(given_type == /obj/item/borg/upgrade/advanced/bellysizeupgrade)
var/obj/item/device/dogborg/sleeper/T = has_upgrade_module(/obj/item/device/dogborg/sleeper)
if(T && T.upgraded_capacity)
return T
else
return "" // Return this to have the analyzer show an error if the module is missing. FALSE / NULL are used for missing upgrades themselves
if(given_type == /obj/item/borg/upgrade/advanced/jetpack)
return has_upgrade_module(/obj/item/weapon/tank/jetpack/carbondioxide)
if(given_type == /obj/item/borg/upgrade/advanced/advhealth)
return has_upgrade_module(/obj/item/device/healthanalyzer/advanced)
if(given_type == /obj/item/borg/upgrade/advanced/sizegun)
return has_upgrade_module(/obj/item/weapon/gun/energy/sizegun/mounted)
return null
// Do we support specific upgrades?
/mob/living/silicon/robot/proc/supports_upgrade(var/given_type)
return (given_type in module.supported_upgrades)
// Most of the restricted ones, we can easily check, but a few special cases exist and need to be handled specially
/mob/living/silicon/robot/proc/has_restricted_upgrade(var/given_type)
if(given_type == /obj/item/borg/upgrade/restricted/bellycapupgrade)
var/obj/item/device/dogborg/sleeper/T = has_upgrade_module(/obj/item/device/dogborg/sleeper)
if(T && T.compactor)
return T
else
return ""
if(given_type == /obj/item/borg/upgrade/restricted/tasercooler)
var/obj/item/weapon/gun/energy/taser/mounted/cyborg/T = has_upgrade_module(/obj/item/weapon/gun/energy/taser/mounted/cyborg)
if(T && T.recharge_time <= 2)
return T
else
return ""
if(given_type == /obj/item/borg/upgrade/restricted/advrped)
return has_upgrade_module(/obj/item/weapon/storage/part_replacer/adv)
if(given_type == /obj/item/borg/upgrade/restricted/diamonddrill)
return has_upgrade_module(/obj/item/weapon/pickaxe/diamonddrill)
if(given_type == /obj/item/borg/upgrade/restricted/pka)
return has_upgrade_module(/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg)
return null
// Check if we have any non production upgrades
/mob/living/silicon/robot/proc/has_no_prod_upgrade(var/given_type)
if(given_type == /obj/item/borg/upgrade/no_prod/toygun)
return has_upgrade_module(/obj/item/weapon/gun/projectile/cyborgtoy)
return null
/mob/living/silicon/robot/proc/has_upgrade(var/given_type)
return (has_basic_upgrade(given_type) || has_advanced_upgrade(given_type) || has_restricted_upgrade(given_type) || has_no_prod_upgrade(given_type))
@@ -47,8 +47,6 @@ var/global/list/robot_modules = list(
var/list/modules = list()
var/list/datum/matter_synth/synths = list()
var/list/emag = list()
var/obj/item/borg/upgrade/jetpack = null
var/obj/item/borg/upgrade/advhealth = null
var/list/subsystems = list()
var/list/obj/item/borg/upgrade/supported_upgrades = list()
@@ -109,8 +107,6 @@ var/global/list/robot_modules = list(
modules.Cut()
synths.Cut()
emag.Cut()
qdel(jetpack)
jetpack = null
return ..()
/obj/item/weapon/robot_module/emp_act(severity)
@@ -233,6 +229,7 @@ var/global/list/robot_modules = list(
networks = list(NETWORK_MEDICAL)
subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor)
pto_type = PTO_MEDICAL
supported_upgrades = list(/obj/item/borg/upgrade/restricted/bellycapupgrade)
/obj/item/weapon/robot_module/robot/medical/surgeon
name = "surgeon robot module"
@@ -470,7 +467,7 @@ var/global/list/robot_modules = list(
channels = list("Security" = 1)
networks = list(NETWORK_SECURITY)
subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor)
supported_upgrades = list(/obj/item/borg/upgrade/tasercooler)
supported_upgrades = list(/obj/item/borg/upgrade/restricted/tasercooler, /obj/item/borg/upgrade/restricted/bellycapupgrade)
pto_type = PTO_SECURITY
/obj/item/weapon/robot_module/robot/security/general
@@ -668,7 +665,7 @@ var/global/list/robot_modules = list(
name = "miner robot module"
channels = list("Supply" = 1)
networks = list(NETWORK_MINE)
supported_upgrades = list(/obj/item/borg/upgrade/pka, /obj/item/borg/upgrade/diamonddrill)
supported_upgrades = list(/obj/item/borg/upgrade/restricted/pka, /obj/item/borg/upgrade/restricted/diamonddrill)
pto_type = PTO_CARGO
/obj/item/weapon/robot_module/robot/miner/create_equipment(var/mob/living/silicon/robot/robot)
@@ -689,7 +686,7 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/research
name = "research module"
channels = list("Science" = 1)
supported_upgrades = list(/obj/item/borg/upgrade/advrped)
supported_upgrades = list(/obj/item/borg/upgrade/restricted/advrped)
pto_type = PTO_SCIENCE
/obj/item/weapon/robot_module/robot/research/create_equipment(var/mob/living/silicon/robot/robot)
@@ -752,6 +749,7 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/security/combat
name = "combat robot module"
hide_on_manifest = TRUE
supported_upgrades = list(/obj/item/borg/upgrade/restricted/bellycapupgrade)
/obj/item/weapon/robot_module/robot/security/combat/create_equipment(var/mob/living/silicon/robot/robot)
..()
@@ -48,6 +48,7 @@
// Gets a big shield and a gun that shoots really fast to scare the opposing force.
/obj/item/weapon/robot_module/robot/syndicate/protector
name = "protector robot module"
supported_upgrades = list(/obj/item/borg/upgrade/restricted/bellycapupgrade)
/obj/item/weapon/robot_module/robot/syndicate/protector/create_equipment(var/mob/living/silicon/robot/robot)
..()
@@ -133,6 +134,7 @@
// Mediborg optimized for on-the-field healing, but can also do surgery if needed.
/obj/item/weapon/robot_module/robot/syndicate/combat_medic
name = "combat medic robot module"
supported_upgrades = list(/obj/item/borg/upgrade/restricted/bellycapupgrade)
/obj/item/weapon/robot_module/robot/syndicate/combat_medic/create_equipment(var/mob/living/silicon/robot/robot)
..()
@@ -190,4 +192,4 @@
S.mode = initial(S.mode)
S.desc = initial(S.desc)
S.update_icon()
..()
..()
@@ -71,7 +71,7 @@
vore_stomach_name = "fuel processor"
vore_stomach_flavor = "You have ended up in the fuel processor of this corrupted machine. This place was definitely not designed with safety and comfort in mind. The heated and cramped surroundings oozing potent fluids all over your form, eager to do nothing less than breaking you apart to fuel its rampage for the next few days... hours... minutes? Oh dear..."
loot_list = list(/obj/item/borg/upgrade/syndicate = 6, /obj/item/borg/upgrade/vtec = 6, /obj/item/weapon/material/knife/ritual = 6, /obj/item/weapon/disk/nifsoft/compliance = 6)
loot_list = list(/obj/item/borg/upgrade/basic/syndicate = 6, /obj/item/borg/upgrade/basic/vtec = 6, /obj/item/weapon/material/knife/ritual = 6, /obj/item/weapon/disk/nifsoft/compliance = 6)
/mob/living/simple_mob/vore/aggressive/corrupthound/prettyboi
name = "corrupt corrupt hound"
+4 -2
View File
@@ -70,8 +70,10 @@
to_chat(src, "<span class='filter_notice'><I>... You can almost hear someone talking ...</I></span>")
else
if(client && client.prefs.chat_timestamp)
msg = replacetext(msg, new/regex("^(<span(?: \[^>]*)?>)((?:.|\\n)*</span>)", ""), "$1[time] $2")
to_chat(src,msg)
// TG-Chat filters latch directly to the spans, we no longer need that
//msg = replacetext(msg, new/regex("^(<span(?: \[^>]*)?>)((?:.|\\n)*</span>)", ""), "$1[time] $2") // Insteres timestamps after the first qualifying span
//msg = replacetext(msg, new/regex("^\[^<]((?:.|\\n)*)", ""), "[time] $1") // Spanless messages also get timestamped
to_chat(src,"[time] [msg]")
else if(teleop)
to_chat(teleop, create_text_tag("body", "BODY:", teleop.client) + "[msg]")
else
-6
View File
@@ -157,12 +157,6 @@
var/mob/living/silicon/robot/O = new /mob/living/silicon/robot( loc )
// cyborgs produced by Robotize get an automatic power cell
O.cell = new(O)
O.cell.maxcharge = 7500
O.cell.charge = 7500
O.gender = gender
O.invisibility = 0