diff --git a/code/__defines/admin_vr.dm b/code/__defines/admin_vr.dm
index cdbc8c023d..01226df1bd 100644
--- a/code/__defines/admin_vr.dm
+++ b/code/__defines/admin_vr.dm
@@ -7,8 +7,10 @@
#define MODIFIY_ROBOT_MODULE_ADD "Add a Module"
#define MODIFIY_ROBOT_MODULE_REMOVE "Remove a Module"
#define MODIFIY_ROBOT_APPLY_UPGRADE "Apply an Upgrade"
+#define MODIFIY_ROBOT_SUPP_ADD "Add Upgrade Support"
+#define MODIFIY_ROBOT_SUPP_REMOVE "Remove Upgrade Support"
#define MODIFIY_ROBOT_RADIOC_ADD "Add a Radio Channel"
#define MODIFIY_ROBOT_RADIOC_REMOVE "Remove a Radio Channel"
#define MODIFIY_ROBOT_COMP_ADD "Replace a Component"
#define MODIFIY_ROBOT_COMP_REMOVE "Remove a Component"
-#define MODIFIY_ROBOT_RESET_MODULE "Fully Resets a Robot Module"
+#define MODIFIY_ROBOT_RESET_MODULE "Fully Reset Robot Module"
diff --git a/code/__defines/exosuit_fab.dm b/code/__defines/exosuit_fab.dm
index ccb05b9374..030c324cd3 100644
--- a/code/__defines/exosuit_fab.dm
+++ b/code/__defines/exosuit_fab.dm
@@ -1,15 +1,30 @@
+
+/// Module is compatible with All Cyborg models, utility upgrades
+#define BORG_UTILITY (1<<0)
+/// Module is compatible with All Cyborg models, basic upgrades
+#define BORG_BASIC (1<<1)
+/// Module is compatible with All Cyborg models, advanced upgrades
+#define BORG_ADVANCED (1<<2)
/// Module is compatible with Security Cyborg models
-#define BORG_MODULE_SECURITY (1<<0)
+#define BORG_MODULE_SECURITY (1<<3)
/// Module is compatible with Miner Cyborg models
-#define BORG_MODULE_MINER (1<<1)
+#define BORG_MODULE_MINER (1<<4)
/// Module is compatible with Janitor Cyborg models
-#define BORG_MODULE_JANITOR (1<<2)
+#define BORG_MODULE_JANITOR (1<<5)
/// Module is compatible with Medical Cyborg models
-#define BORG_MODULE_MEDICAL (1<<3)
+#define BORG_MODULE_MEDICAL (1<<6)
/// Module is compatible with Engineering Cyborg models
-#define BORG_MODULE_ENGINEERING (1<<4)
+#define BORG_MODULE_ENGINEERING (1<<7)
/// Module is compatible with Science Cyborg models
-#define BORG_MODULE_SCIENCE (1<<5)
+#define BORG_MODULE_SCIENCE (1<<8)
+/// Module is compatible with Service Cyborg models
+#define BORG_MODULE_SERVICE (1<<9)
+/// Module is compatible with Clerical Cyborg models
+#define BORG_MODULE_CLERIC (1<<10)
+/// Module is compatible with Combat Cyborg models
+#define BORG_MODULE_COMBAT (1<<11)
+/// Module is compatible with Exploration Cyborg models
+#define BORG_MODULE_EXPLO (1<<12)
/// Module is compatible with Ripley Exosuit models
#define EXOSUIT_MODULE_RIPLEY (1<<0)
/// Module is compatible with Odyseeus Exosuit models
diff --git a/code/datums/supplypacks/recreation.dm b/code/datums/supplypacks/recreation.dm
index ca19cc342a..e512b92ebc 100644
--- a/code/datums/supplypacks/recreation.dm
+++ b/code/datums/supplypacks/recreation.dm
@@ -38,7 +38,7 @@
/datum/supply_pack/recreation/donksoftborg
name = "Donk-Soft Cyborg Blaster Crate"
contains = list(
- /obj/item/borg/upgrade/toygun = 2,
+ /obj/item/borg/upgrade/no_prod/toygun = 2,
)
cost = 35
containertype = /obj/structure/closet/crate/allico
@@ -136,4 +136,4 @@
contains = list(
/obj/machinery/porta_turret/lasertag/blue,
/obj/machinery/porta_turret/lasertag/red
- )
\ No newline at end of file
+ )
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 71493b3070..a4c63b166a 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -139,6 +139,12 @@
var/module_types = initial(U.module_flags)
sub_category = list()
if(module_types)
+ if(module_types & BORG_UTILITY)
+ sub_category += "All Cyborgs - Utility"
+ if(module_types & BORG_BASIC)
+ sub_category += "All Cyborgs - Basic"
+ if(module_types & BORG_ADVANCED)
+ sub_category += "All Cyborgs - Advanced"
if(module_types & BORG_MODULE_SECURITY)
sub_category += "Security"
if(module_types & BORG_MODULE_MINER)
@@ -151,9 +157,16 @@
sub_category += "Engineering"
if(module_types & BORG_MODULE_SCIENCE)
sub_category += "Science"
-
+ if(module_types & BORG_MODULE_SERVICE)
+ sub_category += "Service"
+ if(module_types & BORG_MODULE_CLERIC)
+ sub_category += "Cleric"
+ if(module_types & BORG_MODULE_COMBAT)
+ sub_category += "Combat"
+ if(module_types & BORG_MODULE_EXPLO)
+ sub_category += "Exploration"
else
- sub_category += "All Cyborgs"
+ sub_category += "This shouldn't be here, bother a dev!"
// Else check if this design builds a piece of exosuit equipment.
else if(built_item in typesof(/obj/item/mecha_parts/mecha_equipment))
var/obj/item/mecha_parts/mecha_equipment/E = built_item
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 474ef45c6b..c748a397d9 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -18,31 +18,39 @@
return 1
return 0
+/* ######################################################################################################
+ # Utility section. All reusable upgrades without lasting effects, like renaming, reset, etc. go here.#
+ ######################################################################################################*/
-/obj/item/borg/upgrade/reset
+/obj/item/borg/upgrade/utility
+ module_flags = BORG_UTILITY
+
+/obj/item/borg/upgrade/utility/reset
name = "robotic module reset board"
- desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the robot."
+ desc = "Used to reset a cyborg's module. Destroys any higher than basic upgrades applied to the robot."
icon_state = "cyborg_upgrade1"
item_state = "cyborg_upgrade"
require_module = 1
-/obj/item/borg/upgrade/reset/action(var/mob/living/silicon/robot/R)
- if(..())
- return 0
+/obj/item/borg/upgrade/utility/reset/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
R.module_reset()
return 1
-/obj/item/borg/upgrade/rename
+/obj/item/borg/upgrade/utility/rename
name = "robot reclassification board"
desc = "Used to rename a cyborg."
icon_state = "cyborg_upgrade1"
item_state = "cyborg_upgrade"
var/heldname = "default name"
-/obj/item/borg/upgrade/rename/attack_self(mob/user as mob)
- heldname = sanitizeSafe(tgui_input_text(user, "Enter new robot name", "Robot Reclassification", heldname, MAX_NAME_LEN), MAX_NAME_LEN)
+/obj/item/borg/upgrade/utility/rename/attack_self(mob/user as mob)
+ var/new_name = sanitizeSafe(tgui_input_text(user, "Enter new robot name", "Robot Reclassification", heldname, MAX_NAME_LEN), MAX_NAME_LEN)
+ if(new_name)
+ heldname = new_name
-/obj/item/borg/upgrade/rename/action(var/mob/living/silicon/robot/R)
+/obj/item/borg/upgrade/utility/rename/action(var/mob/living/silicon/robot/R)
if(..()) return 0
R.notify_ai(ROBOT_NOTIFICATION_NEW_NAME, R.name, heldname)
R.name = heldname
@@ -51,14 +59,17 @@
return 1
-/obj/item/borg/upgrade/restart
+/obj/item/borg/upgrade/utility/restart
name = "robot emergency restart module"
desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online."
icon_state = "cyborg_upgrade1"
item_state = "cyborg_upgrade"
-/obj/item/borg/upgrade/restart/action(var/mob/living/silicon/robot/R)
+/obj/item/borg/upgrade/utility/restart/action(var/mob/living/silicon/robot/R)
+ if(R.stat == CONSCIOUS)
+ return 0
+
if(R.health < 0)
to_chat(usr, "You have to repair the robot before using this module!")
return 0
@@ -75,25 +86,261 @@
R.notify_ai(ROBOT_NOTIFICATION_NEW_UNIT)
return 1
+/* ###################################################################################
+ # Basic section. All upgrades which effect the robot's variables directly go here.#
+ ###################################################################################*/
-/obj/item/borg/upgrade/vtec
+/obj/item/borg/upgrade/basic
+ module_flags = BORG_BASIC
+
+/obj/item/borg/upgrade/basic/vtec
name = "robotic VTEC Module"
desc = "Used to kick in a robot's VTEC systems, increasing their speed."
icon_state = "cyborg_upgrade2"
item_state = "cyborg_upgrade"
require_module = 1
-/obj/item/borg/upgrade/vtec/action(var/mob/living/silicon/robot/R)
+/obj/item/borg/upgrade/basic/vtec/action(var/mob/living/silicon/robot/R)
if(..()) return 0
- if(R.speed == -1 || (/mob/living/silicon/robot/proc/toggle_vtec in R.verbs))
+ if(R.has_basic_upgrade(type))
+ to_chat(R, "Actuator already running on overdrive mode!")
+ to_chat(usr, "It'd be unwise to plug another vtec module in!")
return 0
+
R.verbs += /mob/living/silicon/robot/proc/toggle_vtec
- R.speed--
+ R.speed = -1
return 1
+/obj/item/borg/upgrade/basic/sizeshift
+ name = "robot size alteration module"
+ desc = "Using technology similar to one used in sizeguns, allows cyborgs to adjust their own size as neccesary."
+ icon_state = "cyborg_upgrade2"
+ item_state = "cyborg_upgrade"
+ require_module = 1
-/obj/item/borg/upgrade/tasercooler
+/obj/item/borg/upgrade/basic/sizeshift/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
+ if(R.has_basic_upgrade(type))
+ to_chat(R, "Size alteration module already applied!")
+ to_chat(usr, "There's no space for another size alteration module!")
+ return 0
+
+ R.verbs += /mob/living/proc/set_size
+ return 1
+
+/obj/item/borg/upgrade/basic/syndicate
+ name = "scrambled equipment module"
+ desc = "Unlocks new and often deadly module specific items of a robot"
+ icon_state = "cyborg_upgrade3"
+ item_state = "cyborg_upgrade"
+ require_module = 1
+
+/obj/item/borg/upgrade/basic/syndicate/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
+ if(R.has_basic_upgrade(type))
+ to_chat(R, "Secret modules already unlocked!")
+ to_chat(usr, "Plugging another scambled module would be useless!")
+ return 0
+
+ R.emag_items = 1
+ return 1
+
+/obj/item/borg/upgrade/basic/language
+ name = "language module"
+ desc = "Used to let cyborgs other than clerical or service speak a variety of languages."
+ icon_state = "cyborg_upgrade3"
+ item_state = "cyborg_upgrade"
+
+/obj/item/borg/upgrade/basic/language/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
+ if(R.has_basic_upgrade(type))
+ to_chat(R, "All possible languages already uploaded!")
+ to_chat(usr, "The language database is up to date!")
+ return 0
+
+ R.add_language(LANGUAGE_SOL_COMMON, 1)
+ R.add_language(LANGUAGE_TRADEBAND, 1)
+ R.add_language(LANGUAGE_UNATHI, 1)
+ R.add_language(LANGUAGE_SIIK, 1)
+ R.add_language(LANGUAGE_AKHANI, 1)
+ R.add_language(LANGUAGE_SKRELLIAN, 1)
+ R.add_language(LANGUAGE_GUTTER, 1)
+ R.add_language(LANGUAGE_SCHECHI, 1)
+ R.add_language(LANGUAGE_ROOTLOCAL, 1)
+ R.add_language(LANGUAGE_TERMINUS, 1)
+ R.add_language(LANGUAGE_ZADDAT, 1)
+ R.add_language(LANGUAGE_BIRDSONG, 1)
+ R.add_language(LANGUAGE_SAGARU, 1)
+ R.add_language(LANGUAGE_CANILUNZT, 1)
+ R.add_language(LANGUAGE_ECUREUILIAN, 1)
+ R.add_language(LANGUAGE_DAEMON, 1)
+ R.add_language(LANGUAGE_ENOCHIAN, 1)
+ R.add_language(LANGUAGE_DRUDAKAR, 1)
+ R.add_language(LANGUAGE_TAVAN, 1)
+ R.add_language(LANGUAGE_SIGN, 1)
+ R.add_language(LANGUAGE_VOX, 1)
+ R.add_language(LANGUAGE_ALAI, 1)
+ R.add_language(LANGUAGE_PROMETHEAN, 1)
+ R.add_language(LANGUAGE_GIBBERISH, 1)
+ R.add_language(LANGUAGE_VESPINAE, 1)
+ R.add_language(LANGUAGE_SPACER, 1)
+ R.add_language(LANGUAGE_MOUSE, 1)
+ R.add_language(LANGUAGE_ANIMAL, 1)
+ R.add_language(LANGUAGE_TEPPI, 1)
+ //CHOMPEdit Start
+ R.add_language(LANGUAGE_SLAVIC, 1)
+ R.add_language(LANGUAGE_MARISH, 1)
+ //CHOMPEdit End
+ /* Admin Stuff
+ R.add_language(LANGUAGE_CULT, 1)
+ R.add_language(LANGUAGE_SWARMBOT, 1)
+ R.add_language(LANGUAGE_MINBUS, 1)
+ R.add_language(LANGUAGE_EVENT1, 1)
+ */
+ /* We don't want telepathy, but want to mark it that it's not been oversighted
+ R.add_language(LANGUAGE_CHANGELING, 1)
+ R.add_language(LANGUAGE_ROOTGLOBAL, 1)
+ R.add_language(LANGUAGE_SHADEKIN, 1)
+ */
+
+ return 1
+
+/* ###########################################################################
+ # Advanced section. All upgrades which effect the robot's modules go here.#
+ ###########################################################################*/
+
+/obj/item/borg/upgrade/advanced
+ module_flags = BORG_ADVANCED
+
+/obj/item/borg/upgrade/advanced/bellysizeupgrade
+ name = "robohound capacity expansion module"
+ desc = "Used to double a robohound's belly capacity. This only affects total volume, and won't allow support of more than one patient in case of sleeper bellies. Can only be applied once."
+ icon_state = "cyborg_upgrade2"
+ item_state = "cyborg_upgrade"
+ require_module = 1
+
+/obj/item/borg/upgrade/advanced/bellysizeupgrade/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
+ var/obj/T = R.has_upgrade_module(/obj/item/device/dogborg/sleeper)
+ if(!T)
+ to_chat(usr, "This robot has had its processor removed!")
+ return 0
+
+ if(R.has_advanced_upgrade(type))
+ to_chat(R, "Maximum capacity achieved for this hardpoint!")
+ to_chat(usr, "There's no room for another capacity upgrade!")
+ return 0
+
+ var/obj/item/device/dogborg/sleeper/B = T
+ var/X = B.max_item_count*2
+ B.max_item_count = X //I couldn't do T = maxitem*2 for some reason.
+ to_chat(R, "Internal capacity doubled.")
+ to_chat(usr, "Internal capacity doubled.")
+ B.upgraded_capacity = TRUE
+ return 1
+
+/obj/item/borg/upgrade/advanced/jetpack
+ name = "robot jetpack"
+ desc = "A carbon dioxide jetpack suitable for low-gravity operations."
+ icon_state = "cyborg_upgrade3"
+ item_state = "cyborg_upgrade"
+ require_module = 1
+
+/obj/item/borg/upgrade/advanced/jetpack/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
+ if(R.has_advanced_upgrade(type))
+ to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
+ to_chat(usr, "There's no mounting point for the module!")
+ return 0
+
+ R.module.modules += new/obj/item/weapon/tank/jetpack/carbondioxide(R.module)
+ for(var/obj/item/weapon/tank/jetpack/carbondioxide in R.module.modules)
+ R.internals = src
+ return 1
+
+/obj/item/borg/upgrade/advanced/advhealth
+ name = "advanced health analyzer module"
+ desc = "An Advanced Health Analyzer, optimized for borg mounting."
+ icon_state = "cyborg_upgrade3"
+ item_state = "cyborg_upgrade"
+ require_module = 1
+
+/obj/item/borg/upgrade/advanced/advhealth/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
+ if(R.has_advanced_upgrade(type))
+ to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
+ to_chat(usr, "There's no mounting point for the module!")
+ return 0
+
+ R.module.modules += new/obj/item/device/healthanalyzer/advanced(R.module)
+ return 1
+
+//Robot size gun
+/obj/item/borg/upgrade/advanced/sizegun
+ name = "robot mounted size gun"
+ desc = "A size gun adapted for installation in cyborgs, allows them to turn people pocket-sized among other uses. What could go wrong?"
+ icon_state = "cyborg_upgrade2"
+ item_state = "cyborg_upgrade"
+ require_module = 1
+
+/obj/item/borg/upgrade/advanced/sizegun/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
+ if(R.has_advanced_upgrade(type))
+ to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
+ to_chat(usr, "There's no mounting point for the module!")
+ return 0
+
+ R.module.modules += new/obj/item/weapon/gun/energy/sizegun/mounted(R.module)
+ return 1
+
+/* ##############################################################################
+ # Restricted section. All upgrades which only work on specific modules go here.#
+ ##############################################################################*/
+
+//adds the capability to ingest items to the sleeper modules as optional upgrade
+/obj/item/borg/upgrade/restricted/bellycapupgrade
+ name = "robohound capability expansion module"
+ desc = "Used to enable a robohound's sleeper to ingest items. This only affects sleepers, and has no effect on compactor bellies. Can only be applied once."
+ icon_state = "cyborg_upgrade2"
+ item_state = "cyborg_upgrade"
+ require_module = 1
+ module_flags = BORG_MODULE_SECURITY | BORG_MODULE_MEDICAL | BORG_MODULE_COMBAT
+
+/obj/item/borg/upgrade/restricted/bellycapupgrade/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
+ if(!R.supports_upgrade(type))
+ to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
+ to_chat(usr, "There's no mounting point for the module!")
+ return 0
+
+ var/obj/T = R.has_upgrade_module(/obj/item/device/dogborg/sleeper)
+ if(!T)
+ to_chat(usr, "This robot has had its processor removed!")
+ return 0
+
+ if(R.has_restricted_upgrade(type))
+ to_chat(R, "Maximum capability achieved for this hardpoint!")
+ to_chat(usr, "There's no room for another capability upgrade!")
+ return 0
+
+ var/obj/item/device/dogborg/sleeper/B = T
+ var/X = B.max_item_count*2 //double the capacity from 1 to 2 to allow sleepers to store some items, at most 4 with both upgrades
+ B.max_item_count = X //I couldn't do T = maxitem*2 for some reason.
+ to_chat(R, "Internal capability upgraded.")
+ to_chat(usr, "Internal capability upgraded.")
+ B.compactor = TRUE
+ return 1
+
+/obj/item/borg/upgrade/restricted/tasercooler
name = "robotic Rapid Taser Cooling Module"
desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate."
icon_state = "cyborg_upgrade3"
@@ -102,116 +349,125 @@
require_module = 1
-/obj/item/borg/upgrade/tasercooler/action(var/mob/living/silicon/robot/R)
+/obj/item/borg/upgrade/restricted/tasercooler/action(var/mob/living/silicon/robot/R)
if(..()) return 0
- if(!R.module || !(type in R.module.supported_upgrades))
+ if(!R.supports_upgrade(type))
to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
to_chat(usr, "There's no mounting point for the module!")
return 0
- var/obj/item/weapon/gun/energy/taser/mounted/cyborg/T = locate() in R.module
- if(!T)
- T = locate() in R.module.contents
- if(!T)
- T = locate() in R.module.modules
+ var/obj/T = R.has_upgrade_module(/obj/item/weapon/gun/energy/taser/mounted/cyborg)
if(!T)
to_chat(usr, "This robot has had its taser removed!")
return 0
- if(T.recharge_time <= 2)
+ if(R.has_restricted_upgrade(type))
to_chat(R, "Maximum cooling achieved for this hardpoint!")
to_chat(usr, "There's no room for another cooling unit!")
return 0
- else
- T.recharge_time = max(2 , T.recharge_time - 4)
-
+ var/obj/item/weapon/gun/energy/taser/mounted/cyborg/B = T
+ B.recharge_time = max(2 , B.recharge_time - 4)
return 1
-/obj/item/borg/upgrade/jetpack
- name = "robot jetpack"
- desc = "A carbon dioxide jetpack suitable for low-gravity operations."
+//Advanced RPED
+/obj/item/borg/upgrade/restricted/advrped
+ name = "Advanced Rapid Part Exchange Device"
+ desc = "An ARPED, now in borg size!"
icon_state = "cyborg_upgrade3"
item_state = "cyborg_upgrade"
+ module_flags = BORG_MODULE_SCIENCE
require_module = 1
-/obj/item/borg/upgrade/jetpack/action(var/mob/living/silicon/robot/R)
+/obj/item/borg/upgrade/restricted/advrped/action(var/mob/living/silicon/robot/R)
if(..()) return 0
- var/obj/item/weapon/tank/jetpack/carbondioxide/T = locate() in R.module
- if(!T)
- T = locate() in R.module.contents
- if(!T)
- T = locate() in R.module.modules
- if(!T)
- R.module.modules += new/obj/item/weapon/tank/jetpack/carbondioxide(R.module)
- for(var/obj/item/weapon/tank/jetpack/carbondioxide in R.module.modules)
- R.internals = src
- return 1
- if(T)
+ if(!R.supports_upgrade(type))
to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
to_chat(usr, "There's no mounting point for the module!")
return 0
-/obj/item/borg/upgrade/advhealth
- name = "advanced health analyzer module"
- desc = "An Advanced Health Analyzer, optimized for borg mounting."
- icon_state = "cyborg_upgrade3"
- item_state = "cyborg_upgrade"
- require_module = 1
-
-/obj/item/borg/upgrade/advhealth/action(var/mob/living/silicon/robot/R)
- if(..()) return 0
-
- var/obj/item/device/healthanalyzer/advanced/T = locate() in R.module
- if(!T)
- T = locate() in R.module.contents
- if(!T)
- T = locate() in R.module.modules
- if(!T)
- R.module.modules += new/obj/item/device/healthanalyzer/advanced(R.module)
- return 1
- if(T)
+ if(R.has_restricted_upgrade(type))
to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
to_chat(usr, "There's no mounting point for the module!")
return 0
-/obj/item/borg/upgrade/syndicate/
- name = "scrambled equipment module"
- desc = "Unlocks new and often deadly module specific items of a robot"
+ R.module.modules += new/obj/item/weapon/storage/part_replacer/adv(R.module)
+ return 1
+
+//Diamond Drill
+/obj/item/borg/upgrade/restricted/diamonddrill
+ name = "Mounted Diamond Drill"
+ desc = "An advanced drill, optimized for borg use."
icon_state = "cyborg_upgrade3"
item_state = "cyborg_upgrade"
+ module_flags = BORG_MODULE_MINER
+ require_module = 1
+
+/obj/item/borg/upgrade/restricted/diamonddrill/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
+ if(!R.supports_upgrade(type))
+ to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
+ to_chat(usr, "There's no mounting point for the module!")
+ return 0
+
+ if(R.has_restricted_upgrade(type))
+ to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
+ to_chat(usr, "There's no mounting point for the module!")
+ return 0
+
+ R.module.modules += new/obj/item/weapon/pickaxe/diamonddrill(R.module)
+ return 1
+
+//PKA
+/obj/item/borg/upgrade/restricted/pka
+ name = "Protokenetic Accelerator Upgrade"
+ desc = "A borg mounted PKA Rifle for use in mining and wildlife defense."
+ icon_state = "cyborg_upgrade3"
+ item_state = "cyborg_upgrade"
+ module_flags = BORG_MODULE_MINER
+ require_module = 1
+
+/obj/item/borg/upgrade/restricted/pka/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
+ if(!R.supports_upgrade(type))
+ to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
+ to_chat(usr, "There's no mounting point for the module!")
+ return 0
+
+ if(R.has_restricted_upgrade(type))
+ to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
+ to_chat(usr, "There's no mounting point for the module!")
+ return 0
+
+ R.module.modules += new/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg(R.module)
+ return 1
+
+/* ###############################################
+ # Unsorted section. All cargo modules go here.#
+ ###############################################*/
+
+/obj/item/borg/upgrade/no_prod
+ var/hidden_from_scan = 0//use this for unproduceable modules you want to hide from scanning (e.g. event tools / admeme)
+
+//cyborg foam dart gun
+/obj/item/borg/upgrade/no_prod/toygun
+ name = "Donk-Soft Cyborg Blaster module" //Cyborg Blaster is capitalized because it's the brand name
+ desc = "A foam dart gun designed for mounting into cyborgs. It's Donk or Don't! DISCLAIMER: Donk-Soft bears no responsibility for incidents relating to cyborgs becoming too accustomed to shooting at crew. Installation of the Donk-Soft Cyborg Blaster must be performed only by a licensed roboticist."
+ icon_state = "cyborg_upgrade5"
+ item_state = "cyborg_upgrade"
require_module = 1
-/obj/item/borg/upgrade/syndicate/action(var/mob/living/silicon/robot/R)
+/obj/item/borg/upgrade/no_prod/toygun/action(var/mob/living/silicon/robot/R)
if(..()) return 0
- if(R.emag_items == 1)
+ if(R.has_no_prod_upgrade(type))
+ to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
+ to_chat(usr, "There's no mounting point for the module!")
return 0
- R.emag_items = 1
- return 1
-
-/obj/item/borg/upgrade/language
- name = "language module"
- desc = "Used to let cyborgs other than clerical or service speak a variety of languages."
- icon_state = "cyborg_upgrade3"
- item_state = "cyborg_upgrade"
-
-/obj/item/borg/upgrade/language/action(var/mob/living/silicon/robot/R)
- if(..()) return 0
-
- R.add_language(LANGUAGE_SOL_COMMON, 1)
- R.add_language(LANGUAGE_TRADEBAND, 1)
- R.add_language(LANGUAGE_UNATHI, 1)
- R.add_language(LANGUAGE_SIIK, 1)
- R.add_language(LANGUAGE_AKHANI, 1)
- R.add_language(LANGUAGE_SKRELLIAN, 1)
- R.add_language(LANGUAGE_GUTTER, 1)
- R.add_language(LANGUAGE_SCHECHI, 1)
- R.add_language(LANGUAGE_ROOTLOCAL, 1)
- R.add_language(LANGUAGE_TERMINUS, 1)
- R.add_language(LANGUAGE_ZADDAT, 1)
-
+ R.module.modules += new/obj/item/weapon/gun/projectile/cyborgtoy(R.module)
return 1
diff --git a/code/game/objects/items/robot/robot_upgrades_vr.dm b/code/game/objects/items/robot/robot_upgrades_vr.dm
deleted file mode 100644
index 54f0d6d09d..0000000000
--- a/code/game/objects/items/robot/robot_upgrades_vr.dm
+++ /dev/null
@@ -1,243 +0,0 @@
-/obj/item/borg/upgrade/language/action(var/mob/living/silicon/robot/R)
- if(..())
- R.add_language(LANGUAGE_BIRDSONG, 1)
- R.add_language(LANGUAGE_SAGARU, 1)
- R.add_language(LANGUAGE_CANILUNZT, 1)
- R.add_language(LANGUAGE_ECUREUILIAN, 1)
- R.add_language(LANGUAGE_DAEMON, 1)
- R.add_language(LANGUAGE_ENOCHIAN, 1)
- R.add_language(LANGUAGE_SLAVIC, 1) //CHOMP reAdd
- R.add_language(LANGUAGE_DRUDAKAR, 1)
- R.add_language(LANGUAGE_TAVAN, 1)
- return 1
- else
- return 0
-
-//Robot resizing module
-
-/obj/item/borg/upgrade/sizeshift
- name = "robot size alteration module"
- desc = "Using technology similar to one used in sizeguns, allows cyborgs to adjust their own size as neccesary."
- icon_state = "cyborg_upgrade2"
- item_state = "cyborg_upgrade"
- require_module = 1
-
-/obj/item/borg/upgrade/sizeshift/action(var/mob/living/silicon/robot/R)
- if(..()) return 0
-
- if(/mob/living/proc/set_size in R.verbs)
- return 0
-
- R.verbs += /mob/living/proc/set_size
- return 1
-
-//Robot size gun
-/obj/item/borg/upgrade/sizegun
- name = "robot mounted size gun"
- desc = "A size gun adapted for installation in cyborgs, allows them to turn people pocket-sized among other uses. What could go wrong?"
- icon_state = "cyborg_upgrade2"
- item_state = "cyborg_upgrade"
- require_module = 1
-
-/obj/item/borg/upgrade/sizegun/action(var/mob/living/silicon/robot/R)
- if(..()) return 0
-
- var/obj/item/weapon/gun/energy/sizegun/mounted/T = locate() in R.module
- if(!T)
- T = locate() in R.module.contents
- if(!T)
- T = locate() in R.module.modules
- if(!T)
- R.module.modules += new/obj/item/weapon/gun/energy/sizegun/mounted(R.module)
- return 1
- if(T)
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
- return 0
-
-/obj/item/borg/upgrade/bellysizeupgrade
- name = "robohound capacity expansion module"
- desc = "Used to double a robohound's belly capacity. This only affects total volume, and won't allow support of more than one patient in case of sleeper bellies. Can only be applied once."
- icon_state = "cyborg_upgrade2"
- item_state = "cyborg_upgrade"
- require_module = 1
-
-/obj/item/borg/upgrade/bellysizeupgrade/action(var/mob/living/silicon/robot/R)
- if(..()) return 0
-
- if(!R.module)//can work
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
- return 0
-
- var/obj/item/device/dogborg/sleeper/T = locate() in R.module
- if(!T)
- T = locate() in R.module.contents
- if(!T)
- T = locate() in R.module.modules
- if(!T)
- to_chat(usr, "This robot has had its processor removed!")
- return 0
-
- if(T.upgraded_capacity)// == TRUE
- to_chat(R, "Maximum capacity achieved for this hardpoint!")
- to_chat(usr, "There's no room for another capacity upgrade!")
- return 0
- else
- var/X = T.max_item_count*2
- T.max_item_count = X //I couldn't do T = maxitem*2 for some reason.
- to_chat(R, "Internal capacity doubled.")
- to_chat(usr, "Internal capacity doubled.")
- T.upgraded_capacity = TRUE
- return 1
-
-//adds the capability to ingest items to the sleeper modules as optional upgrade
-/obj/item/borg/upgrade/bellycapupgrade
- name = "robohound capability expansion module"
- desc = "Used to enable a robohound's sleeper to ingest items. This only affects sleepers, and has no effect on compactor bellies. Can only be applied once."
- icon_state = "cyborg_upgrade2"
- item_state = "cyborg_upgrade"
- require_module = 1
-
-/obj/item/borg/upgrade/bellycapupgrade/action(var/mob/living/silicon/robot/R)
- if(..()) return 0
-
- if(!R.module)//can work
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
- return 0
-
- var/obj/item/device/dogborg/sleeper/T = locate() in R.module
- if(!T)
- T = locate() in R.module.contents
- if(!T)
- T = locate() in R.module.modules
- if(!T)
- to_chat(usr, "This robot has had its processor removed!")
- return 0
-
- if(T.compactor)// == TRUE, the belly unit is a compactor and no sleeper unit already
- to_chat(R, "Maximum capability achieved for this hardpoint!")
- to_chat(usr, "There's no room for another capability upgrade!")
- return 0
- else
- var/X = T.max_item_count*2 //double the capacity from 1 to 2 to allow sleepers to store some items, at most 4 with both upgrades
- T.max_item_count = X //I couldn't do T = maxitem*2 for some reason.
- to_chat(R, "Internal capability upgraded.")
- to_chat(usr, "Internal capability upgraded.")
- T.compactor = TRUE
- return 1
-
-//Advanced RPED
-/obj/item/borg/upgrade/advrped
- name = "Advanced Rapid Part Exchange Device"
- desc = "An ARPED, now in borg size!"
- icon_state = "cyborg_upgrade3"
- item_state = "cyborg_upgrade"
- module_flags = BORG_MODULE_SCIENCE
- require_module = 1
-
-/obj/item/borg/upgrade/advrped/action(var/mob/living/silicon/robot/R)
- if(..()) return 0
-
- var/obj/item/weapon/storage/part_replacer/adv/T = locate() in R.module
-
- if(!R.module || !(type in R.module.supported_upgrades))
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
- return 0
- if(!T)
- T = locate() in R.module.contents
- if(!T)
- T = locate() in R.module.modules
- if(!T)
- R.module.modules += new/obj/item/weapon/storage/part_replacer/adv(R.module)
- return 1
- if(T)
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
- return 0
-
-//Diamond Drill
-/obj/item/borg/upgrade/diamonddrill
- name = "Mounted Diamond Drill"
- desc = "An advanced drill, optimized for borg use."
- icon_state = "cyborg_upgrade3"
- item_state = "cyborg_upgrade"
- module_flags = BORG_MODULE_MINER
- require_module = 1
-
-/obj/item/borg/upgrade/diamonddrill/action(var/mob/living/silicon/robot/R)
- if(..()) return 0
-
- var/obj/item/weapon/pickaxe/diamonddrill/T = locate() in R.module
-
- if(!R.module || !(type in R.module.supported_upgrades))
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
- return 0
- if(!T)
- T = locate() in R.module.contents
- if(!T)
- T = locate() in R.module.modules
- if(!T)
- R.module.modules += new/obj/item/weapon/pickaxe/diamonddrill(R.module)
- return 1
- if(T)
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
- return 0
-
-//PKA
-/obj/item/borg/upgrade/pka
- name = "Protokenetic Accelerator Upgrade"
- desc = "A borg mounted PKA Rifle for use in mining and wildlife defense."
- icon_state = "cyborg_upgrade3"
- item_state = "cyborg_upgrade"
- module_flags = BORG_MODULE_MINER
- require_module = 1
-
-/obj/item/borg/upgrade/pka/action(var/mob/living/silicon/robot/R)
- if(..()) return 0
-
- var/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg/T = locate() in R.module
-
- if(!R.module || !(type in R.module.supported_upgrades))
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
- return 0
- if(!T)
- T = locate() in R.module.contents
- if(!T)
- T = locate() in R.module.modules
- if(!T)
- R.module.modules += new/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg(R.module)
- return 1
- if(T)
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
- return 0
-
-//cyborg foam dart gun
-/obj/item/borg/upgrade/toygun
- name = "Donk-Soft Cyborg Blaster module" //Cyborg Blaster is capitalized because it's the brand name
- desc = "A foam dart gun designed for mounting into cyborgs. It's Donk or Don't! DISCLAIMER: Donk-Soft bears no responsibility for incidents relating to cyborgs becoming too accustomed to shooting at crew. Installation of the Donk-Soft Cyborg Blaster must be performed only by a licensed roboticist."
- icon_state = "cyborg_upgrade5"
- item_state = "cyborg_upgrade"
- require_module = 1
-
-/obj/item/borg/upgrade/toygun/action(var/mob/living/silicon/robot/R)
- if(..()) return 0
-
- var/obj/item/weapon/gun/projectile/cyborgtoy/T = locate() in R.module
- if(!T)
- T = locate() in R.module.contents
- if(!T)
- T = locate() in R.module.modules
- if(!T)
- R.module.modules += new/obj/item/weapon/gun/projectile/cyborgtoy(R.module)
- return 1
- if(T)
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
- return 0
diff --git a/code/game/objects/structures/loot_piles.dm b/code/game/objects/structures/loot_piles.dm
index 0100167a05..a43a15afbe 100644
--- a/code/game/objects/structures/loot_piles.dm
+++ b/code/game/objects/structures/loot_piles.dm
@@ -349,7 +349,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
/obj/item/weapon/stock_parts/subspace/treatment,
/obj/item/frame,
/obj/item/broken_device/random,
- /obj/item/borg/upgrade/restart,
+ /obj/item/borg/upgrade/utility/restart,
/obj/item/weapon/cell,
/obj/item/weapon/cell/high,
/obj/item/weapon/cell/device,
@@ -407,10 +407,10 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
/obj/item/device/tvcamera,
/obj/item/device/universal_translator,
/obj/item/device/aicard,
- /obj/item/borg/upgrade/jetpack,
- /obj/item/borg/upgrade/advhealth,
- /obj/item/borg/upgrade/vtec,
- /obj/item/borg/upgrade/tasercooler,
+ /obj/item/borg/upgrade/advanced/jetpack,
+ /obj/item/borg/upgrade/advanced/advhealth,
+ /obj/item/borg/upgrade/basic/vtec,
+ /obj/item/borg/upgrade/restricted/tasercooler,
/obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser,
/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill,
/obj/item/rig_module/device/drill,
@@ -917,11 +917,11 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
rare_loot = list(
/obj/item/weapon/cell/super,
- /obj/item/borg/upgrade/restart,
- /obj/item/borg/upgrade/jetpack,
- /obj/item/borg/upgrade/tasercooler,
- /obj/item/borg/upgrade/syndicate,
- /obj/item/borg/upgrade/vtec
+ /obj/item/borg/upgrade/utility/restart,
+ /obj/item/borg/upgrade/advanced/jetpack,
+ /obj/item/borg/upgrade/restricted/tasercooler,
+ /obj/item/borg/upgrade/basic/syndicate,
+ /obj/item/borg/upgrade/basic/vtec
)
// Contains old mediciation, most of it unidentified and has a good chance of being useless.
@@ -946,4 +946,4 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
common_loot = list(
/obj/random/unidentified_medicine/fresh_medicine
- )
\ No newline at end of file
+ )
diff --git a/code/modules/admin/verbs/modify_robot.dm b/code/modules/admin/verbs/modify_robot.dm
index 6a13ee9807..619da6ebcb 100644
--- a/code/modules/admin/verbs/modify_robot.dm
+++ b/code/modules/admin/verbs/modify_robot.dm
@@ -3,7 +3,7 @@
set name = "Modify Robot Module"
set desc = "Allows to add or remove modules to/from robots."
set category = "Admin"
- if(!check_rights(R_ADMIN, R_FUN, R_VAREDIT))
+ if(!check_rights(R_ADMIN))
return
if(!istype(target) || !target.module)
@@ -12,12 +12,16 @@
if(!target.module.modules)
return
- var/list/modification_options = list(MODIFIY_ROBOT_MODULE_ADD,MODIFIY_ROBOT_MODULE_REMOVE, MODIFIY_ROBOT_APPLY_UPGRADE, MODIFIY_ROBOT_RADIOC_ADD, MODIFIY_ROBOT_RADIOC_REMOVE, MODIFIY_ROBOT_COMP_ADD, MODIFIY_ROBOT_COMP_REMOVE, MODIFIY_ROBOT_RESET_MODULE)
+ var/list/modification_options = list(MODIFIY_ROBOT_MODULE_ADD,MODIFIY_ROBOT_MODULE_REMOVE, MODIFIY_ROBOT_APPLY_UPGRADE, MODIFIY_ROBOT_SUPP_ADD, MODIFIY_ROBOT_SUPP_REMOVE, MODIFIY_ROBOT_RADIOC_ADD, MODIFIY_ROBOT_RADIOC_REMOVE, MODIFIY_ROBOT_COMP_ADD, MODIFIY_ROBOT_COMP_REMOVE, MODIFIY_ROBOT_RESET_MODULE)
while(TRUE)
var/modification_choice = tgui_input_list(usr, "Select if you want to add or remove a module to/from [target]","Choice", modification_options)
if(!modification_choice || modification_choice == "Cancel")
- break
+ return
+
+ if(!target.module || !target.module.modules)
+ to_chat(usr, "[target] was recently reset, you must wait until module selection has been completed before continuing modifying.")
+ continue
log_and_message_admins("[key_name(src)] has used MODIFYROBOT ([modification_choice]) on [key_name(target)].")
feedback_add_details("admin_verb","MODIFYROBOT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -105,7 +109,8 @@
if(MODIFIY_ROBOT_APPLY_UPGRADE)
var/list/upgrades = list()
for(var/datum/design/item/prosfab/robot_upgrade/upgrade)
- upgrades[initial(upgrade.name)] = initial(upgrade.build_path)
+ if(!(target.has_upgrade(initial(upgrade.build_path))))
+ upgrades[initial(upgrade.name)] = initial(upgrade.build_path)
while(TRUE)
var/selected_module_upgrade = tgui_input_list(usr, "Please select the module to remove", "Upgrades", upgrades)
if(!selected_module_upgrade || selected_module_upgrade == "Cancel")
@@ -114,9 +119,16 @@
if(tgui_alert(usr, "Are you sure that you want to install [selected_module_upgrade] and reset the robot's module?","Confirm",list("Yes","No"))=="No")
continue
var/new_upgrade = upgrades[capitalize(selected_module_upgrade)]
- target.module.supported_upgrades += new_upgrade
upgrades.Remove(selected_module_upgrade)
var/obj/item/borg/upgrade/U = new new_upgrade(src)
+ if(selected_module_upgrade == "Rename Module")
+ var/obj/item/borg/upgrade/utility/rename/UN = U
+ var/new_name = sanitizeSafe(tgui_input_text(usr, "Enter new robot name", "Robot Reclassification", UN.heldname, MAX_NAME_LEN), MAX_NAME_LEN)
+ if(new_name)
+ UN.heldname = new_name
+ U = UN
+ if(istype(U, /obj/item/borg/upgrade/restricted))
+ target.module.supported_upgrades |= new_upgrade
if(U.action(target))
to_chat(usr, "You apply the [U] to [target]!")
usr.drop_item()
@@ -143,6 +155,30 @@
modkits.Remove(selected_ka_upgrade)
M.install(kin, target)
capacity = kin.get_remaining_mod_capacity()
+ if(MODIFIY_ROBOT_SUPP_ADD)
+ var/list/whitelisted_upgrades = list()
+ for(var/datum/design/item/prosfab/robot_upgrade/restricted/upgrade)
+ if(!(initial(upgrade.build_path) in target.module.supported_upgrades))
+ whitelisted_upgrades[initial(upgrade.name)] = initial(upgrade.build_path)
+ while(TRUE)
+ var/selected_upgrade_type = tgui_input_list(usr, "Please select which upgrade you want this module to support", "Upgrades", whitelisted_upgrades)
+ if(!selected_upgrade_type || selected_upgrade_type == "Cancel")
+ break
+ var/upgrade_path = whitelisted_upgrades[capitalize(selected_upgrade_type)]
+ whitelisted_upgrades.Remove(selected_upgrade_type)
+ target.module.supported_upgrades |= upgrade_path
+ if(MODIFIY_ROBOT_SUPP_REMOVE)
+ var/list/whitelisted_upgrades = list()
+ for(var/datum/design/item/prosfab/robot_upgrade/restricted/upgrade)
+ if((initial(upgrade.build_path) in target.module.supported_upgrades))
+ whitelisted_upgrades[initial(upgrade.name)] = initial(upgrade.build_path)
+ while(TRUE)
+ var/selected_upgrade_type = tgui_input_list(usr, "Please select which upgrade you want this module to support", "Upgrades", whitelisted_upgrades)
+ if(!selected_upgrade_type || selected_upgrade_type == "Cancel")
+ break
+ var/upgrade_path = whitelisted_upgrades[capitalize(selected_upgrade_type)]
+ whitelisted_upgrades.Remove(selected_upgrade_type)
+ target.module.supported_upgrades -= upgrade_path
if(MODIFIY_ROBOT_RADIOC_ADD)
var/list/available_channels = radiochannels.Copy()
for(var/has_channel in target.radio.channels)
@@ -240,6 +276,6 @@
to_chat(usr, "You removed \"[C]\" from [target]")
if(MODIFIY_ROBOT_RESET_MODULE)
if(tgui_alert(usr, "Are you sure that you want to reset the entire module?","Confirm",list("Yes","No"))=="No")
- return
+ continue
target.module_reset()
to_chat(usr, "You resetted [target]'s module selection.")
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index b08c51f54b..6adc4a0bfd 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -409,15 +409,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]
diff --git a/code/modules/mob/living/silicon/robot/analyzer.dm b/code/modules/mob/living/silicon/robot/analyzer.dm
index 74e9f9750d..9e6fbdb2d2 100644
--- a/code/modules/mob/living/silicon/robot/analyzer.dm
+++ b/code/modules/mob/living/silicon/robot/analyzer.dm
@@ -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,119 @@
user.visible_message("\The [user] has analyzed [M]'s components.","You have analyzed [M]'s components.")
switch(scan_type)
if("robot")
- var/BU = M.getFireLoss() > 50 ? "[M.getFireLoss()]" : M.getFireLoss()
- var/BR = M.getBruteLoss() > 50 ? "[M.getBruteLoss()]" : 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("DESTROYED")] " :"",\
- (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 ? "[M.getFireLoss()]" : M.getFireLoss()
+ var/BR = M.getBruteLoss() > 50 ? "[M.getBruteLoss()]" : 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("[cell_charge]")
+ 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("DESTROYED")] " :"",\
+ (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]°C ([M.bodytemperature*1.8-459.67]°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]°C ([M.bodytemperature*1.8-459.67]°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/obj/item/borg/upgrade/utility/upgrade_type = initial(upgrade.build_path)
+ var/needs_module = initial(upgrade_type.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/obj/item/borg/upgrade/basic/upgrade_type = initial(upgrade.build_path)
+ var/needs_module = initial(upgrade_type.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("ERROR")]"))
+ 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/obj/item/borg/upgrade/advanced/upgrade_type = initial(upgrade.build_path)
+ var/needs_module = initial(upgrade_type.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("ERROR")]"))
+ 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/obj/item/borg/upgrade/restricted/upgrade_type = initial(upgrade.build_path)
+ var/needs_module = initial(upgrade_type.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("ERROR")]"))
+ 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/obj/item/borg/upgrade/no_prod/upgrade_type = initial(upgrade.build_path)
+ var/needs_module = initial(upgrade_type.require_module)
+ var/hidden = initial(upgrade_type.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("ERROR")]"))
+ 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 +203,7 @@
var/output = {"Analyzing Results for \the [Mecha]:
Chassis Integrity: [integrity]%
- Powercell charge: [isnull(cell_charge)?"No powercell installed":"[Mecha.cell.percent()]%"]
+ Powercell charge: [isnull(cell_charge)?"No powercell installed":"[capitalize(initial(Mecha.cell.name))] at [Mecha.cell.percent()]%"]
Air source: [Mecha.use_internal_tank?"Internal Airtank":"Environment"]
Airtank pressure: [tank_pressure]kPa
Airtank temperature: [tank_temperature]K|[tank_temperature - T0C]°C
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 37dc39591e..b46aae67dc 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -1490,3 +1490,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))
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm
index b0bfdd6be1..44fdf7588b 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm
@@ -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()
@@ -110,8 +108,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)
@@ -245,6 +241,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)
/* CHOMPedit start: Removal of Surgeon module. *
@@ -507,7 +504,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
@@ -707,7 +704,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)
@@ -730,7 +727,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)
@@ -793,6 +790,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)
..()
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm
index b6ed16f65f..7ed9934042 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm
@@ -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)
..()
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm b/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm
index 7bdd95f2e7..d082d053e4 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm
@@ -71,8 +71,8 @@
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)
+
can_be_drop_prey = FALSE //CHOMP Add
/mob/living/simple_mob/vore/aggressive/corrupthound/prettyboi
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 333070b352..94521d3d4a 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -71,8 +71,10 @@
to_chat(src, "... You can almost hear someone talking ...")
else
if(client && client.prefs.chat_timestamp)
- msg = replacetext(msg, new/regex("^(]*)?>)((?:.|\\n)*)", ""), "$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("^(]*)?>)((?:.|\\n)*)", ""), "$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
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 9d9d036829..a462ced25a 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -161,12 +161,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
diff --git a/code/modules/power/cells/power_cells.dm b/code/modules/power/cells/power_cells.dm
index 8f8d01b1cc..17df91f2f2 100644
--- a/code/modules/power/cells/power_cells.dm
+++ b/code/modules/power/cells/power_cells.dm
@@ -39,7 +39,7 @@
* Robot
*/
/obj/item/weapon/cell/robot_station
- name = "A standard robot power cell"
+ name = "standard robot power cell"
maxcharge = 7500
/*
@@ -76,7 +76,7 @@
* Syndicate
*/
/obj/item/weapon/cell/robot_syndi
- name = "A syndicate robot power cell"
+ name = "syndicate robot power cell"
description_fluff = "Almost as good as a hyper."
icon_state = "super" //We don't want roboticists confuse it with a low standard cell
maxcharge = 25000
diff --git a/code/modules/reagents/reagent_containers/borghypo.dm b/code/modules/reagents/reagent_containers/borghypo.dm
index 39328b0773..fa8becfe14 100644
--- a/code/modules/reagents/reagent_containers/borghypo.dm
+++ b/code/modules/reagents/reagent_containers/borghypo.dm
@@ -98,7 +98,7 @@
return
/obj/item/weapon/reagent_containers/borghypo/attack_self(mob/user as mob) //Change the mode
- var/t = ""
+ var/t = ""
for(var/i = 1 to reagent_ids.len)
if(t)
t += ", "
@@ -106,7 +106,7 @@
t += "[reagent_names[i]]"
else
t += "[reagent_names[i]]"
- t = "Available reagents: [t]."
+ t = "Available reagents: [t]."
to_chat(user,t)
return
diff --git a/code/modules/research/prosfab_designs.dm b/code/modules/research/prosfab_designs.dm
index df6dbcd4d6..d37a8adf67 100644
--- a/code/modules/research/prosfab_designs.dm
+++ b/code/modules/research/prosfab_designs.dm
@@ -385,68 +385,140 @@
time = 12
materials = list(MAT_STEEL = 7500)
-/datum/design/item/prosfab/robot_upgrade/rename
+// Section for utility upgrades
+
+/datum/design/item/prosfab/robot_upgrade/utility/rename
name = "Rename Module"
desc = "Used to rename a cyborg."
id = "borg_rename_module"
- build_path = /obj/item/borg/upgrade/rename
+ build_path = /obj/item/borg/upgrade/utility/rename
-/datum/design/item/prosfab/robot_upgrade/reset
+/datum/design/item/prosfab/robot_upgrade/utility/reset
name = "Reset Module"
desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the robot."
id = "borg_reset_module"
- build_path = /obj/item/borg/upgrade/reset
+ build_path = /obj/item/borg/upgrade/utility/reset
-/datum/design/item/prosfab/robot_upgrade/restart
+/datum/design/item/prosfab/robot_upgrade/utility/restart
name = "Emergency Restart Module"
desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online."
id = "borg_restart_module"
materials = list(MAT_STEEL = 45000, MAT_GLASS = 3750)
- build_path = /obj/item/borg/upgrade/restart
+ build_path = /obj/item/borg/upgrade/utility/restart
-/datum/design/item/prosfab/robot_upgrade/vtec
+// Section for basic upgrades for all cyborgs
+
+/datum/design/item/prosfab/robot_upgrade/basic/sizeshift
+ name = "Size Alteration Module"
+ id = "borg_sizeshift_module"
+ req_tech = list(TECH_BLUESPACE = 3, TECH_MATERIAL = 3, TECH_POWER = 2)
+ materials = list(MAT_STEEL = 4000, MAT_GLASS = 4000)
+ build_path = /obj/item/borg/upgrade/basic/sizeshift
+
+/datum/design/item/prosfab/robot_upgrade/basic/vtec
name = "VTEC Module"
desc = "Used to kick in a robot's VTEC systems, increasing their speed."
id = "borg_vtec_module"
materials = list(MAT_STEEL = 60000, MAT_GLASS = 4500, MAT_GOLD = 3750)
- build_path = /obj/item/borg/upgrade/vtec
+ build_path = /obj/item/borg/upgrade/basic/vtec
-/datum/design/item/prosfab/robot_upgrade/tasercooler
- name = "Rapid Taser Cooling Module"
- desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate."
- id = "borg_taser_module"
- materials = list(MAT_STEEL = 60000, MAT_GLASS = 4500, MAT_GOLD = 1500, MAT_DIAMOND = 375)
- build_path = /obj/item/borg/upgrade/tasercooler
-
-/datum/design/item/prosfab/robot_upgrade/jetpack
- name = "Jetpack Module"
- desc = "A carbon dioxide jetpack suitable for low-gravity mining operations."
- id = "borg_jetpack_module"
- materials = list(MAT_STEEL = 7500, MAT_PHORON = 11250, MAT_URANIUM = 15000)
- build_path = /obj/item/borg/upgrade/jetpack
-
-/datum/design/item/prosfab/robot_upgrade/advhealth
- name = "Advanced Health Analyzer Module"
- desc = "An advanced health analyzer suitable for diagnosing more serious injuries."
- id = "borg_advhealth_module"
- materials = list(MAT_STEEL = 10000, MAT_GLASS = 6500, MAT_DIAMOND = 350)
- build_path = /obj/item/borg/upgrade/advhealth
-
-/datum/design/item/prosfab/robot_upgrade/syndicate
+/datum/design/item/prosfab/robot_upgrade/basic/syndicate
name = "Scrambled Equipment Module"
desc = "Allows for the construction of lethal upgrades for cyborgs."
id = "borg_syndicate_module"
req_tech = list(TECH_COMBAT = 4, TECH_ILLEGAL = 3)
materials = list(MAT_STEEL = 7500, MAT_GLASS = 11250, MAT_DIAMOND = 7500)
- build_path = /obj/item/borg/upgrade/syndicate
+ build_path = /obj/item/borg/upgrade/basic/syndicate
-/datum/design/item/prosfab/robot_upgrade/language
+/datum/design/item/prosfab/robot_upgrade/basic/language
name = "Language Module"
desc = "Used to let cyborgs other than clerical or service speak a variety of languages."
id = "borg_language_module"
req_tech = list(TECH_DATA = 6, TECH_MATERIAL = 6)
materials = list(MAT_STEEL = 25000, MAT_GLASS = 3000, MAT_GOLD = 350)
- build_path = /obj/item/borg/upgrade/language
+ build_path = /obj/item/borg/upgrade/basic/language
+
+// Section for advanced upgrades for all cyborgs
+
+/datum/design/item/prosfab/robot_upgrade/advanced/bellysizeupgrade
+ name = "Robohound Capacity Expansion Module"
+ id = "borg_hound_capacity_module"
+ req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 2)
+ materials = list(MAT_STEEL = 4000, MAT_GLASS = 4000)
+ build_path = /obj/item/borg/upgrade/advanced/bellysizeupgrade
+
+/datum/design/item/prosfab/robot_upgrade/advanced/sizegun
+ name = "Size Gun Module"
+ id = "borg_sizegun_module"
+ req_tech = list(TECH_COMBAT = 3, TECH_BLUESPACE = 3, TECH_MATERIAL = 3, TECH_POWER = 2)
+ materials = list(MAT_STEEL = 6000, MAT_GLASS = 4000)
+ build_path = /obj/item/borg/upgrade/advanced/sizegun
+
+/datum/design/item/prosfab/robot_upgrade/advanced/jetpack
+ name = "Jetpack Module"
+ desc = "A carbon dioxide jetpack suitable for low-gravity mining operations."
+ id = "borg_jetpack_module"
+ materials = list(MAT_STEEL = 7500, MAT_PHORON = 11250, MAT_URANIUM = 15000)
+ build_path = /obj/item/borg/upgrade/advanced/jetpack
+
+/datum/design/item/prosfab/robot_upgrade/advanced/advhealth
+ name = "Advanced Health Analyzer Module"
+ desc = "An advanced health analyzer suitable for diagnosing more serious injuries."
+ id = "borg_advhealth_module"
+ materials = list(MAT_STEEL = 10000, MAT_GLASS = 6500, MAT_DIAMOND = 350)
+ build_path = /obj/item/borg/upgrade/advanced/advhealth
+
+/*
+ Some job related borg upgrade modules, adding useful items for puppers.
+*/
+
+/datum/design/item/prosfab/robot_upgrade/restricted/bellycapupgrade
+ name = "Robohound Capability Expansion Module"
+ id = "borg_hound_capability_module"
+ req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4)
+ materials = list(MAT_STEEL = 8000, MAT_GLASS = 6000)
+ build_path = /obj/item/borg/upgrade/restricted/bellycapupgrade
+
+/datum/design/item/prosfab/robot_upgrade/restricted/advrped
+ name = "Advanced Rapid Part Exchange Device"
+ desc = "Exactly the same as a standard Advanced RPED, but this one has mounting hardware for a Science Borg."
+ id = "borg_advrped_module"
+ req_tech = list(TECH_ENGINEERING = 6, TECH_MATERIAL = 6)
+ materials = list(MAT_STEEL = 30000, MAT_GLASS = 10000)
+ build_path = /obj/item/borg/upgrade/restricted/advrped
+
+/datum/design/item/prosfab/robot_upgrade/restricted/diamonddrill
+ name = "Diamond Drill"
+ desc = "A mining drill with a diamond tip, made for use by Mining Borgs."
+ id = "borg_ddrill_module"
+ req_tech = list(TECH_MATERIAL = 6, TECH_POWER = 5, TECH_ENGINEERING = 5)
+ materials = list(MAT_STEEL = 3000, MAT_GLASS = 1000, MAT_DIAMOND = 2000)
+ build_path = /obj/item/borg/upgrade/restricted/diamonddrill
+
+/datum/design/item/prosfab/robot_upgrade/restricted/pka
+ name = "Proto-Kinetic Accelerator"
+ desc = "A mining weapon designed for clearing rocks and hostile wildlife. This model is equiped with a self upgrade system, allowing it to attach modules hands free."
+ id = "borg_pka_module"
+ req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 5, TECH_POWER = 4)
+ materials = list(MAT_PLASTEEL = 5000, MAT_GLASS = 1000, MAT_URANIUM = 500, MAT_PLATINUM = 350)
+ build_path = /obj/item/borg/upgrade/restricted/pka
+
+/datum/design/item/prosfab/robot_upgrade/restricted/tasercooler
+ name = "Rapid Taser Cooling Module"
+ desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate."
+ id = "borg_taser_module"
+ materials = list(MAT_STEEL = 60000, MAT_GLASS = 4500, MAT_GOLD = 1500, MAT_DIAMOND = 375)
+ build_path = /obj/item/borg/upgrade/restricted/tasercooler
+
+// Section for quick access for admins, events and such, but can't be produced.
+
+/datum/design/item/prosfab/robot_upgrade/no_prod/cyborgtoy
+ category = list() // We simply do not sort them in
+
+/datum/design/item/prosfab/robot_upgrade/no_prod/cyborgtoy
+ name = "Donk-Soft Cyborg Blaster"
+ id = "borg_hound_cyborg_blaster"
+ build_path = /obj/item/borg/upgrade/no_prod/toygun
// Synthmorph Bags.
@@ -546,3 +618,46 @@
time = 30
materials = list(MAT_STEEL = 8000, MAT_GLASS = 2000, MAT_SILVER = 2000, MAT_GOLD = 2000)
//req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_DATA = 5)
+
+///// pAI parts!!!
+
+//////////////////// Cyborg Parts ////////////////////
+/datum/design/item/prosfab/paiparts
+ category = list("pAI Parts")
+ time = 20
+ materials = list(MAT_STEEL = 1000, MAT_GLASS = 1000)
+
+/datum/design/item/prosfab/paiparts/cell
+ name = "pAI Cell"
+ id = "pai_cell"
+ build_path = /obj/item/paiparts/cell
+
+/datum/design/item/prosfab/paiparts/processor
+ name = "pAI Processor"
+ id = "pai_processor"
+ build_path = /obj/item/paiparts/processor
+
+/datum/design/item/prosfab/paiparts/board
+ name = "pAI Board"
+ id = "pai_board"
+ build_path = /obj/item/paiparts/board
+
+/datum/design/item/prosfab/paiparts/capacitor
+ name = "pAI capacitor"
+ id = "pai_capacitor"
+ build_path = /obj/item/paiparts/capacitor
+
+/datum/design/item/prosfab/paiparts/projector
+ name = "pAI Projector"
+ id = "pai_projector"
+ build_path = /obj/item/paiparts/projector
+
+/datum/design/item/prosfab/paiparts/emitter
+ name = "pAI Emitter"
+ id = "pai_emitter"
+ build_path = /obj/item/paiparts/emitter
+
+/datum/design/item/prosfab/paiparts/speech_synthesizer
+ name = "pAI Speech Synthesizer"
+ id = "pai_speech_synthesizer"
+ build_path = /obj/item/paiparts/speech_synthesizer
diff --git a/code/modules/research/prosfab_designs_vr.dm b/code/modules/research/prosfab_designs_vr.dm
deleted file mode 100644
index d5195b28ad..0000000000
--- a/code/modules/research/prosfab_designs_vr.dm
+++ /dev/null
@@ -1,100 +0,0 @@
-//Prosfab stuff for borgs and such
-
-/datum/design/item/prosfab/robot_upgrade/sizeshift
- name = "Size Alteration Module"
- id = "borg_sizeshift_module"
- req_tech = list(TECH_BLUESPACE = 3, TECH_MATERIAL = 3, TECH_POWER = 2)
- materials = list(MAT_STEEL = 4000, MAT_GLASS = 4000)
- build_path = /obj/item/borg/upgrade/sizeshift
-
-/datum/design/item/prosfab/robot_upgrade/sizegun
- name = "Size Gun Module"
- id = "borg_sizegun_module"
- req_tech = list(TECH_COMBAT = 3, TECH_BLUESPACE = 3, TECH_MATERIAL = 3, TECH_POWER = 2)
- materials = list(MAT_STEEL = 6000, MAT_GLASS = 4000)
- build_path = /obj/item/borg/upgrade/sizegun
-
-/datum/design/item/prosfab/robot_upgrade/bellysizeupgrade
- name = "Robohound Capacity Expansion Module"
- id = "borg_hound_capacity_module"
- req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 2)
- materials = list(MAT_STEEL = 4000, MAT_GLASS = 4000)
- build_path = /obj/item/borg/upgrade/bellysizeupgrade
-
-/datum/design/item/prosfab/robot_upgrade/bellycapupgrade
- name = "Robohound Capability Expansion Module"
- id = "borg_hound_capability_module"
- req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4)
- materials = list(MAT_STEEL = 8000, MAT_GLASS = 6000)
- build_path = /obj/item/borg/upgrade/bellycapupgrade
-
-/*
- Some job related borg upgrade modules, adding useful items for puppers.
-
-*/
-/datum/design/item/prosfab/robot_upgrade/advrped
- name = "Advanced Rapid Part Exchange Device"
- desc = "Exactly the same as a standard Advanced RPED, but this one has mounting hardware for a Science Borg."
- id = "borg_advrped_module"
- req_tech = list(TECH_ENGINEERING = 6, TECH_MATERIAL = 6)
- materials = list(MAT_STEEL = 30000, MAT_GLASS = 10000)
- build_path = /obj/item/borg/upgrade/advrped
-
-/datum/design/item/prosfab/robot_upgrade/diamonddrill
- name = "Diamond Drill"
- desc = "A mining drill with a diamond tip, made for use by Mining Borgs."
- id = "borg_ddrill_module"
- req_tech = list(TECH_MATERIAL = 6, TECH_POWER = 5, TECH_ENGINEERING = 5)
- materials = list(MAT_STEEL = 3000, MAT_GLASS = 1000, MAT_DIAMOND = 2000)
- build_path = /obj/item/borg/upgrade/diamonddrill
-
-/datum/design/item/prosfab/robot_upgrade/pka
- name = "Proto-Kinetic Accelerator"
- desc = "A mining weapon designed for clearing rocks and hostile wildlife. This model is equiped with a self upgrade system, allowing it to attach modules hands free."
- id = "borg_pka_module"
- req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 5, TECH_POWER = 4)
- materials = list(MAT_PLASTEEL = 5000, MAT_GLASS = 1000, MAT_URANIUM = 500, MAT_PLATINUM = 350)
- build_path = /obj/item/borg/upgrade/pka
-
-///// pAI parts!!!
-
-//////////////////// Cyborg Parts ////////////////////
-/datum/design/item/prosfab/paiparts
- category = list("pAI Parts")
- time = 20
- materials = list(MAT_STEEL = 1000, MAT_GLASS = 1000)
-
-/datum/design/item/prosfab/paiparts/cell
- name = "pAI Cell"
- id = "pai_cell"
- build_path = /obj/item/paiparts/cell
-
-/datum/design/item/prosfab/paiparts/processor
- name = "pAI Processor"
- id = "pai_processor"
- build_path = /obj/item/paiparts/processor
-
-/datum/design/item/prosfab/paiparts/board
- name = "pAI Board"
- id = "pai_board"
- build_path = /obj/item/paiparts/board
-
-/datum/design/item/prosfab/paiparts/capacitor
- name = "pAI capacitor"
- id = "pai_capacitor"
- build_path = /obj/item/paiparts/capacitor
-
-/datum/design/item/prosfab/paiparts/projector
- name = "pAI Projector"
- id = "pai_projector"
- build_path = /obj/item/paiparts/projector
-
-/datum/design/item/prosfab/paiparts/emitter
- name = "pAI Emitter"
- id = "pai_emitter"
- build_path = /obj/item/paiparts/emitter
-
-/datum/design/item/prosfab/paiparts/speech_synthesizer
- name = "pAI Speech Synthesizer"
- id = "pai_speech_synthesizer"
- build_path = /obj/item/paiparts/speech_synthesizer
diff --git a/code/modules/vehicles/construction.dm b/code/modules/vehicles/construction.dm
index 3c81ccc6ae..d7c22676af 100644
--- a/code/modules/vehicles/construction.dm
+++ b/code/modules/vehicles/construction.dm
@@ -203,7 +203,7 @@
/obj/item/weapon/vehicle_assembly/spacebike/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
switch(build_stage)
if(0)
- if(istype(W, /obj/item/weapon/tank/jetpack) || istype(W, /obj/item/borg/upgrade/jetpack))
+ if(istype(W, /obj/item/weapon/tank/jetpack) || istype(W, /obj/item/borg/upgrade/advanced/jetpack))
user.drop_item()
qdel(W)
increase_step()
diff --git a/modular_chomp/code/modules/power/cells/power_cells.dm b/modular_chomp/code/modules/power/cells/power_cells.dm
index 018ced6013..0ed8546e1b 100644
--- a/modular_chomp/code/modules/power/cells/power_cells.dm
+++ b/modular_chomp/code/modules/power/cells/power_cells.dm
@@ -17,14 +17,14 @@
* Robot
*/
/obj/item/weapon/cell/robot_station
- name = "A standard robot power cell"
+ name = "standard robot power cell"
maxcharge = 7500
/*
* Syndicate
*/
/obj/item/weapon/cell/robot_syndi
- name = "A syndicate robot power cell"
+ name = "syndicate robot power cell"
description_fluff = "Almost as good as a hyper."
icon_state = "b_sup" //We don't want roboticists confuse it with a low standard cell
maxcharge = 25000
diff --git a/vorestation.dme b/vorestation.dme
index 3e27e298da..5f4e4bf4cc 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -1342,7 +1342,6 @@
#include "code\game\objects\items\robot\robot_items.dm"
#include "code\game\objects\items\robot\robot_parts.dm"
#include "code\game\objects\items\robot\robot_upgrades.dm"
-#include "code\game\objects\items\robot\robot_upgrades_vr.dm"
#include "code\game\objects\items\stacks\marker_beacons.dm"
#include "code\game\objects\items\stacks\matter_synth.dm"
#include "code\game\objects\items\stacks\medical.dm"
@@ -4108,7 +4107,6 @@
#include "code\modules\research\mechfab_designs_vr.dm"
#include "code\modules\research\message_server.dm"
#include "code\modules\research\prosfab_designs.dm"
-#include "code\modules\research\prosfab_designs_vr.dm"
#include "code\modules\research\protolathe.dm"
#include "code\modules\research\rd-readme.dm"
#include "code\modules\research\rdconsole.dm"