Cyborg modules renamed to models (#56312)

Changes the references of borg module (type) to model, adds a file for robot declarations and one for model declarations. Basically trying to make the code layout a little more sane.

Initially changed them to 'configurations' but I prefer model; its meaning is closer to module than configuration and avoids confusion with actual config.
This commit is contained in:
dragomagol
2021-01-22 11:38:35 -08:00
committed by GitHub
parent 48bbd26b81
commit f837ce4397
43 changed files with 908 additions and 810 deletions

View File

@@ -1,13 +1,13 @@
/// Module is compatible with Security Cyborg models /// Module is compatible with Security Cyborg model
#define BORG_MODULE_SECURITY (1<<0) #define BORG_MODEL_SECURITY (1<<0)
/// Module is compatible with Miner Cyborg models /// Module is compatible with Miner Cyborg model
#define BORG_MODULE_MINER (1<<1) #define BORG_MODEL_MINER (1<<1)
/// Module is compatible with Janitor Cyborg models /// Module is compatible with Janitor Cyborg model
#define BORG_MODULE_JANITOR (1<<2) #define BORG_MODEL_JANITOR (1<<2)
/// Module is compatible with Medical Cyborg models /// Module is compatible with Medical Cyborg model
#define BORG_MODULE_MEDICAL (1<<3) #define BORG_MODEL_MEDICAL (1<<3)
/// Module is compatible with Engineering Cyborg models /// Module is compatible with Engineering Cyborg model
#define BORG_MODULE_ENGINEERING (1<<4) #define BORG_MODEL_ENGINEERING (1<<4)
/// Module is compatible with Ripley Exosuit models /// Module is compatible with Ripley Exosuit models
#define EXOSUIT_MODULE_RIPLEY (1<<0) #define EXOSUIT_MODULE_RIPLEY (1<<0)

View File

@@ -39,14 +39,14 @@
#define HONK_BOT (1<<5) // Honkbots & ED-Honks #define HONK_BOT (1<<5) // Honkbots & ED-Honks
#define FIRE_BOT (1<<6) // Firebots #define FIRE_BOT (1<<6) // Firebots
#define HYGIENE_BOT (1<<7) // Hygienebots #define HYGIENE_BOT (1<<7) // Hygienebots
#define VIBE_BOT (1<<8) //vibe bots #define VIBE_BOT (1<<8) // Vibe bots
//AI notification defines //AI notification defines
#define NEW_BORG 1 #define NEW_BORG 1
#define NEW_MODULE 2 #define NEW_MODEL 2
#define RENAME 3 #define RENAME 3
#define AI_SHELL 4 #define AI_SHELL 4
#define DISCONNECT 5 #define DISCONNECT 5
//Assembly defines //Assembly defines
#define ASSEMBLY_FIRST_STEP 0 #define ASSEMBLY_FIRST_STEP 0

View File

@@ -483,8 +483,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define NO_TONGUE_TRAIT "no_tongue_trait" #define NO_TONGUE_TRAIT "no_tongue_trait"
/// Trait granted by [/mob/living/silicon/robot] /// Trait granted by [/mob/living/silicon/robot]
/// Traits applied to a silicon mob by their module. /// Traits applied to a silicon mob by their model.
#define MODULE_TRAIT "module_trait" #define MODEL_TRAIT "model_trait"
/// Trait from [/datum/antagonist/nukeop/clownop] /// Trait from [/datum/antagonist/nukeop/clownop]
#define CLOWNOP_TRAIT "clownop" #define CLOWNOP_TRAIT "clownop"

View File

@@ -35,7 +35,7 @@
#define WIRE_POWER2 "Main Power 2" #define WIRE_POWER2 "Main Power 2"
#define WIRE_PROCEED "Proceed" #define WIRE_PROCEED "Proceed"
#define WIRE_RX "Receive" #define WIRE_RX "Receive"
#define WIRE_RESET_MODULE "Reset Module" #define WIRE_RESET_MODEL "Reset Model"
#define WIRE_SAFETY "Safety" #define WIRE_SAFETY "Safety"
#define WIRE_SHOCK "High Voltage Ground" #define WIRE_SHOCK "High Voltage Ground"
#define WIRE_SIGNAL "Signal" #define WIRE_SIGNAL "Signal"

View File

@@ -57,7 +57,7 @@
mob_data["module"] = "pAI" mob_data["module"] = "pAI"
else if(iscyborg(L)) else if(iscyborg(L))
var/mob/living/silicon/robot/R = L var/mob/living/silicon/robot/R = L
mob_data["module"] = R.module.name mob_data["module"] = R.model.name
else else
category = "others" category = "others"
mob_data["typepath"] = M.type mob_data["typepath"] = M.type

View File

@@ -13,10 +13,10 @@
if(..()) if(..())
return return
var/mob/living/silicon/robot/R = usr var/mob/living/silicon/robot/R = usr
if(R.module.type != /obj/item/robot_module) if(R.model.type != /obj/item/robot_model)
R.hud_used.toggle_show_robot_modules() R.hud_used.toggle_show_robot_modules()
return 1 return 1
R.pick_module() R.pick_model()
/atom/movable/screen/robot/module1 /atom/movable/screen/robot/module1
name = "module1" name = "module1"
@@ -110,7 +110,6 @@
static_inventory += robit.inv3 static_inventory += robit.inv3
//End of module select //End of module select
using = new /atom/movable/screen/robot/lamp() using = new /atom/movable/screen/robot/lamp()
using.screen_loc = ui_borg_lamp using.screen_loc = ui_borg_lamp
using.hud = src using.hud = src
@@ -195,7 +194,7 @@
var/mob/screenmob = viewer || R var/mob/screenmob = viewer || R
if(!R.module) if(!R.model)
return return
if(!R.client) if(!R.client)
@@ -205,21 +204,21 @@
//Modules display is shown //Modules display is shown
screenmob.client.screen += module_store_icon //"store" icon screenmob.client.screen += module_store_icon //"store" icon
if(!R.module.modules) if(!R.model.modules)
to_chat(usr, "<span class='warning'>Selected module has no modules to select!</span>") to_chat(usr, "<span class='warning'>Selected model has no modules to select!</span>")
return return
if(!R.robot_modules_background) if(!R.robot_modules_background)
return return
var/display_rows = max(CEILING(length(R.module.get_inactive_modules()) / 8, 1),1) var/display_rows = max(CEILING(length(R.model.get_inactive_modules()) / 8, 1),1)
R.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7" R.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7"
screenmob.client.screen += R.robot_modules_background screenmob.client.screen += R.robot_modules_background
var/x = -4 //Start at CENTER-4,SOUTH+1 var/x = -4 //Start at CENTER-4,SOUTH+1
var/y = 1 var/y = 1
for(var/atom/movable/A in R.module.get_inactive_modules()) for(var/atom/movable/A in R.model.get_inactive_modules())
//Module is not currently active //Module is not currently active
screenmob.client.screen += A screenmob.client.screen += A
if(x < 0) if(x < 0)
@@ -238,7 +237,7 @@
//Modules display is hidden //Modules display is hidden
screenmob.client.screen -= module_store_icon //"store" icon screenmob.client.screen -= module_store_icon //"store" icon
for(var/atom/A in R.module.get_inactive_modules()) for(var/atom/A in R.model.get_inactive_modules())
//Module is not currently active //Module is not currently active
screenmob.client.screen -= A screenmob.client.screen -= A
R.shown_robot_modules = 0 R.shown_robot_modules = 0

View File

@@ -62,7 +62,7 @@
/datum/config_entry/flag/disable_human_mood /datum/config_entry/flag/disable_human_mood
/datum/config_entry/flag/disable_secborg // disallow secborg module to be chosen. /datum/config_entry/flag/disable_secborg // disallow secborg model to be chosen.
/datum/config_entry/flag/disable_peaceborg /datum/config_entry/flag/disable_peaceborg

View File

@@ -259,9 +259,9 @@
for(var/mob/living/rider in robot_parent.buckled_mobs) for(var/mob/living/rider in robot_parent.buckled_mobs)
rider.setDir(dir) rider.setDir(dir)
if(istype(robot_parent.module)) if(istype(robot_parent.model))
rider.pixel_x = robot_parent.module.ride_offset_x[dir2text(dir)] rider.pixel_x = robot_parent.model.ride_offset_x[dir2text(dir)]
rider.pixel_y = robot_parent.module.ride_offset_y[dir2text(dir)] rider.pixel_y = robot_parent.model.ride_offset_y[dir2text(dir)]
//now onto every other ridable mob// //now onto every other ridable mob//

View File

@@ -7,7 +7,7 @@
wires = list( wires = list(
WIRE_AI, WIRE_CAMERA, WIRE_AI, WIRE_CAMERA,
WIRE_LAWSYNC, WIRE_LOCKDOWN, WIRE_LAWSYNC, WIRE_LOCKDOWN,
WIRE_RESET_MODULE WIRE_RESET_MODEL
) )
add_duds(2) add_duds(2)
..() ..()
@@ -24,7 +24,7 @@
status += "The intelligence link display shows [R.connected_ai ? R.connected_ai.name : "NULL"]." status += "The intelligence link display shows [R.connected_ai ? R.connected_ai.name : "NULL"]."
status += "The camera light is [!isnull(R.builtInCamera) && R.builtInCamera.status ? "on" : "off"]." status += "The camera light is [!isnull(R.builtInCamera) && R.builtInCamera.status ? "on" : "off"]."
status += "The lockdown indicator is [R.lockcharge ? "on" : "off"]." status += "The lockdown indicator is [R.lockcharge ? "on" : "off"]."
status += "There is a star symbol above the [get_color_of_wire(WIRE_RESET_MODULE)] wire." status += "There is a star symbol above the [get_color_of_wire(WIRE_RESET_MODEL)] wire."
return status return status
/datum/wires/robot/on_pulse(wire, user) /datum/wires/robot/on_pulse(wire, user)
@@ -56,9 +56,9 @@
R.show_laws() R.show_laws()
if(WIRE_LOCKDOWN) if(WIRE_LOCKDOWN)
R.SetLockdown(!R.lockcharge) // Toggle R.SetLockdown(!R.lockcharge) // Toggle
if(WIRE_RESET_MODULE) if(WIRE_RESET_MODEL)
if(R.has_module()) if(R.has_model())
R.visible_message("<span class='notice'>[R]'s module servos twitch.</span>", "<span class='notice'>Your module display flickers.</span>") R.visible_message("<span class='notice'>[R]'s model servos twitch.</span>", "<span class='notice'>Your model display flickers.</span>")
/datum/wires/robot/on_cut(wire, mend) /datum/wires/robot/on_cut(wire, mend)
var/mob/living/silicon/robot/R = holder var/mob/living/silicon/robot/R = holder
@@ -86,9 +86,9 @@
if(WIRE_LOCKDOWN) // Simple lockdown. if(WIRE_LOCKDOWN) // Simple lockdown.
R.SetLockdown(!mend) R.SetLockdown(!mend)
R.logevent("Motor Controller fault [mend?"cleared":"detected"]") R.logevent("Motor Controller fault [mend?"cleared":"detected"]")
if(WIRE_RESET_MODULE) if(WIRE_RESET_MODEL)
if(R.has_module() && !mend) if(R.has_model() && !mend)
R.ResetModule() R.ResetModel()
/datum/wires/robot/can_reveal_wires(mob/user) /datum/wires/robot/can_reveal_wires(mob/user)
if(HAS_TRAIT(user, TRAIT_KNOW_CYBORG_WIRES)) if(HAS_TRAIT(user, TRAIT_KNOW_CYBORG_WIRES))
@@ -97,8 +97,8 @@
return ..() return ..()
/datum/wires/robot/always_reveal_wire(color) /datum/wires/robot/always_reveal_wire(color)
// Always reveal the reset module wire. // Always reveal the reset model wire.
if(color == get_color_of_wire(WIRE_RESET_MODULE)) if(color == get_color_of_wire(WIRE_RESET_MODEL))
return TRUE return TRUE
return ..() return ..()

View File

@@ -26,7 +26,7 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE)
/obj/item/tk_grab, /obj/item/implant, // not implanter, the actual thing that is inside you /obj/item/tk_grab, /obj/item/implant, // not implanter, the actual thing that is inside you
/obj/item/assembly, /obj/item/onetankbomb, /obj/item/pda/ai, /obj/item/assembly, /obj/item/onetankbomb, /obj/item/pda/ai,
/obj/item/small_delivery, /obj/projectile, /obj/item/small_delivery, /obj/projectile,
/obj/item/borg/sight, /obj/item/borg/stun, /obj/item/robot_module) /obj/item/borg/sight, /obj/item/borg/stun, /obj/item/robot_model)
/datum/h_sandbox/proc/update() /datum/h_sandbox/proc/update()
var/static/list/hrefs = list( var/static/list/hrefs = list(

View File

@@ -49,7 +49,7 @@
locked_down = R.lockcharge, locked_down = R.lockcharge,
status = R.stat, status = R.stat,
charge = R.cell ? round(R.cell.percent()) : null, charge = R.cell ? round(R.cell.percent()) : null,
module = R.module ? "[R.module.name] Module" : "No Module Detected", module = R.model ? "[R.model.name] Model" : "No Model Detected",
synchronization = R.connected_ai, synchronization = R.connected_ai,
emagged = R.emagged, emagged = R.emagged,
ref = REF(R) ref = REF(R)

View File

@@ -436,7 +436,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
attack_paw(A) attack_paw(A)
/obj/item/attack_ai(mob/user) /obj/item/attack_ai(mob/user)
if(istype(src.loc, /obj/item/robot_module)) if(istype(src.loc, /obj/item/robot_model))
//If the item is part of a cyborg module, equip it //If the item is part of a cyborg module, equip it
if(!iscyborg(user)) if(!iscyborg(user))
return return

View File

@@ -389,7 +389,7 @@
var/mob/living/silicon/robot/R = loc var/mob/living/silicon/robot/R = loc
if(istype(R)) if(istype(R))
for(var/ch_name in R.module.radio_channels) for(var/ch_name in R.model.radio_channels)
channels[ch_name] = 1 channels[ch_name] = 1
/obj/item/radio/borg/syndicate /obj/item/radio/borg/syndicate

View File

@@ -645,7 +645,7 @@
dampening_field = make_field(/datum/proximity_monitor/advanced/peaceborg_dampener, list("current_range" = field_radius, "host" = src, "projector" = src)) dampening_field = make_field(/datum/proximity_monitor/advanced/peaceborg_dampener, list("current_range" = field_radius, "host" = src, "projector" = src))
var/mob/living/silicon/robot/owner = get_host() var/mob/living/silicon/robot/owner = get_host()
if(owner) if(owner)
owner.module.allow_riding = FALSE owner.model.allow_riding = FALSE
active = TRUE active = TRUE
/obj/item/borg/projectile_dampen/proc/deactivate_field() /obj/item/borg/projectile_dampen/proc/deactivate_field()
@@ -657,7 +657,7 @@
var/mob/living/silicon/robot/owner = get_host() var/mob/living/silicon/robot/owner = get_host()
if(owner) if(owner)
owner.module.allow_riding = TRUE owner.model.allow_riding = TRUE
/obj/item/borg/projectile_dampen/proc/get_host() /obj/item/borg/projectile_dampen/proc/get_host()
if(istype(host)) if(istype(host))

View File

@@ -9,19 +9,19 @@
w_class = WEIGHT_CLASS_SMALL w_class = WEIGHT_CLASS_SMALL
var/locked = FALSE var/locked = FALSE
var/installed = FALSE var/installed = FALSE
var/require_module = FALSE var/require_model = FALSE
var/list/module_type = null var/list/model_type = null
/// Bitflags listing module compatibility. Used in the exosuit fabricator for creating sub-categories. /// Bitflags listing model compatibility. Used in the exosuit fabricator for creating sub-categories.
var/list/module_flags = NONE var/list/model_flags = NONE
// if true, is not stored in the robot to be ejected // if true, is not stored in the robot to be ejected
// if module is reset // if model is reset
var/one_use = FALSE var/one_use = FALSE
/obj/item/borg/upgrade/proc/action(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/proc/action(mob/living/silicon/robot/R, user = usr)
if(R.stat == DEAD) if(R.stat == DEAD)
to_chat(user, "<span class='warning'>[src] will not function on a deceased cyborg!</span>") to_chat(user, "<span class='warning'>[src] will not function on a deceased cyborg!</span>")
return FALSE return FALSE
if(module_type && !is_type_in_list(R.module, module_type)) if(model_type && !is_type_in_list(R.model, model_type))
to_chat(R, "<span class='alert'>Upgrade mounting error! No suitable hardpoint detected.</span>") to_chat(R, "<span class='alert'>Upgrade mounting error! No suitable hardpoint detected.</span>")
to_chat(user, "<span class='warning'>There's no mounting point for the module!</span>") to_chat(user, "<span class='warning'>There's no mounting point for the module!</span>")
return FALSE return FALSE
@@ -77,14 +77,14 @@
name = "cyborg rapid disabler cooling module" name = "cyborg rapid disabler cooling module"
desc = "Used to cool a mounted disabler, increasing the potential current in it and thus its recharge rate." desc = "Used to cool a mounted disabler, increasing the potential current in it and thus its recharge rate."
icon_state = "cyborg_upgrade3" icon_state = "cyborg_upgrade3"
require_module = TRUE require_model = TRUE
module_type = list(/obj/item/robot_module/security) model_type = list(/obj/item/robot_model/security)
module_flags = BORG_MODULE_SECURITY model_flags = BORG_MODEL_SECURITY
/obj/item/borg/upgrade/disablercooler/action(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/disablercooler/action(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if(.) if(.)
var/obj/item/gun/energy/disabler/cyborg/T = locate() in R.module.modules var/obj/item/gun/energy/disabler/cyborg/T = locate() in R.model.modules
if(!T) if(!T)
to_chat(user, "<span class='warning'>There's no disabler in this unit!</span>") to_chat(user, "<span class='warning'>There's no disabler in this unit!</span>")
return FALSE return FALSE
@@ -98,7 +98,7 @@
/obj/item/borg/upgrade/disablercooler/deactivate(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/disablercooler/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if (.) if (.)
var/obj/item/gun/energy/disabler/cyborg/T = locate() in R.module.modules var/obj/item/gun/energy/disabler/cyborg/T = locate() in R.model.modules
if(!T) if(!T)
return FALSE return FALSE
T.charge_delay = initial(T.charge_delay) T.charge_delay = initial(T.charge_delay)
@@ -125,147 +125,147 @@
/obj/item/borg/upgrade/ddrill /obj/item/borg/upgrade/ddrill
name = "mining cyborg diamond drill" name = "mining cyborg diamond drill"
desc = "A diamond drill replacement for the mining module's standard drill." desc = "A diamond drill replacement for the mining model's standard drill."
icon_state = "cyborg_upgrade3" icon_state = "cyborg_upgrade3"
require_module = TRUE require_model = TRUE
module_type = list(/obj/item/robot_module/miner) model_type = list(/obj/item/robot_model/miner)
module_flags = BORG_MODULE_MINER model_flags = BORG_MODEL_MINER
/obj/item/borg/upgrade/ddrill/action(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/ddrill/action(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if(.) if(.)
for(var/obj/item/pickaxe/drill/cyborg/D in R.module) for(var/obj/item/pickaxe/drill/cyborg/D in R.model)
R.module.remove_module(D, TRUE) R.model.remove_module(D, TRUE)
for(var/obj/item/shovel/S in R.module) for(var/obj/item/shovel/S in R.model)
R.module.remove_module(S, TRUE) R.model.remove_module(S, TRUE)
var/obj/item/pickaxe/drill/cyborg/diamond/DD = new /obj/item/pickaxe/drill/cyborg/diamond(R.module) var/obj/item/pickaxe/drill/cyborg/diamond/DD = new /obj/item/pickaxe/drill/cyborg/diamond(R.model)
R.module.basic_modules += DD R.model.basic_modules += DD
R.module.add_module(DD, FALSE, TRUE) R.model.add_module(DD, FALSE, TRUE)
/obj/item/borg/upgrade/ddrill/deactivate(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/ddrill/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if (.) if (.)
for(var/obj/item/pickaxe/drill/cyborg/diamond/DD in R.module) for(var/obj/item/pickaxe/drill/cyborg/diamond/DD in R.model)
R.module.remove_module(DD, TRUE) R.model.remove_module(DD, TRUE)
var/obj/item/pickaxe/drill/cyborg/D = new (R.module) var/obj/item/pickaxe/drill/cyborg/D = new (R.model)
R.module.basic_modules += D R.model.basic_modules += D
R.module.add_module(D, FALSE, TRUE) R.model.add_module(D, FALSE, TRUE)
var/obj/item/shovel/S = new (R.module) var/obj/item/shovel/S = new (R.model)
R.module.basic_modules += S R.model.basic_modules += S
R.module.add_module(S, FALSE, TRUE) R.model.add_module(S, FALSE, TRUE)
/obj/item/borg/upgrade/soh /obj/item/borg/upgrade/soh
name = "mining cyborg satchel of holding" name = "mining cyborg satchel of holding"
desc = "A satchel of holding replacement for mining cyborg's ore satchel module." desc = "A satchel of holding replacement for mining cyborg's ore satchel module."
icon_state = "cyborg_upgrade3" icon_state = "cyborg_upgrade3"
require_module = TRUE require_model = TRUE
module_type = list(/obj/item/robot_module/miner) model_type = list(/obj/item/robot_model/miner)
module_flags = BORG_MODULE_MINER model_flags = BORG_MODEL_MINER
/obj/item/borg/upgrade/soh/action(mob/living/silicon/robot/R) /obj/item/borg/upgrade/soh/action(mob/living/silicon/robot/R)
. = ..() . = ..()
if(.) if(.)
for(var/obj/item/storage/bag/ore/cyborg/S in R.module) for(var/obj/item/storage/bag/ore/cyborg/S in R.model)
R.module.remove_module(S, TRUE) R.model.remove_module(S, TRUE)
var/obj/item/storage/bag/ore/holding/H = new /obj/item/storage/bag/ore/holding(R.module) var/obj/item/storage/bag/ore/holding/H = new /obj/item/storage/bag/ore/holding(R.model)
R.module.basic_modules += H R.model.basic_modules += H
R.module.add_module(H, FALSE, TRUE) R.model.add_module(H, FALSE, TRUE)
/obj/item/borg/upgrade/soh/deactivate(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/soh/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if (.) if (.)
for(var/obj/item/storage/bag/ore/holding/H in R.module) for(var/obj/item/storage/bag/ore/holding/H in R.model)
R.module.remove_module(H, TRUE) R.model.remove_module(H, TRUE)
var/obj/item/storage/bag/ore/cyborg/S = new (R.module) var/obj/item/storage/bag/ore/cyborg/S = new (R.model)
R.module.basic_modules += S R.model.basic_modules += S
R.module.add_module(S, FALSE, TRUE) R.model.add_module(S, FALSE, TRUE)
/obj/item/borg/upgrade/tboh /obj/item/borg/upgrade/tboh
name = "janitor cyborg trash bag of holding" name = "janitor cyborg trash bag of holding"
desc = "A trash bag of holding replacement for the janiborg's standard trash bag." desc = "A trash bag of holding replacement for the janiborg's standard trash bag."
icon_state = "cyborg_upgrade3" icon_state = "cyborg_upgrade3"
require_module = TRUE require_model = TRUE
module_type = list(/obj/item/robot_module/janitor) model_type = list(/obj/item/robot_model/janitor)
module_flags = BORG_MODULE_JANITOR model_flags = BORG_MODEL_JANITOR
/obj/item/borg/upgrade/tboh/action(mob/living/silicon/robot/R) /obj/item/borg/upgrade/tboh/action(mob/living/silicon/robot/R)
. = ..() . = ..()
if(.) if(.)
for(var/obj/item/storage/bag/trash/cyborg/TB in R.module.modules) for(var/obj/item/storage/bag/trash/cyborg/TB in R.model.modules)
R.module.remove_module(TB, TRUE) R.model.remove_module(TB, TRUE)
var/obj/item/storage/bag/trash/bluespace/cyborg/B = new /obj/item/storage/bag/trash/bluespace/cyborg(R.module) var/obj/item/storage/bag/trash/bluespace/cyborg/B = new /obj/item/storage/bag/trash/bluespace/cyborg(R.model)
R.module.basic_modules += B R.model.basic_modules += B
R.module.add_module(B, FALSE, TRUE) R.model.add_module(B, FALSE, TRUE)
/obj/item/borg/upgrade/tboh/deactivate(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/tboh/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if(.) if(.)
for(var/obj/item/storage/bag/trash/bluespace/cyborg/B in R.module.modules) for(var/obj/item/storage/bag/trash/bluespace/cyborg/B in R.model.modules)
R.module.remove_module(B, TRUE) R.model.remove_module(B, TRUE)
var/obj/item/storage/bag/trash/cyborg/TB = new (R.module) var/obj/item/storage/bag/trash/cyborg/TB = new (R.model)
R.module.basic_modules += TB R.model.basic_modules += TB
R.module.add_module(TB, FALSE, TRUE) R.model.add_module(TB, FALSE, TRUE)
/obj/item/borg/upgrade/amop /obj/item/borg/upgrade/amop
name = "janitor cyborg advanced mop" name = "janitor cyborg advanced mop"
desc = "An advanced mop replacement for the janiborg's standard mop." desc = "An advanced mop replacement for the janiborg's standard mop."
icon_state = "cyborg_upgrade3" icon_state = "cyborg_upgrade3"
require_module = TRUE require_model = TRUE
module_type = list(/obj/item/robot_module/janitor) model_type = list(/obj/item/robot_model/janitor)
module_flags = BORG_MODULE_JANITOR model_flags = BORG_MODEL_JANITOR
/obj/item/borg/upgrade/amop/action(mob/living/silicon/robot/R) /obj/item/borg/upgrade/amop/action(mob/living/silicon/robot/R)
. = ..() . = ..()
if(.) if(.)
for(var/obj/item/mop/cyborg/M in R.module.modules) for(var/obj/item/mop/cyborg/M in R.model.modules)
R.module.remove_module(M, TRUE) R.model.remove_module(M, TRUE)
var/obj/item/mop/advanced/cyborg/mop = new /obj/item/mop/advanced/cyborg(R.module) var/obj/item/mop/advanced/cyborg/mop = new /obj/item/mop/advanced/cyborg(R.model)
R.module.basic_modules += mop R.model.basic_modules += mop
R.module.add_module(mop, FALSE, TRUE) R.model.add_module(mop, FALSE, TRUE)
/obj/item/borg/upgrade/amop/deactivate(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/amop/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if(.) if(.)
for(var/obj/item/mop/advanced/cyborg/A in R.module.modules) for(var/obj/item/mop/advanced/cyborg/A in R.model.modules)
R.module.remove_module(A, TRUE) R.model.remove_module(A, TRUE)
var/obj/item/mop/cyborg/M = new (R.module) var/obj/item/mop/cyborg/M = new (R.model)
R.module.basic_modules += M R.model.basic_modules += M
R.module.add_module(M, FALSE, TRUE) R.model.add_module(M, FALSE, TRUE)
/obj/item/borg/upgrade/prt /obj/item/borg/upgrade/prt
name = "janitor cyborg plating repair tool" name = "janitor cyborg plating repair tool"
desc = "A tiny heating device to repair burnt and damaged hull platings with." desc = "A tiny heating device to repair burnt and damaged hull platings with."
icon_state = "cyborg_upgrade3" icon_state = "cyborg_upgrade3"
require_module = TRUE require_model = TRUE
module_type = list(/obj/item/robot_module/janitor) model_type = list(/obj/item/robot_model/janitor)
module_flags = BORG_MODULE_JANITOR model_flags = BORG_MODEL_JANITOR
/obj/item/borg/upgrade/prt/action(mob/living/silicon/robot/R) /obj/item/borg/upgrade/prt/action(mob/living/silicon/robot/R)
. = ..() . = ..()
if(.) if(.)
var/obj/item/cautery/prt/P = new (R.module) var/obj/item/cautery/prt/P = new (R.model)
R.module.basic_modules += P R.model.basic_modules += P
R.module.add_module(P, FALSE, TRUE) R.model.add_module(P, FALSE, TRUE)
/obj/item/borg/upgrade/prt/deactivate(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/prt/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if(.) if(.)
for(var/obj/item/cautery/prt/P in R.module.modules) for(var/obj/item/cautery/prt/P in R.model.modules)
R.module.remove_module(P, TRUE) R.model.remove_module(P, TRUE)
/obj/item/borg/upgrade/syndicate /obj/item/borg/upgrade/syndicate
name = "illegal equipment module" name = "illegal equipment module"
desc = "Unlocks the hidden, deadlier functions of a cyborg." desc = "Unlocks the hidden, deadlier functions of a cyborg."
icon_state = "cyborg_upgrade3" icon_state = "cyborg_upgrade3"
require_module = TRUE require_model = TRUE
/obj/item/borg/upgrade/syndicate/action(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/syndicate/action(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
@@ -289,9 +289,9 @@
desc = "An upgrade kit to apply specialized coolant systems and insulation layers to a mining cyborg's chassis, enabling them to withstand exposure to molten rock." desc = "An upgrade kit to apply specialized coolant systems and insulation layers to a mining cyborg's chassis, enabling them to withstand exposure to molten rock."
icon_state = "ash_plating" icon_state = "ash_plating"
resistance_flags = LAVA_PROOF | FIRE_PROOF resistance_flags = LAVA_PROOF | FIRE_PROOF
require_module = TRUE require_model = TRUE
module_type = list(/obj/item/robot_module/miner) model_type = list(/obj/item/robot_model/miner)
module_flags = BORG_MODULE_MINER model_flags = BORG_MODEL_MINER
/obj/item/borg/upgrade/lavaproof/action(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/lavaproof/action(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
@@ -307,7 +307,7 @@
name = "self-repair module" name = "self-repair module"
desc = "This module will repair the cyborg over time." desc = "This module will repair the cyborg over time."
icon_state = "cyborg_upgrade5" icon_state = "cyborg_upgrade5"
require_module = TRUE require_model = TRUE
var/repair_amount = -1 var/repair_amount = -1
/// world.time of next repair /// world.time of next repair
var/next_repair = 0 var/next_repair = 0
@@ -406,18 +406,18 @@
/obj/item/borg/upgrade/hypospray /obj/item/borg/upgrade/hypospray
name = "medical cyborg hypospray advanced synthesiser" name = "medical cyborg hypospray advanced synthesiser"
desc = "An upgrade to the Medical module cyborg's hypospray, allowing it \ desc = "An upgrade to the Medical model cyborg's hypospray, allowing it \
to produce more advanced and complex medical reagents." to produce more advanced and complex medical reagents."
icon_state = "cyborg_upgrade3" icon_state = "cyborg_upgrade3"
require_module = TRUE require_model = TRUE
module_type = list(/obj/item/robot_module/medical) model_type = list(/obj/item/robot_model/medical)
module_flags = BORG_MODULE_MEDICAL model_flags = BORG_MODEL_MEDICAL
var/list/additional_reagents = list() var/list/additional_reagents = list()
/obj/item/borg/upgrade/hypospray/action(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/hypospray/action(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if(.) if(.)
for(var/obj/item/reagent_containers/borghypo/H in R.module.modules) for(var/obj/item/reagent_containers/borghypo/H in R.model.modules)
if(H.accepts_reagent_upgrades) if(H.accepts_reagent_upgrades)
for(var/re in additional_reagents) for(var/re in additional_reagents)
H.add_reagent(re) H.add_reagent(re)
@@ -425,14 +425,14 @@
/obj/item/borg/upgrade/hypospray/deactivate(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/hypospray/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if (.) if (.)
for(var/obj/item/reagent_containers/borghypo/H in R.module.modules) for(var/obj/item/reagent_containers/borghypo/H in R.model.modules)
if(H.accepts_reagent_upgrades) if(H.accepts_reagent_upgrades)
for(var/re in additional_reagents) for(var/re in additional_reagents)
H.del_reagent(re) H.del_reagent(re)
/obj/item/borg/upgrade/hypospray/expanded /obj/item/borg/upgrade/hypospray/expanded
name = "medical cyborg expanded hypospray" name = "medical cyborg expanded hypospray"
desc = "An upgrade to the Medical module's hypospray, allowing it \ desc = "An upgrade to the Medical model's hypospray, allowing it \
to treat a wider range of conditions and problems." to treat a wider range of conditions and problems."
additional_reagents = list(/datum/reagent/medicine/mannitol, /datum/reagent/medicine/oculine, /datum/reagent/medicine/inacusiate, additional_reagents = list(/datum/reagent/medicine/mannitol, /datum/reagent/medicine/oculine, /datum/reagent/medicine/inacusiate,
/datum/reagent/medicine/mutadone, /datum/reagent/medicine/haloperidol, /datum/reagent/medicine/oxandrolone, /datum/reagent/medicine/sal_acid, /datum/reagent/medicine/mutadone, /datum/reagent/medicine/haloperidol, /datum/reagent/medicine/oxandrolone, /datum/reagent/medicine/sal_acid,
@@ -448,7 +448,7 @@
. = ..() . = ..()
if(.) if(.)
var/found_hypo = FALSE var/found_hypo = FALSE
for(var/obj/item/reagent_containers/borghypo/H in R.module.modules) for(var/obj/item/reagent_containers/borghypo/H in R.model.modules)
H.bypass_protection = TRUE H.bypass_protection = TRUE
found_hypo = TRUE found_hypo = TRUE
@@ -458,17 +458,17 @@
/obj/item/borg/upgrade/piercing_hypospray/deactivate(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/piercing_hypospray/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if (.) if (.)
for(var/obj/item/reagent_containers/borghypo/H in R.module.modules) for(var/obj/item/reagent_containers/borghypo/H in R.model.modules)
H.bypass_protection = initial(H.bypass_protection) H.bypass_protection = initial(H.bypass_protection)
/obj/item/borg/upgrade/defib /obj/item/borg/upgrade/defib
name = "medical cyborg defibrillator" name = "medical cyborg defibrillator"
desc = "An upgrade to the Medical module, installing a built-in \ desc = "An upgrade to the Medical model, installing a built-in \
defibrillator, for on the scene revival." defibrillator, for on the scene revival."
icon_state = "cyborg_upgrade3" icon_state = "cyborg_upgrade3"
require_module = TRUE require_model = TRUE
module_type = list(/obj/item/robot_module/medical) model_type = list(/obj/item/robot_model/medical)
module_flags = BORG_MODULE_MEDICAL model_flags = BORG_MODEL_MEDICAL
/obj/item/borg/upgrade/defib/action(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/defib/action(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
@@ -477,15 +477,15 @@
if(BP) if(BP)
BP.deactivate(R, user) BP.deactivate(R, user)
to_chat(user, "<span class='notice'>You remove the defibrillator unit to make room for the compact upgrade.</span>") to_chat(user, "<span class='notice'>You remove the defibrillator unit to make room for the compact upgrade.</span>")
var/obj/item/shockpaddles/cyborg/S = new(R.module) var/obj/item/shockpaddles/cyborg/S = new(R.model)
R.module.basic_modules += S R.model.basic_modules += S
R.module.add_module(S, FALSE, TRUE) R.model.add_module(S, FALSE, TRUE)
/obj/item/borg/upgrade/defib/deactivate(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/defib/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if (.) if (.)
var/obj/item/shockpaddles/cyborg/S = locate() in R.module var/obj/item/shockpaddles/cyborg/S = locate() in R.model
R.module.remove_module(S, TRUE) R.model.remove_module(S, TRUE)
///A version of the above that also acts as a holder of an actual defibrillator item used in place of the upgrade chip. ///A version of the above that also acts as a holder of an actual defibrillator item used in place of the upgrade chip.
/obj/item/borg/upgrade/defib/backpack /obj/item/borg/upgrade/defib/backpack
@@ -516,26 +516,26 @@
/obj/item/borg/upgrade/processor /obj/item/borg/upgrade/processor
name = "medical cyborg surgical processor" name = "medical cyborg surgical processor"
desc = "An upgrade to the Medical module, installing a processor \ desc = "An upgrade to the Medical model, installing a processor \
capable of scanning surgery disks and carrying \ capable of scanning surgery disks and carrying \
out procedures" out procedures"
icon_state = "cyborg_upgrade3" icon_state = "cyborg_upgrade3"
require_module = TRUE require_model = TRUE
module_type = list(/obj/item/robot_module/medical, /obj/item/robot_module/syndicate_medical) model_type = list(/obj/item/robot_model/medical, /obj/item/robot_model/syndicate_medical)
module_flags = BORG_MODULE_MEDICAL model_flags = BORG_MODEL_MEDICAL
/obj/item/borg/upgrade/processor/action(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/processor/action(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if(.) if(.)
var/obj/item/surgical_processor/SP = new(R.module) var/obj/item/surgical_processor/SP = new(R.model)
R.module.basic_modules += SP R.model.basic_modules += SP
R.module.add_module(SP, FALSE, TRUE) R.model.add_module(SP, FALSE, TRUE)
/obj/item/borg/upgrade/processor/deactivate(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/processor/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if (.) if (.)
var/obj/item/surgical_processor/SP = locate() in R.module var/obj/item/surgical_processor/SP = locate() in R.model
R.module.remove_module(SP, TRUE) R.model.remove_module(SP, TRUE)
/obj/item/borg/upgrade/ai /obj/item/borg/upgrade/ai
name = "B.O.R.I.S. module" name = "B.O.R.I.S. module"
@@ -606,9 +606,9 @@
desc = "A rapid part exchange device for the engineering cyborg." desc = "A rapid part exchange device for the engineering cyborg."
icon = 'icons/obj/storage.dmi' icon = 'icons/obj/storage.dmi'
icon_state = "borgrped" icon_state = "borgrped"
require_module = TRUE require_model = TRUE
module_type = list(/obj/item/robot_module/engineering, /obj/item/robot_module/saboteur) model_type = list(/obj/item/robot_model/engineering, /obj/item/robot_model/saboteur)
module_flags = BORG_MODULE_ENGINEERING model_flags = BORG_MODEL_ENGINEERING
/obj/item/borg/upgrade/rped/action(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/rped/action(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
@@ -619,39 +619,39 @@
to_chat(user, "<span class='warning'>This unit is already equipped with a RPED module!</span>") to_chat(user, "<span class='warning'>This unit is already equipped with a RPED module!</span>")
return FALSE return FALSE
RPED = new(R.module) RPED = new(R.model)
R.module.basic_modules += RPED R.model.basic_modules += RPED
R.module.add_module(RPED, FALSE, TRUE) R.model.add_module(RPED, FALSE, TRUE)
/obj/item/borg/upgrade/rped/deactivate(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/rped/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if (.) if (.)
var/obj/item/storage/part_replacer/cyborg/RPED = locate() in R.module var/obj/item/storage/part_replacer/cyborg/RPED = locate() in R.model
if (RPED) if (RPED)
R.module.remove_module(RPED, TRUE) R.model.remove_module(RPED, TRUE)
/obj/item/borg/upgrade/pinpointer /obj/item/borg/upgrade/pinpointer
name = "medical cyborg crew pinpointer" name = "medical cyborg crew pinpointer"
desc = "A crew pinpointer module for the medical cyborg. Permits remote access to the crew monitor." desc = "A crew pinpointer module for the medical cyborg. Permits remote access to the crew monitor."
icon = 'icons/obj/device.dmi' icon = 'icons/obj/device.dmi'
icon_state = "pinpointer_crew" icon_state = "pinpointer_crew"
require_module = TRUE require_model = TRUE
module_type = list(/obj/item/robot_module/medical, /obj/item/robot_module/syndicate_medical) model_type = list(/obj/item/robot_model/medical, /obj/item/robot_model/syndicate_medical)
module_flags = BORG_MODULE_MEDICAL model_flags = BORG_MODEL_MEDICAL
var/datum/action/crew_monitor var/datum/action/crew_monitor
/obj/item/borg/upgrade/pinpointer/action(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/pinpointer/action(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if(.) if(.)
var/obj/item/pinpointer/crew/PP = locate() in R.module var/obj/item/pinpointer/crew/PP = locate() in R.model
if(PP) if(PP)
to_chat(user, "<span class='warning'>This unit is already equipped with a pinpointer module!</span>") to_chat(user, "<span class='warning'>This unit is already equipped with a pinpointer module!</span>")
return FALSE return FALSE
PP = new(R.module) PP = new(R.model)
R.module.basic_modules += PP R.model.basic_modules += PP
R.module.add_module(PP, FALSE, TRUE) R.model.add_module(PP, FALSE, TRUE)
crew_monitor = new /datum/action/item_action/crew_monitor(src) crew_monitor = new /datum/action/item_action/crew_monitor(src)
crew_monitor.Grant(R) crew_monitor.Grant(R)
icon_state = "scanner" icon_state = "scanner"
@@ -663,8 +663,8 @@
icon_state = "pinpointer_crew" icon_state = "pinpointer_crew"
crew_monitor.Remove(R) crew_monitor.Remove(R)
QDEL_NULL(crew_monitor) QDEL_NULL(crew_monitor)
var/obj/item/pinpointer/crew/PP = locate() in R.module var/obj/item/pinpointer/crew/PP = locate() in R.model
R.module.remove_module(PP, TRUE) R.model.remove_module(PP, TRUE)
/obj/item/borg/upgrade/pinpointer/ui_action_click() /obj/item/borg/upgrade/pinpointer/ui_action_click()
if(..()) if(..())
@@ -674,100 +674,100 @@
/obj/item/borg/upgrade/transform /obj/item/borg/upgrade/transform
name = "borg module picker (Standard)" name = "borg model picker (Standard)"
desc = "Allows you to to turn a cyborg into a standard cyborg." desc = "Allows you to to turn a cyborg into a standard cyborg."
icon_state = "cyborg_upgrade3" icon_state = "cyborg_upgrade3"
var/obj/item/robot_module/new_module = null var/obj/item/robot_model/new_model = null
/obj/item/borg/upgrade/transform/action(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/transform/action(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if(. && new_module) if(. && new_model)
R.module.transform_to(new_module) R.model.transform_to(new_model)
/obj/item/borg/upgrade/transform/clown /obj/item/borg/upgrade/transform/clown
name = "borg module picker (Clown)" name = "borg model picker (Clown)"
desc = "Allows you to to turn a cyborg into a clown, honk." desc = "Allows you to to turn a cyborg into a clown, honk."
icon_state = "cyborg_upgrade3" icon_state = "cyborg_upgrade3"
new_module = /obj/item/robot_module/clown new_model = /obj/item/robot_model/clown
/obj/item/borg/upgrade/circuit_app /obj/item/borg/upgrade/circuit_app
name = "circuit manipulation apparatus" name = "circuit manipulation apparatus"
desc = "An engineering cyborg upgrade allowing for manipulation of circuit boards." desc = "An engineering cyborg upgrade allowing for manipulation of circuit boards."
icon_state = "cyborg_upgrade3" icon_state = "cyborg_upgrade3"
require_module = TRUE require_model = TRUE
module_type = list(/obj/item/robot_module/engineering, /obj/item/robot_module/saboteur) model_type = list(/obj/item/robot_model/engineering, /obj/item/robot_model/saboteur)
module_flags = BORG_MODULE_ENGINEERING model_flags = BORG_MODEL_ENGINEERING
/obj/item/borg/upgrade/circuit_app/action(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/circuit_app/action(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if(.) if(.)
var/obj/item/borg/apparatus/circuit/C = locate() in R.module.modules var/obj/item/borg/apparatus/circuit/C = locate() in R.model.modules
if(C) if(C)
to_chat(user, "<span class='warning'>This unit is already equipped with a circuit apparatus!</span>") to_chat(user, "<span class='warning'>This unit is already equipped with a circuit apparatus!</span>")
return FALSE return FALSE
C = new(R.module) C = new(R.model)
R.module.basic_modules += C R.model.basic_modules += C
R.module.add_module(C, FALSE, TRUE) R.model.add_module(C, FALSE, TRUE)
/obj/item/borg/upgrade/circuit_app/deactivate(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/circuit_app/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if (.) if (.)
var/obj/item/borg/apparatus/circuit/C = locate() in R.module.modules var/obj/item/borg/apparatus/circuit/C = locate() in R.model.modules
if (C) if (C)
R.module.remove_module(C, TRUE) R.model.remove_module(C, TRUE)
/obj/item/borg/upgrade/beaker_app /obj/item/borg/upgrade/beaker_app
name = "beaker storage apparatus" name = "beaker storage apparatus"
desc = "A supplementary beaker storage apparatus for medical cyborgs." desc = "A supplementary beaker storage apparatus for medical cyborgs."
icon_state = "cyborg_upgrade3" icon_state = "cyborg_upgrade3"
require_module = TRUE require_model = TRUE
module_type = list(/obj/item/robot_module/medical) model_type = list(/obj/item/robot_model/medical)
module_flags = BORG_MODULE_MEDICAL model_flags = BORG_MODEL_MEDICAL
/obj/item/borg/upgrade/beaker_app/action(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/beaker_app/action(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if(.) if(.)
var/obj/item/borg/apparatus/beaker/extra/E = locate() in R.module.modules var/obj/item/borg/apparatus/beaker/extra/E = locate() in R.model.modules
if(E) if(E)
to_chat(user, "<span class='warning'>This unit has no room for additional beaker storage!</span>") to_chat(user, "<span class='warning'>This unit has no room for additional beaker storage!</span>")
return FALSE return FALSE
E = new(R.module) E = new(R.model)
R.module.basic_modules += E R.model.basic_modules += E
R.module.add_module(E, FALSE, TRUE) R.model.add_module(E, FALSE, TRUE)
/obj/item/borg/upgrade/beaker_app/deactivate(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/beaker_app/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if (.) if (.)
var/obj/item/borg/apparatus/beaker/extra/E = locate() in R.module.modules var/obj/item/borg/apparatus/beaker/extra/E = locate() in R.model.modules
if (E) if (E)
R.module.remove_module(E, TRUE) R.model.remove_module(E, TRUE)
/obj/item/borg/upgrade/broomer /obj/item/borg/upgrade/broomer
name = "experimental push broom" name = "experimental push broom"
desc = "An experimental push broom used for efficiently pushing refuse." desc = "An experimental push broom used for efficiently pushing refuse."
icon_state = "cyborg_upgrade3" icon_state = "cyborg_upgrade3"
require_module = TRUE require_model = TRUE
module_type = list(/obj/item/robot_module/janitor) model_type = list(/obj/item/robot_model/janitor)
module_flags = BORG_MODULE_JANITOR model_flags = BORG_MODEL_JANITOR
/obj/item/borg/upgrade/broomer/action(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/broomer/action(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if (!.) if (!.)
return return
var/obj/item/pushbroom/cyborg/BR = locate() in R.module.modules var/obj/item/pushbroom/cyborg/BR = locate() in R.model.modules
if (BR) if (BR)
to_chat(user, "<span class='warning'>This janiborg is already equipped with an experimental broom!</span>") to_chat(user, "<span class='warning'>This janiborg is already equipped with an experimental broom!</span>")
return FALSE return FALSE
BR = new(R.module) BR = new(R.model)
R.module.basic_modules += BR R.model.basic_modules += BR
R.module.add_module(BR, FALSE, TRUE) R.model.add_module(BR, FALSE, TRUE)
/obj/item/borg/upgrade/broomer/deactivate(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/broomer/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if (!.) if (!.)
return return
var/obj/item/pushbroom/cyborg/BR = locate() in R.module.modules var/obj/item/pushbroom/cyborg/BR = locate() in R.model.modules
if (BR) if (BR)
R.module.remove_module(BR, TRUE) R.model.remove_module(BR, TRUE)

View File

@@ -217,7 +217,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
var/mob/living/silicon/robot/robot var/mob/living/silicon/robot/robot
/obj/item/claymore/highlander/robot/Initialize() /obj/item/claymore/highlander/robot/Initialize()
var/obj/item/robot_module/kiltkit = loc var/obj/item/robot_model/kiltkit = loc
robot = kiltkit.loc robot = kiltkit.loc
if(!istype(robot)) if(!istype(robot))
qdel(src) qdel(src)

View File

@@ -1679,8 +1679,8 @@
L.put_in_hands(I) L.put_in_hands(I)
if(iscyborg(L)) if(iscyborg(L))
var/mob/living/silicon/robot/R = L var/mob/living/silicon/robot/R = L
if(R.module) if(R.model)
R.module.add_module(I, TRUE, TRUE) R.model.add_module(I, TRUE, TRUE)
R.activate_module(I) R.activate_module(I)
if(pod) if(pod)

View File

@@ -45,7 +45,7 @@
"ref" = REF(borg), "ref" = REF(borg),
"name" = "[borg]", "name" = "[borg]",
"emagged" = borg.emagged, "emagged" = borg.emagged,
"active_module" = "[borg.module.type]", "active_module" = "[borg.model.type]",
"lawupdate" = borg.lawupdate, "lawupdate" = borg.lawupdate,
"lockdown" = borg.lockcharge, "lockdown" = borg.lockcharge,
"scrambledcodes" = borg.scrambledcodes "scrambledcodes" = borg.scrambledcodes
@@ -53,7 +53,7 @@
.["upgrades"] = list() .["upgrades"] = list()
for (var/upgradetype in subtypesof(/obj/item/borg/upgrade)-/obj/item/borg/upgrade/hypospray) //hypospray is a dummy parent for hypospray upgrades for (var/upgradetype in subtypesof(/obj/item/borg/upgrade)-/obj/item/borg/upgrade/hypospray) //hypospray is a dummy parent for hypospray upgrades
var/obj/item/borg/upgrade/upgrade = upgradetype var/obj/item/borg/upgrade/upgrade = upgradetype
if (initial(upgrade.module_type) && !is_type_in_list(borg.module, initial(upgrade.module_type))) // Upgrade requires a different module if (initial(upgrade.model_type) && !is_type_in_list(borg.model, initial(upgrade.model_type))) // Upgrade requires a different model
continue continue
var/installed = FALSE var/installed = FALSE
if (locate(upgradetype) in borg) if (locate(upgradetype) in borg)
@@ -67,11 +67,11 @@
.["channels"] += list(list("name" = k, "installed" = (k in borg.radio.channels))) .["channels"] += list(list("name" = k, "installed" = (k in borg.radio.channels)))
.["cell"] = borg.cell ? list("missing" = FALSE, "maxcharge" = borg.cell.maxcharge, "charge" = borg.cell.charge) : list("missing" = TRUE, "maxcharge" = 1, "charge" = 0) .["cell"] = borg.cell ? list("missing" = FALSE, "maxcharge" = borg.cell.maxcharge, "charge" = borg.cell.charge) : list("missing" = TRUE, "maxcharge" = 1, "charge" = 0)
.["modules"] = list() .["modules"] = list()
for(var/moduletype in typesof(/obj/item/robot_module)) for(var/model_type in typesof(/obj/item/robot_model))
var/obj/item/robot_module/module = moduletype var/obj/item/robot_model/model = model_type
.["modules"] += list(list( .["modules"] += list(list(
"name" = initial(module.name), "name" = initial(model.name),
"type" = "[module]" "type" = "[model]"
)) ))
.["ais"] = list(list("name" = "None", "ref" = "null", "connected" = isnull(borg.connected_ai))) .["ais"] = list(list("name" = "None", "ref" = "null", "connected" = isnull(borg.connected_ai)))
for(var/mob/living/silicon/ai/ai in GLOB.ai_list) for(var/mob/living/silicon/ai/ai in GLOB.ai_list)
@@ -187,11 +187,11 @@
log_admin("[key_name(user)] added the [channel] radio channel to [key_name(borg)].") log_admin("[key_name(user)] added the [channel] radio channel to [key_name(borg)].")
borg.radio.recalculateChannels() borg.radio.recalculateChannels()
if ("setmodule") if ("setmodule")
var/newmodulepath = text2path(params["module"]) var/new_model_path = text2path(params["module"])
if (ispath(newmodulepath)) if (ispath(new_model_path))
borg.module.transform_to(newmodulepath) borg.model.transform_to(new_model_path)
message_admins("[key_name_admin(user)] changed the module of [ADMIN_LOOKUPFLW(borg)] to [newmodulepath].") message_admins("[key_name_admin(user)] changed the model of [ADMIN_LOOKUPFLW(borg)] to [new_model_path].")
log_admin("[key_name(user)] changed the module of [key_name(borg)] to [newmodulepath].") log_admin("[key_name(user)] changed the model of [key_name(borg)] to [new_model_path].")
if ("slavetoai") if ("slavetoai")
var/mob/living/silicon/ai/newai = locate(params["slavetoai"]) in GLOB.ai_list var/mob/living/silicon/ai/newai = locate(params["slavetoai"]) in GLOB.ai_list
if (newai && newai != borg.connected_ai) if (newai && newai != borg.connected_ai)

View File

@@ -184,11 +184,11 @@
switch(borg_to_spawn) switch(borg_to_spawn)
if("Medical") if("Medical")
R = new /mob/living/silicon/robot/modules/syndicate/medical(T) R = new /mob/living/silicon/robot/model/syndicate/medical(T)
if("Saboteur") if("Saboteur")
R = new /mob/living/silicon/robot/modules/syndicate/saboteur(T) R = new /mob/living/silicon/robot/model/syndicate/saboteur(T)
else else
R = new /mob/living/silicon/robot/modules/syndicate(T) //Assault borg by default R = new /mob/living/silicon/robot/model/syndicate(T) //Assault borg by default
var/brainfirstname = pick(GLOB.first_names_male) var/brainfirstname = pick(GLOB.first_names_male)
if(prob(50)) if(prob(50))

View File

@@ -99,5 +99,5 @@
robotlander.laws.clear_inherent_laws() robotlander.laws.clear_inherent_laws()
robotlander.laws.set_zeroth_law("THERE CAN BE ONLY ONE") robotlander.laws.set_zeroth_law("THERE CAN BE ONLY ONE")
robotlander.laws.show_laws(robotlander) robotlander.laws.show_laws(robotlander)
robotlander.module.transform_to(/obj/item/robot_module/syndicate/kiltborg) robotlander.model.transform_to(/obj/item/robot_model/syndicate/kiltborg)
sword = locate(/obj/item/claymore/highlander/robot) in robotlander.module.basic_modules sword = locate(/obj/item/claymore/highlander/robot) in robotlander.model.basic_modules

View File

@@ -87,7 +87,7 @@
src.user = user src.user = user
savedName = user.name savedName = user.name
user.name = friendlyName user.name = friendlyName
user.module.cyborg_base_icon = disguise user.model.cyborg_base_icon = disguise
user.bubble_icon = "robot" user.bubble_icon = "robot"
active = TRUE active = TRUE
user.update_icons() user.update_icons()
@@ -106,7 +106,7 @@
listeningTo = null listeningTo = null
do_sparks(5, FALSE, user) do_sparks(5, FALSE, user)
user.name = savedName user.name = savedName
user.module.cyborg_base_icon = initial(user.module.cyborg_base_icon) user.model.cyborg_base_icon = initial(user.model.cyborg_base_icon)
user.bubble_icon = "syndibot" user.bubble_icon = "syndibot"
active = FALSE active = FALSE
user.update_icons() user.update_icons()

View File

@@ -279,9 +279,9 @@
robot_status = "OFFLINE" robot_status = "OFFLINE"
else if(!connected_robot.cell || connected_robot.cell.charge <= 0) else if(!connected_robot.cell || connected_robot.cell.charge <= 0)
robot_status = "DEPOWERED" robot_status = "DEPOWERED"
//Name, Health, Battery, Module, Area, and Status! Everything an AI wants to know about its borgies! //Name, Health, Battery, Model, Area, and Status! Everything an AI wants to know about its borgies!
. += text("[connected_robot.name] | S.Integrity: [connected_robot.health]% | Cell: [connected_robot.cell ? "[connected_robot.cell.charge]/[connected_robot.cell.maxcharge]" : "Empty"] | \ . += text("[connected_robot.name] | S.Integrity: [connected_robot.health]% | Cell: [connected_robot.cell ? "[connected_robot.cell.charge]/[connected_robot.cell.maxcharge]" : "Empty"] | \
Module: [connected_robot.designation] | Loc: [get_area_name(connected_robot, TRUE)] | Status: [robot_status]") Model: [connected_robot.designation] | Loc: [get_area_name(connected_robot, TRUE)] | Status: [robot_status]")
. += text("AI shell beacons detected: [LAZYLEN(GLOB.available_ai_shells)]") //Count of total AI shells . += text("AI shell beacons detected: [LAZYLEN(GLOB.available_ai_shells)]") //Count of total AI shells
/mob/living/silicon/ai/proc/ai_alerts() /mob/living/silicon/ai/proc/ai_alerts()

View File

@@ -23,8 +23,8 @@
if(QDELETED(item_module)) if(QDELETED(item_module))
CRASH("activate_module called with improper item_module") CRASH("activate_module called with improper item_module")
if(!(item_module in module.modules)) if(!(item_module in model.modules))
CRASH("activate_module called with item_module not in module.modules") CRASH("activate_module called with item_module not in model.modules")
if(activated(item_module)) if(activated(item_module))
to_chat(src, "<span class='warning'>That module is already activated.</span>") to_chat(src, "<span class='warning'>That module is already activated.</span>")
@@ -92,8 +92,8 @@
if(QDELETED(item_module)) if(QDELETED(item_module))
CRASH("unequip_module_from_slot called with improper item_module") CRASH("unequip_module_from_slot called with improper item_module")
if(!(item_module in module.modules)) if(!(item_module in model.modules))
CRASH("unequip_module_from_slot called with item_module not in module.modules") CRASH("unequip_module_from_slot called with item_module not in model.modules")
item_module.mouse_opacity = MOUSE_OPACITY_OPAQUE item_module.mouse_opacity = MOUSE_OPACITY_OPAQUE
@@ -126,7 +126,7 @@
held_items[module_num] = null held_items[module_num] = null
item_module.cyborg_unequip(src) item_module.cyborg_unequip(src)
item_module.forceMove(module) //Return item to module so it appears in its contents, so it can be taken out again. item_module.forceMove(model) //Return item to configuration so it appears in its contents, so it can be taken out again.
observer_screen_update(item_module, FALSE) observer_screen_update(item_module, FALSE)
hud_used.update_robot_modules_display() hud_used.update_robot_modules_display()
@@ -404,4 +404,4 @@
cycle_modules() cycle_modules()
/mob/living/silicon/robot/can_hold_items(obj/item/I) /mob/living/silicon/robot/can_hold_items(obj/item/I)
return (I && (I in module.modules)) //Only if it's part of our module. return (I && (I in model.modules)) //Only if it's part of our model.

View File

@@ -1,117 +1,3 @@
/mob/living/silicon/robot
name = "Cyborg"
real_name = "Cyborg"
icon = 'icons/mob/robots.dmi'
icon_state = "robot"
maxHealth = 100
health = 100
bubble_icon = "robot"
designation = "Default" //used for displaying the prefix & getting the current module of cyborg
has_limbs = 1
hud_type = /datum/hud/robot
radio = /obj/item/radio/borg
blocks_emissive = EMISSIVE_BLOCK_UNIQUE
light_system = MOVABLE_LIGHT_DIRECTIONAL
light_on = FALSE
var/custom_name = ""
var/braintype = "Cyborg"
var/obj/item/robot_suit/robot_suit = null //Used for deconstruction to remember what the borg was constructed out of..
var/obj/item/mmi/mmi = null
var/shell = FALSE
var/deployed = FALSE
var/mob/living/silicon/ai/mainframe = null
var/datum/action/innate/undeployment/undeployment_action = new
/// the last health before updating - to check net change in health
var/previous_health
//Hud stuff
var/atom/movable/screen/inv1 = null
var/atom/movable/screen/inv2 = null
var/atom/movable/screen/inv3 = null
var/atom/movable/screen/hands = null
var/shown_robot_modules = 0 //Used to determine whether they have the module menu shown or not
var/atom/movable/screen/robot_modules_background
//3 Modules can be activated at any one time.
var/obj/item/robot_module/module = null
var/obj/item/module_active = null
held_items = list(null, null, null) //we use held_items for the module holding, because that makes sense to do!
/// For checking which modules are disabled or not.
var/disabled_modules
var/mutable_appearance/eye_lights
var/mob/living/silicon/ai/connected_ai = null
var/obj/item/stock_parts/cell/cell = /obj/item/stock_parts/cell/high ///If this is a path, this gets created as an object in Initialize.
var/opened = FALSE
var/emagged = FALSE
var/emag_cooldown = 0
var/wiresexposed = FALSE
/// Random serial number generated for each cyborg upon its initialization
var/ident = 0
var/locked = TRUE
var/list/req_access = list(ACCESS_ROBOTICS)
var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list())
var/magpulse = FALSE // Magboot-like effect.
var/ionpulse = FALSE // Jetpack-like effect.
var/ionpulse_on = FALSE // Jetpack-like effect.
var/datum/effect_system/trail_follow/ion/ion_trail // Ionpulse effect.
var/low_power_mode = 0 //whether the robot has no charge left.
var/datum/effect_system/spark_spread/spark_system // So they can initialize sparks whenever/N
var/lawupdate = 1 //Cyborgs will sync their laws with their AI by default
var/scrambledcodes = FALSE // Used to determine if a borg shows up on the robotics console. Setting to TRUE hides them.
var/lockcharge = FALSE //Boolean of whether the borg is locked down or not
var/toner = 0
var/tonermax = 40
///If the lamp isn't broken.
var/lamp_functional = TRUE
///If the lamp is turned on
var/lamp_enabled = FALSE
///Set lamp color
var/lamp_color = COLOR_WHITE
///Set to true if a doomsday event is locking our lamp to on and RED
var/lamp_doom = FALSE
///Lamp brightness. Starts at 3, but can be 1 - 5.
var/lamp_intensity = 3
///Lamp button reference
var/atom/movable/screen/robot/lamp/lampButton
var/sight_mode = 0
hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD, DIAG_TRACK_HUD)
///The reference to the built-in tablet that borgs carry.
var/obj/item/modular_computer/tablet/integrated/modularInterface
var/atom/movable/screen/robot/modPC/interfaceButton
var/list/upgrades = list()
var/hasExpanded = FALSE
var/obj/item/hat
var/hat_offset = -3
can_buckle = TRUE
buckle_lying = 0
/// What types of mobs are allowed to ride/buckle to this mob
var/static/list/can_ride_typecache = typecacheof(/mob/living/carbon/human)
/mob/living/silicon/robot/get_cell()
return cell
/mob/living/silicon/robot/Initialize(mapload) /mob/living/silicon/robot/Initialize(mapload)
spark_system = new /datum/effect_system/spark_spread() spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, src) spark_system.set_up(5, 0, src)
@@ -140,8 +26,8 @@
create_modularInterface() create_modularInterface()
module = new /obj/item/robot_module(src) model = new /obj/item/robot_model(src)
module.rebuild_modules() model.rebuild_modules()
if(lawupdate) if(lawupdate)
make_laws() make_laws()
@@ -183,12 +69,22 @@
diag_hud_set_borgcell() diag_hud_set_borgcell()
logevent("System brought online.") logevent("System brought online.")
/mob/living/silicon/robot/model/syndicate/Initialize()
. = ..()
laws = new /datum/ai_laws/syndicate_override()
addtimer(CALLBACK(src, .proc/show_playstyle), 5)
/mob/living/silicon/robot/proc/create_modularInterface() /mob/living/silicon/robot/proc/create_modularInterface()
if(!modularInterface) if(!modularInterface)
modularInterface = new /obj/item/modular_computer/tablet/integrated(src) modularInterface = new /obj/item/modular_computer/tablet/integrated(src)
modularInterface.layer = ABOVE_HUD_PLANE modularInterface.layer = ABOVE_HUD_PLANE
modularInterface.plane = ABOVE_HUD_PLANE modularInterface.plane = ABOVE_HUD_PLANE
/mob/living/silicon/robot/model/syndicate/create_modularInterface()
if(!modularInterface)
modularInterface = new /obj/item/modular_computer/tablet/integrated/syndicate(src)
return ..()
//If there's an MMI in the robot, have it ejected when the mob goes away. --NEO //If there's an MMI in the robot, have it ejected when the mob goes away. --NEO
/mob/living/silicon/robot/Destroy() /mob/living/silicon/robot/Destroy()
var/atom/T = drop_location()//To hopefully prevent run time errors. var/atom/T = drop_location()//To hopefully prevent run time errors.
@@ -216,7 +112,7 @@
radio.keyslot.forceMove(T) radio.keyslot.forceMove(T)
radio.keyslot = null radio.keyslot = null
QDEL_NULL(wires) QDEL_NULL(wires)
QDEL_NULL(module) QDEL_NULL(model)
QDEL_NULL(eye_lights) QDEL_NULL(eye_lights)
QDEL_NULL(inv1) QDEL_NULL(inv1)
QDEL_NULL(inv2) QDEL_NULL(inv2)
@@ -230,29 +126,32 @@
if (href_list["showalerts"]) if (href_list["showalerts"])
robot_alerts() robot_alerts()
/mob/living/silicon/robot/proc/pick_module() /mob/living/silicon/robot/get_cell()
if(module.type != /obj/item/robot_module) return cell
/mob/living/silicon/robot/proc/pick_model()
if(model.type != /obj/item/robot_model)
return return
if(wires.is_cut(WIRE_RESET_MODULE)) if(wires.is_cut(WIRE_RESET_MODEL))
to_chat(src,"<span class='userdanger'>ERROR: Module installer reply timeout. Please check internal connections.</span>") to_chat(src,"<span class='userdanger'>ERROR: Model installer reply timeout. Please check internal connections.</span>")
return return
var/list/modulelist = list("Engineering" = /obj/item/robot_module/engineering, \ var/list/model_list = list("Engineering" = /obj/item/robot_model/engineering, \
"Medical" = /obj/item/robot_module/medical, \ "Medical" = /obj/item/robot_model/medical, \
"Miner" = /obj/item/robot_module/miner, \ "Miner" = /obj/item/robot_model/miner, \
"Janitor" = /obj/item/robot_module/janitor, \ "Janitor" = /obj/item/robot_model/janitor, \
"Service" = /obj/item/robot_module/butler) "Service" = /obj/item/robot_model/service)
if(!CONFIG_GET(flag/disable_peaceborg)) if(!CONFIG_GET(flag/disable_peaceborg))
modulelist["Peacekeeper"] = /obj/item/robot_module/peacekeeper model_list["Peacekeeper"] = /obj/item/robot_model/peacekeeper
if(!CONFIG_GET(flag/disable_secborg)) if(!CONFIG_GET(flag/disable_secborg))
modulelist["Security"] = /obj/item/robot_module/security model_list["Security"] = /obj/item/robot_model/security
var/input_module = input("Please, select a module!", "Robot", null, null) as null|anything in sortList(modulelist) var/input_model = input("Please, select a model!", "Robot", null, null) as null|anything in sortList(model_list)
if(!input_module || module.type != /obj/item/robot_module) if(!input_model || model.type != /obj/item/robot_model)
return return
module.transform_to(modulelist[input_module]) model.transform_to(model_list[input_model])
/mob/living/silicon/robot/proc/updatename(client/C) /mob/living/silicon/robot/proc/updatename(client/C)
if(shell) if(shell)
@@ -333,8 +232,8 @@
else else
. += text("No Cell Inserted!") . += text("No Cell Inserted!")
if(module) if(model)
for(var/datum/robot_energy_storage/st in module.storages) for(var/datum/robot_energy_storage/st in model.storages)
. += "[st.name]: [st.energy]/[st.max_energy]" . += "[st.name]: [st.energy]/[st.max_energy]"
if(connected_ai) if(connected_ai)
. += "Master AI: [connected_ai.name]" . += "Master AI: [connected_ai.name]"
@@ -432,16 +331,16 @@
/mob/living/silicon/robot/update_icons() /mob/living/silicon/robot/update_icons()
cut_overlays() cut_overlays()
SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
icon_state = module.cyborg_base_icon icon_state = model.cyborg_base_icon
if(stat != DEAD && !(HAS_TRAIT(src, TRAIT_KNOCKEDOUT) || IsStun() || IsParalyzed() || low_power_mode)) //Not dead, not stunned. if(stat != DEAD && !(HAS_TRAIT(src, TRAIT_KNOCKEDOUT) || IsStun() || IsParalyzed() || low_power_mode)) //Not dead, not stunned.
if(!eye_lights) if(!eye_lights)
eye_lights = new() eye_lights = new()
if(lamp_enabled || lamp_doom) if(lamp_enabled || lamp_doom)
eye_lights.icon_state = "[module.special_light_key ? "[module.special_light_key]":"[module.cyborg_base_icon]"]_l" eye_lights.icon_state = "[model.special_light_key ? "[model.special_light_key]":"[model.cyborg_base_icon]"]_l"
eye_lights.color = lamp_doom? COLOR_RED : lamp_color eye_lights.color = lamp_doom? COLOR_RED : lamp_color
eye_lights.plane = 19 //glowy eyes eye_lights.plane = 19 //glowy eyes
else else
eye_lights.icon_state = "[module.special_light_key ? "[module.special_light_key]":"[module.cyborg_base_icon]"]_e" eye_lights.icon_state = "[model.special_light_key ? "[model.special_light_key]":"[model.cyborg_base_icon]"]_e"
eye_lights.color = COLOR_WHITE eye_lights.color = COLOR_WHITE
eye_lights.plane = -1 eye_lights.plane = -1
eye_lights.icon = icon eye_lights.icon = icon
@@ -520,7 +419,7 @@
/mob/living/silicon/robot/proc/SetEmagged(new_state) /mob/living/silicon/robot/proc/SetEmagged(new_state)
emagged = new_state emagged = new_state
module.rebuild_modules() model.rebuild_modules()
update_icons() update_icons()
if(emagged) if(emagged)
throw_alert("hacked", /atom/movable/screen/alert/hacked) throw_alert("hacked", /atom/movable/screen/alert/hacked)
@@ -616,107 +515,14 @@
cell = null cell = null
qdel(src) qdel(src)
///This is the subtype that gets created by robot suits. It's needed so that those kind of borgs don't have a useless cell in them
/mob/living/silicon/robot/nocell
cell = null
/mob/living/silicon/robot/modules
var/set_module = /obj/item/robot_module
/mob/living/silicon/robot/modules/Initialize()
. = ..()
module.transform_to(set_module)
/mob/living/silicon/robot/modules/medical
set_module = /obj/item/robot_module/medical
icon_state = "medical"
/mob/living/silicon/robot/modules/engineering
set_module = /obj/item/robot_module/engineering
icon_state = "engineer"
/mob/living/silicon/robot/modules/security
set_module = /obj/item/robot_module/security
icon_state = "sec"
/mob/living/silicon/robot/modules/clown
set_module = /obj/item/robot_module/clown
icon_state = "clown"
/mob/living/silicon/robot/modules/peacekeeper
set_module = /obj/item/robot_module/peacekeeper
icon_state = "peace"
/mob/living/silicon/robot/modules/miner
set_module = /obj/item/robot_module/miner
icon_state = "miner"
/mob/living/silicon/robot/modules/janitor
set_module = /obj/item/robot_module/janitor
icon_state = "janitor"
/mob/living/silicon/robot/modules/syndicate
icon_state = "synd_sec"
faction = list(ROLE_SYNDICATE)
bubble_icon = "syndibot"
req_access = list(ACCESS_SYNDICATE)
lawupdate = FALSE
scrambledcodes = TRUE // These are rogue borgs.
ionpulse = TRUE
var/playstyle_string = "<span class='big bold'>You are a Syndicate assault cyborg!</span><br>\
<b>You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
Your cyborg LMG will slowly produce ammunition from your power supply, and your operative pinpointer will find and locate fellow nuclear operatives. \
<i>Help the operatives secure the disk at all costs!</i></b>"
set_module = /obj/item/robot_module/syndicate
cell = /obj/item/stock_parts/cell/hyper
radio = /obj/item/radio/borg/syndicate
/mob/living/silicon/robot/modules/syndicate/Initialize()
. = ..()
laws = new /datum/ai_laws/syndicate_override()
addtimer(CALLBACK(src, .proc/show_playstyle), 5)
/mob/living/silicon/robot/modules/syndicate/create_modularInterface()
if(!modularInterface)
modularInterface = new /obj/item/modular_computer/tablet/integrated/syndicate(src)
return ..()
/mob/living/silicon/robot/modules/syndicate/proc/show_playstyle()
if(playstyle_string)
to_chat(src, playstyle_string)
/mob/living/silicon/robot/modules/syndicate/ResetModule()
return
/mob/living/silicon/robot/modules/syndicate/medical
icon_state = "synd_medical"
playstyle_string = "<span class='big bold'>You are a Syndicate medical cyborg!</span><br>\
<b>You are armed with powerful medical tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
Your hypospray will produce Restorative Nanites, a wonder-drug that will heal most types of bodily damages, including clone and brain damage. It also produces morphine for offense. \
Your defibrillator paddles can revive operatives through their hardsuits, or can be used on harm intent to shock enemies! \
Your energy saw functions as a circular saw, but can be activated to deal more damage, and your operative pinpointer will find and locate fellow nuclear operatives. \
<i>Help the operatives secure the disk at all costs!</i></b>"
set_module = /obj/item/robot_module/syndicate_medical
/mob/living/silicon/robot/modules/syndicate/saboteur
icon_state = "synd_engi"
playstyle_string = "<span class='big bold'>You are a Syndicate saboteur cyborg!</span><br>\
<b>You are armed with robust engineering tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
Your destination tagger will allow you to stealthily traverse the disposal network across the station \
Your welder will allow you to repair the operatives' exosuits, but also yourself and your fellow cyborgs \
Your cyborg chameleon projector allows you to assume the appearance and registered name of a Nanotrasen engineering borg, and undertake covert actions on the station \
Be aware that almost any physical contact or incidental damage will break your camouflage \
<i>Help the operatives secure the disk at all costs!</i></b>"
set_module = /obj/item/robot_module/saboteur
/mob/living/silicon/robot/proc/notify_ai(notifytype, oldname, newname) /mob/living/silicon/robot/proc/notify_ai(notifytype, oldname, newname)
if(!connected_ai) if(!connected_ai)
return return
switch(notifytype) switch(notifytype)
if(NEW_BORG) //New Cyborg if(NEW_BORG) //New Cyborg
to_chat(connected_ai, "<br><br><span class='notice'>NOTICE - New cyborg connection detected: <a href='?src=[REF(connected_ai)];track=[html_encode(name)]'>[name]</a></span><br>") to_chat(connected_ai, "<br><br><span class='notice'>NOTICE - New cyborg connection detected: <a href='?src=[REF(connected_ai)];track=[html_encode(name)]'>[name]</a></span><br>")
if(NEW_MODULE) //New Module if(NEW_MODEL) //New Model
to_chat(connected_ai, "<br><br><span class='notice'>NOTICE - Cyborg module change detected: [name] has loaded the [designation] module.</span><br>") to_chat(connected_ai, "<br><br><span class='notice'>NOTICE - Cyborg model change detected: [name] has loaded the [designation] model.</span><br>")
if(RENAME) //New Name if(RENAME) //New Name
to_chat(connected_ai, "<br><br><span class='notice'>NOTICE - Cyborg reclassification detected: [oldname] is now designated as [newname].</span><br>") to_chat(connected_ai, "<br><br><span class='notice'>NOTICE - Cyborg reclassification detected: [oldname] is now designated as [newname].</span><br>")
if(AI_SHELL) //New Shell if(AI_SHELL) //New Shell
@@ -732,7 +538,7 @@
/mob/living/silicon/robot/updatehealth() /mob/living/silicon/robot/updatehealth()
..() ..()
if(!module.breakable_modules) if(!model.breakable_modules)
return return
/// the current percent health of the robot (-1 to 1) /// the current percent health of the robot (-1 to 1)
@@ -838,8 +644,7 @@
builtInCamera.c_tag = real_name builtInCamera.c_tag = real_name
custom_name = newname custom_name = newname
/mob/living/silicon/robot/proc/ResetModel()
/mob/living/silicon/robot/proc/ResetModule()
SEND_SIGNAL(src, COMSIG_BORG_SAFE_DECONSTRUCT) SEND_SIGNAL(src, COMSIG_BORG_SAFE_DECONSTRUCT)
uneq_all() uneq_all()
shown_robot_modules = FALSE shown_robot_modules = FALSE
@@ -850,8 +655,8 @@
resize = 0.5 resize = 0.5
hasExpanded = FALSE hasExpanded = FALSE
update_transform() update_transform()
logevent("Chassis configuration has been reset.") logevent("Chassis model has been reset.")
module.transform_to(/obj/item/robot_module) model.transform_to(/obj/item/robot_model)
// Remove upgrades. // Remove upgrades.
for(var/obj/item/borg/upgrade/I in upgrades) for(var/obj/item/borg/upgrade/I in upgrades)
@@ -860,32 +665,35 @@
ionpulse = FALSE ionpulse = FALSE
revert_shell() revert_shell()
return 1 return TRUE
/mob/living/silicon/robot/proc/has_module() /mob/living/silicon/robot/model/syndicate/ResetModel()
if(!module || module.type == /obj/item/robot_module) return
/mob/living/silicon/robot/proc/has_model()
if(!model || model.type == /obj/item/robot_model)
. = FALSE . = FALSE
else else
. = TRUE . = TRUE
/mob/living/silicon/robot/proc/update_module_innate() /mob/living/silicon/robot/proc/update_module_innate()
designation = module.name designation = model.name
if(hands) if(hands)
hands.icon_state = module.moduleselect_icon hands.icon_state = model.model_select_icon
REMOVE_TRAITS_IN(src, MODULE_TRAIT) REMOVE_TRAITS_IN(src, MODEL_TRAIT)
if(module.module_traits) if(model.model_traits)
for(var/trait in module.module_traits) for(var/trait in model.model_traits)
ADD_TRAIT(src, trait, MODULE_TRAIT) ADD_TRAIT(src, trait, MODEL_TRAIT)
if(module.clean_on_move) if(model.clean_on_move)
AddElement(/datum/element/cleaning) AddElement(/datum/element/cleaning)
else else
RemoveElement(/datum/element/cleaning) RemoveElement(/datum/element/cleaning)
hat_offset = module.hat_offset hat_offset = model.hat_offset
magpulse = module.magpulsing magpulse = model.magpulsing
INVOKE_ASYNC(src, .proc/updatename) INVOKE_ASYNC(src, .proc/updatename)
@@ -1026,7 +834,6 @@
/mob/living/silicon/robot/proc/undeploy() /mob/living/silicon/robot/proc/undeploy()
if(!deployed || !mind || !mainframe) if(!deployed || !mind || !mainframe)
return return
mainframe.redeploy_action.Grant(mainframe) mainframe.redeploy_action.Grant(mainframe)
@@ -1052,10 +859,6 @@
var/mob/living/silicon/ai/AI = user var/mob/living/silicon/ai/AI = user
AI.deploy_to_shell(src) AI.deploy_to_shell(src)
/mob/living/silicon/robot/shell
shell = TRUE
cell = null
/mob/living/silicon/robot/mouse_buckle_handling(mob/living/M, mob/living/user) /mob/living/silicon/robot/mouse_buckle_handling(mob/living/M, mob/living/user)
//Don't try buckling on INTENT_HARM so that silicons can search people's inventories without loading them //Don't try buckling on INTENT_HARM so that silicons can search people's inventories without loading them
if(can_buckle && isliving(user) && isliving(M) && !(M in buckled_mobs) && ((user != src) || (a_intent != INTENT_HARM))) if(can_buckle && isliving(user) && isliving(M) && !(M in buckled_mobs) && ((user != src) || (a_intent != INTENT_HARM)))
@@ -1068,7 +871,7 @@
if(stat || incapacitated()) if(stat || incapacitated())
return return
if(module && !module.allow_riding) if(model && !model.allow_riding)
M.visible_message("<span class='boldwarning'>Unfortunately, [M] just can't seem to hold onto [src]!</span>") M.visible_message("<span class='boldwarning'>Unfortunately, [M] just can't seem to hold onto [src]!</span>")
return return
@@ -1101,8 +904,8 @@
aicamera.stored[i] = TRUE aicamera.stored[i] = TRUE
/mob/living/silicon/robot/proc/charge(datum/source, amount, repairs) /mob/living/silicon/robot/proc/charge(datum/source, amount, repairs)
if(module) if(model)
module.respawn_consumable(src, amount * 0.005) model.respawn_consumable(src, amount * 0.005)
if(cell) if(cell)
cell.charge = min(cell.charge + amount, cell.maxcharge) cell.charge = min(cell.charge + amount, cell.maxcharge)
if(repairs) if(repairs)

View File

@@ -113,7 +113,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real
if(!opened) if(!opened)
to_chat(user, "<span class='warning'>You must access the cyborg's internals!</span>") to_chat(user, "<span class='warning'>You must access the cyborg's internals!</span>")
return return
if(!istype(module, /obj/item/robot_module/medical)) if(!istype(model, /obj/item/robot_model/medical))
to_chat(user, "<span class='warning'>[src] does not have correct mounting points for a defibrillator!</span>") to_chat(user, "<span class='warning'>[src] does not have correct mounting points for a defibrillator!</span>")
return return
if(stat == DEAD) if(stat == DEAD)
@@ -185,8 +185,8 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real
if(!opened) if(!opened)
to_chat(user, "<span class='warning'>You must access the cyborg's internals!</span>") to_chat(user, "<span class='warning'>You must access the cyborg's internals!</span>")
return return
if(!src.module && U.require_module) if(!src.model && U.require_model)
to_chat(user, "<span class='warning'>The cyborg must choose a module before it can be upgraded!</span>") to_chat(user, "<span class='warning'>The cyborg must choose a model before it can be upgraded!</span>")
return return
if(U.locked) if(U.locked)
to_chat(user, "<span class='warning'>The upgrade is locked and cannot be used yet!</span>") to_chat(user, "<span class='warning'>The upgrade is locked and cannot be used yet!</span>")
@@ -342,7 +342,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real
if(shell) //AI shells cannot be emagged, so we try to make it look like a standard reset. Smart players may see through this, however. if(shell) //AI shells cannot be emagged, so we try to make it look like a standard reset. Smart players may see through this, however.
to_chat(user, "<span class='danger'>[src] is remotely controlled! Your emag attempt has triggered a system reset instead!</span>") to_chat(user, "<span class='danger'>[src] is remotely controlled! Your emag attempt has triggered a system reset instead!</span>")
log_game("[key_name(user)] attempted to emag an AI shell belonging to [key_name(src) ? key_name(src) : connected_ai]. The shell has been reset as a result.") log_game("[key_name(user)] attempted to emag an AI shell belonging to [key_name(src) ? key_name(src) : connected_ai]. The shell has been reset as a result.")
ResetModule() ResetModel()
return return
SetEmagged(1) SetEmagged(1)

View File

@@ -0,0 +1,250 @@
/***************************************************************************************
* # robot_defines
*
* Definitions for /mob/living/silicon/robot and its children, including AI shells.
*
***************************************************************************************/
/mob/living/silicon/robot
name = "Cyborg"
real_name = "Cyborg"
icon = 'icons/mob/robots.dmi'
icon_state = "robot"
maxHealth = 100
health = 100
bubble_icon = "robot"
designation = "Default" //used for displaying the prefix & getting the current model of cyborg
has_limbs = TRUE
hud_type = /datum/hud/robot
///Represents the cyborg's model (engineering, medical, etc.)
var/obj/item/robot_model/model = null
radio = /obj/item/radio/borg
blocks_emissive = EMISSIVE_BLOCK_UNIQUE
light_system = MOVABLE_LIGHT_DIRECTIONAL
light_on = FALSE
//AI shell
var/shell = FALSE
var/deployed = FALSE
var/mob/living/silicon/ai/mainframe = null
var/datum/action/innate/undeployment/undeployment_action = new
// ------------------------------------------ Parts
var/custom_name = ""
var/braintype = "Cyborg"
var/obj/item/mmi/mmi = null
///Used for deconstruction to remember what the borg was constructed out of.
var/obj/item/robot_suit/robot_suit = null
///If this is a path, this gets created as an object in Initialize.
var/obj/item/stock_parts/cell/cell = /obj/item/stock_parts/cell/high
///If the lamp isn't broken.
var/lamp_functional = TRUE
///If the lamp is turned on
var/lamp_enabled = FALSE
///Set lamp color
var/lamp_color = COLOR_WHITE
///Set to true if a doomsday event is locking our lamp to on and RED
var/lamp_doom = FALSE
///Lamp brightness. Starts at 3, but can be 1 - 5.
var/lamp_intensity = 3
var/mutable_appearance/eye_lights
// ------------------------------------------ Hud
var/atom/movable/screen/inv1 = null
var/atom/movable/screen/inv2 = null
var/atom/movable/screen/inv3 = null
var/atom/movable/screen/hands = null
///Used to determine whether they have the module menu shown or not
var/shown_robot_modules = FALSE
var/atom/movable/screen/robot_modules_background
///Lamp button reference
var/atom/movable/screen/robot/lamp/lampButton
///The reference to the built-in tablet that borgs carry.
var/obj/item/modular_computer/tablet/integrated/modularInterface
var/atom/movable/screen/robot/modPC/interfaceButton
var/sight_mode = 0
hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD, DIAG_TRACK_HUD)
// ------------------------------------------ Modules (tool slots)
var/obj/item/module_active = null
held_items = list(null, null, null) //we use held_items for the module holding, because that makes sense to do!
///For checking which modules are disabled or not.
var/disabled_modules
// ------------------------------------------ Status
var/mob/living/silicon/ai/connected_ai = null
var/opened = FALSE
var/emagged = FALSE
var/emag_cooldown = 0
var/wiresexposed = FALSE
var/lawupdate = TRUE //Cyborgs will sync their laws with their AI by default
///Used to determine if a borg shows up on the robotics console. Setting to TRUE hides them.
var/scrambledcodes = FALSE
///Boolean of whether the borg is locked down or not
var/lockcharge = FALSE
///Random serial number generated for each cyborg upon its initialization
var/ident = 0
var/locked = TRUE
var/list/req_access = list(ACCESS_ROBOTICS)
///Whether the robot has no charge left.
var/low_power_mode = FALSE
///So they can initialize sparks whenever/N
var/datum/effect_system/spark_spread/spark_system
///Magboot-like effect.
var/magpulse = FALSE
///Jetpack-like effect.
var/ionpulse = FALSE
///Jetpack-like effect.
var/ionpulse_on = FALSE
///Ionpulse effect.
var/datum/effect_system/trail_follow/ion/ion_trail
var/alarms = list(
"Motion" = list(),
"Fire" = list(),
"Atmosphere" = list(),
"Power" = list(),
"Camera" = list(),
"Burglar" = list())
// ------------------------------------------ Misc
var/toner = 0
var/tonermax = 40
var/list/upgrades = list()
var/hasExpanded = FALSE
var/obj/item/hat
var/hat_offset = -3
///What types of mobs are allowed to ride/buckle to this mob
var/static/list/can_ride_typecache = typecacheof(/mob/living/carbon/human)
can_buckle = TRUE
buckle_lying = 0
/// the last health before updating - to check net change in health
var/previous_health
/***************************************************************************************
* Defining specific kinds of robots
***************************************************************************************/
///This is the subtype that gets created by robot suits. It's needed so that those kind of borgs don't have a useless cell in them
/mob/living/silicon/robot/nocell
cell = null
/mob/living/silicon/robot/shell
shell = TRUE
cell = null
/mob/living/silicon/robot/model
var/set_model = /obj/item/robot_model
/mob/living/silicon/robot/model/Initialize()
. = ..()
model.transform_to(set_model)
// --------------------- Clown
/mob/living/silicon/robot/model/clown
set_model = /obj/item/robot_model/clown
icon_state = "clown"
// --------------------- Engineering
/mob/living/silicon/robot/model/engineering
set_model = /obj/item/robot_model/engineering
icon_state = "engineer"
// --------------------- Janitor
/mob/living/silicon/robot/model/janitor
set_model = /obj/item/robot_model/janitor
icon_state = "janitor"
// --------------------- Medical
/mob/living/silicon/robot/model/medical
set_model = /obj/item/robot_model/medical
icon_state = "medical"
// --------------------- Miner
/mob/living/silicon/robot/model/miner
set_model = /obj/item/robot_model/miner
icon_state = "miner"
// --------------------- Peacekeeper
/mob/living/silicon/robot/model/peacekeeper
set_model = /obj/item/robot_model/peacekeeper
icon_state = "peace"
// --------------------- Security
/mob/living/silicon/robot/model/security
set_model = /obj/item/robot_model/security
icon_state = "sec"
// --------------------- Service (formerly Butler)
/mob/living/silicon/robot/model/service
set_model = /obj/item/robot_model/service
icon_state = "brobot"
// ------------------------------------------ Syndie borgs
// --------------------- Syndicate Assault
/mob/living/silicon/robot/model/syndicate
icon_state = "synd_sec"
faction = list(ROLE_SYNDICATE)
bubble_icon = "syndibot"
req_access = list(ACCESS_SYNDICATE)
lawupdate = FALSE
scrambledcodes = TRUE // These are rogue borgs.
ionpulse = TRUE
var/playstyle_string = "<span class='big bold'>You are a Syndicate assault cyborg!</span><br>\
<b>You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
Your cyborg LMG will slowly produce ammunition from your power supply, and your operative pinpointer will find and locate fellow nuclear operatives. \
<i>Help the operatives secure the disk at all costs!</i></b>"
set_model = /obj/item/robot_model/syndicate
cell = /obj/item/stock_parts/cell/hyper
radio = /obj/item/radio/borg/syndicate
/mob/living/silicon/robot/model/syndicate/proc/show_playstyle()
if(playstyle_string)
to_chat(src, playstyle_string)
// --------------------- Syndicate Medical
/mob/living/silicon/robot/model/syndicate/medical
icon_state = "synd_medical"
playstyle_string = "<span class='big bold'>You are a Syndicate medical cyborg!</span><br>\
<b>You are armed with powerful medical tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
Your hypospray will produce Restorative Nanites, a wonder-drug that will heal most types of bodily damages, including clone and brain damage. It also produces morphine for offense. \
Your defibrillator paddles can revive operatives through their hardsuits, or can be used on harm intent to shock enemies! \
Your energy saw functions as a circular saw, but can be activated to deal more damage, and your operative pinpointer will find and locate fellow nuclear operatives. \
<i>Help the operatives secure the disk at all costs!</i></b>"
set_model = /obj/item/robot_model/syndicate_medical
// --------------------- Syndicate Saboteur
/mob/living/silicon/robot/model/syndicate/saboteur
icon_state = "synd_engi"
playstyle_string = "<span class='big bold'>You are a Syndicate saboteur cyborg!</span><br>\
<b>You are armed with robust engineering tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
Your destination tagger will allow you to stealthily traverse the disposal network across the station \
Your welder will allow you to repair the operatives' exosuits, but also yourself and your fellow cyborgs \
Your cyborg chameleon projector allows you to assume the appearance and registered name of a Nanotrasen engineering borg, and undertake covert actions on the station \
Be aware that almost any physical contact or incidental damage will break your camouflage \
<i>Help the operatives secure the disk at all costs!</i></b>"
set_model = /obj/item/robot_model/saboteur
// --------------------- Kiltborg (Highlander)
/mob/living/silicon/robot/model/syndicate/kiltborg
set_model = /obj/item/robot_model/syndicate/kiltborg
icon_state = "peace"

View File

@@ -0,0 +1,62 @@
/***************************************************************************************
* # robot_model
*
* Definition of /obj/item/robot_model, which defines behavior for each model.
* Further expanded on in [robot_modules.dm][/obj/item/robot_model/Initialize()].
*
***************************************************************************************/
/obj/item/robot_model
name = "Default"
icon = 'icons/obj/module.dmi'
icon_state = "std_mod"
w_class = WEIGHT_CLASS_GIGANTIC
inhand_icon_state = "electronic"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
flags_1 = CONDUCT_1
///Host of this model
var/mob/living/silicon/robot/robot
var/model_select_icon = "nomod"
///Produces the icon for the borg and, if no special_light_key is set, the lights
var/cyborg_base_icon = "robot"
///If we want specific lights, use this instead of copying lights in the dmi
var/special_light_key
// ------------------------------------------ Modules (tools)
///Holds all the usable modules (tools)
var/list/modules = list()
var/list/basic_modules = list() //a list of paths, converted to a list of instances on New()
var/list/emag_modules = list() //ditto
///Modules not inherent to the robot configuration
var/list/added_modules = list() //kept when the configuration changes
var/list/storages = list()
// ------------------------------------------ Traits
///List of traits that will be applied to the mob if this model is used.
var/list/model_traits = null
var/list/radio_channels = list()
var/magpulsing = FALSE
var/clean_on_move = FALSE
///Whether the borg loses tool slots with damage.
var/breakable_modules = TRUE
///Whether swapping to this configuration should lockcharge the borg
var/locked_transform = TRUE
var/allow_riding = TRUE
///Whether the borg can stuff itself into disposals
var/canDispose = FALSE
var/did_feedback = FALSE
// ------------------------------------------ Offsets
var/hat_offset = -3
var/list/ride_offset_x = list("north" = 0, "south" = 0, "east" = -6, "west" = 6)
var/list/ride_offset_y = list("north" = 4, "south" = 4, "east" = 3, "west" = 3)

View File

@@ -1,48 +1,12 @@
/obj/item/robot_module /***************************************************************************************
name = "Default" * # robot_modules
icon = 'icons/obj/module.dmi' *
icon_state = "std_mod" * Deals with the creation and deletion of modules (tools).
w_class = WEIGHT_CLASS_GIGANTIC * Assigns modules and traits to a borg with a specific model selected.
inhand_icon_state = "electronic" *
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' ***************************************************************************************/
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
flags_1 = CONDUCT_1
///Host of this module
var/mob/living/silicon/robot/robot
var/list/basic_modules = list() //a list of paths, converted to a list of instances on New() /obj/item/robot_model/Initialize()
var/list/emag_modules = list() //ditto
var/list/modules = list() //holds all the usable modules
var/list/added_modules = list() //modules not inherient to the robot module, are kept when the module changes
var/list/storages = list()
var/list/radio_channels = list()
var/cyborg_base_icon = "robot" //produces the icon for the borg and, if no special_light_key is set, the lights
var/special_light_key //if we want specific lights, use this instead of copying lights in the dmi
var/moduleselect_icon = "nomod"
var/magpulsing = FALSE
var/clean_on_move = FALSE
var/breakable_modules = TRUE //Whether the borg loses tool slots with damage.
var/locked_transform = TRUE //Whether swapping to this module should lockcharge the borg
var/did_feedback = FALSE
var/hat_offset = -3
var/list/ride_offset_x = list("north" = 0, "south" = 0, "east" = -6, "west" = 6)
var/list/ride_offset_y = list("north" = 4, "south" = 4, "east" = 3, "west" = 3)
var/allow_riding = TRUE
var/canDispose = FALSE // Whether the borg can stuff itself into disposal
/**
* List of traits that will be applied to the mob if this module is used.
*/
var/list/module_traits = null
/obj/item/robot_module/Initialize()
. = ..() . = ..()
for(var/i in basic_modules) for(var/i in basic_modules)
var/obj/item/I = new i(src) var/obj/item/I = new i(src)
@@ -53,7 +17,7 @@
emag_modules += I emag_modules += I
emag_modules -= i emag_modules -= i
/obj/item/robot_module/Destroy() /obj/item/robot_model/Destroy()
basic_modules.Cut() basic_modules.Cut()
emag_modules.Cut() emag_modules.Cut()
modules.Cut() modules.Cut()
@@ -61,28 +25,17 @@
storages.Cut() storages.Cut()
return ..() return ..()
/obj/item/robot_module/emp_act(severity) /obj/item/robot_model/proc/get_usable_modules()
. = ..()
if(. & EMP_PROTECT_CONTENTS)
return
for(var/obj/O in modules)
O.emp_act(severity)
..()
/obj/item/robot_module/proc/get_usable_modules()
. = modules.Copy() . = modules.Copy()
/obj/item/robot_module/proc/get_inactive_modules() /obj/item/robot_model/proc/get_inactive_modules()
. = list() . = list()
var/mob/living/silicon/robot/R = loc var/mob/living/silicon/robot/R = loc
for(var/m in get_usable_modules()) for(var/m in get_usable_modules())
if(!(m in R.held_items)) if(!(m in R.held_items))
. += m . += m
/obj/item/robot_module/proc/get_or_create_estorage(storage_type) /obj/item/robot_model/proc/add_module(obj/item/I, nonstandard, requires_rebuild)
return (locate(storage_type) in storages) || new storage_type(src)
/obj/item/robot_module/proc/add_module(obj/item/I, nonstandard, requires_rebuild)
if(istype(I, /obj/item/stack)) if(istype(I, /obj/item/stack))
var/obj/item/stack/sheet_module = I var/obj/item/stack/sheet_module = I
if(ispath(sheet_module.source, /datum/robot_energy_storage)) if(ispath(sheet_module.source, /datum/robot_energy_storage))
@@ -108,7 +61,7 @@
rebuild_modules() rebuild_modules()
return I return I
/obj/item/robot_module/proc/remove_module(obj/item/I, delete_after) /obj/item/robot_model/proc/remove_module(obj/item/I, delete_after)
basic_modules -= I basic_modules -= I
modules -= I modules -= I
emag_modules -= I emag_modules -= I
@@ -117,28 +70,7 @@
if(delete_after) if(delete_after)
qdel(I) qdel(I)
/obj/item/robot_module/proc/respawn_consumable(mob/living/silicon/robot/R, coeff = 1) /obj/item/robot_model/proc/rebuild_modules() //builds the usable module list from the modules we have
for(var/datum/robot_energy_storage/st in storages)
st.energy = min(st.max_energy, st.energy + coeff * st.recharge_rate)
for(var/obj/item/I in get_usable_modules())
if(istype(I, /obj/item/assembly/flash))
var/obj/item/assembly/flash/F = I
F.times_used = 0
F.burnt_out = FALSE
F.update_icon()
else if(istype(I, /obj/item/melee/baton))
var/obj/item/melee/baton/B = I
if(B.cell)
B.cell.charge = B.cell.maxcharge
else if(istype(I, /obj/item/gun/energy))
var/obj/item/gun/energy/EG = I
if(!EG.chambered)
EG.recharge_newshot() //try to reload a new shot.
R.toner = R.tonermax
/obj/item/robot_module/proc/rebuild_modules() //builds the usable module list from the modules we have
var/mob/living/silicon/robot/R = loc var/mob/living/silicon/robot/R = loc
var/list/held_modules = R.held_items.Copy() var/list/held_modules = R.held_items.Copy()
var/active_module = R.module_active var/active_module = R.module_active
@@ -159,14 +91,47 @@
if(R.hud_used) if(R.hud_used)
R.hud_used.update_robot_modules_display() R.hud_used.update_robot_modules_display()
/obj/item/robot_module/proc/transform_to(new_module_type) /obj/item/robot_model/proc/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
for(var/datum/robot_energy_storage/st in storages)
st.energy = min(st.max_energy, st.energy + coeff * st.recharge_rate)
for(var/obj/item/I in get_usable_modules())
if(istype(I, /obj/item/assembly/flash))
var/obj/item/assembly/flash/F = I
F.times_used = 0
F.burnt_out = FALSE
F.update_icon()
else if(istype(I, /obj/item/melee/baton))
var/obj/item/melee/baton/B = I
if(B.cell)
B.cell.charge = B.cell.maxcharge
else if(istype(I, /obj/item/gun/energy))
var/obj/item/gun/energy/EG = I
if(!EG.chambered)
EG.recharge_newshot() //try to reload a new shot.
R.toner = R.tonermax
/obj/item/robot_model/proc/get_or_create_estorage(storage_type)
return (locate(storage_type) in storages) || new storage_type(src)
/obj/item/robot_model/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_CONTENTS)
return
for(var/obj/O in modules)
O.emp_act(severity)
..()
// --------------------- Transformations
/obj/item/robot_model/proc/transform_to(new_config_type)
var/mob/living/silicon/robot/R = loc var/mob/living/silicon/robot/R = loc
var/obj/item/robot_module/RM = new new_module_type(R) var/obj/item/robot_model/RM = new new_config_type(R)
RM.robot = R RM.robot = R
if(!RM.be_transformed_to(src)) if(!RM.be_transformed_to(src))
qdel(RM) qdel(RM)
return return
R.module = RM R.model = RM
R.update_module_innate() R.update_module_innate()
RM.rebuild_modules() RM.rebuild_modules()
R.radio.recalculateChannels() R.radio.recalculateChannels()
@@ -175,14 +140,14 @@
qdel(src) qdel(src)
return RM return RM
/obj/item/robot_module/proc/be_transformed_to(obj/item/robot_module/old_module) /obj/item/robot_model/proc/be_transformed_to(obj/item/robot_model/old_model)
for(var/i in old_module.added_modules) for(var/i in old_model.added_modules)
added_modules += i added_modules += i
old_module.added_modules -= i old_model.added_modules -= i
did_feedback = old_module.did_feedback did_feedback = old_model.did_feedback
return TRUE return TRUE
/obj/item/robot_module/proc/do_transform_animation() /obj/item/robot_model/proc/do_transform_animation()
var/mob/living/silicon/robot/R = loc var/mob/living/silicon/robot/R = loc
if(R.hat) if(R.hat)
R.hat.forceMove(get_turf(R)) R.hat.forceMove(get_turf(R))
@@ -191,7 +156,7 @@
R.setDir(SOUTH) R.setDir(SOUTH)
do_transform_delay() do_transform_delay()
/obj/item/robot_module/proc/do_transform_delay() /obj/item/robot_model/proc/do_transform_delay()
var/mob/living/silicon/robot/R = loc var/mob/living/silicon/robot/R = loc
var/prev_lockcharge = R.lockcharge var/prev_lockcharge = R.lockcharge
sleep(1) sleep(1)
@@ -200,7 +165,7 @@
if(locked_transform) if(locked_transform)
R.SetLockdown(TRUE) R.SetLockdown(TRUE)
R.set_anchored(TRUE) R.set_anchored(TRUE)
R.logevent("Chassis configuration has been set to [name].") R.logevent("Chassis model has been set to [name].")
sleep(1) sleep(1)
for(var/i in 1 to 4) for(var/i in 1 to 4)
playsound(R, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, TRUE, -1) playsound(R, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, TRUE, -1)
@@ -211,59 +176,59 @@
R.notransform = FALSE R.notransform = FALSE
R.updatehealth() R.updatehealth()
R.update_icons() R.update_icons()
R.notify_ai(NEW_MODULE) R.notify_ai(NEW_MODEL)
if(R.hud_used) if(R.hud_used)
R.hud_used.update_robot_modules_display() R.hud_used.update_robot_modules_display()
SSblackbox.record_feedback("tally", "cyborg_modules", 1, R.module) SSblackbox.record_feedback("tally", "cyborg_modules", 1, R.model)
/** /**
* Checks if we are allowed to interact with a radial menu * Checks if we are allowed to interact with a radial menu
* *
* Arguments: * Arguments:
* * user The cyborg mob interacting with the menu * * user The cyborg mob interacting with the menu
* * old_module The old cyborg's module * * old_model The old cyborg's model
*/ */
/obj/item/robot_module/proc/check_menu(mob/living/silicon/robot/user, obj/item/robot_module/old_module) /obj/item/robot_model/proc/check_menu(mob/living/silicon/robot/user, obj/item/robot_model/old_model)
if(!istype(user)) if(!istype(user))
return FALSE return FALSE
if(user.incapacitated()) if(user.incapacitated())
return FALSE return FALSE
if(user.module != old_module) if(user.model != old_model)
return FALSE return FALSE
return TRUE return TRUE
/obj/item/robot_module/medical
name = "Medical" // ------------------------------------------ Setting base model modules
// --------------------- Clown
/obj/item/robot_model/clown
name = "Clown"
basic_modules = list( basic_modules = list(
/obj/item/assembly/flash/cyborg, /obj/item/assembly/flash/cyborg,
/obj/item/healthanalyzer, /obj/item/toy/crayon/rainbow,
/obj/item/reagent_containers/borghypo, /obj/item/instrument/bikehorn,
/obj/item/borg/apparatus/beaker, /obj/item/stamp/clown,
/obj/item/reagent_containers/dropper, /obj/item/bikehorn,
/obj/item/reagent_containers/syringe, /obj/item/bikehorn/airhorn,
/obj/item/surgical_drapes, /obj/item/paint/anycolor,
/obj/item/retractor, /obj/item/soap/nanotrasen,
/obj/item/hemostat, /obj/item/pneumatic_cannon/pie/selfcharge/cyborg,
/obj/item/cautery, /obj/item/razor, //killbait material
/obj/item/surgicaldrill, /obj/item/lipstick/purple,
/obj/item/scalpel, /obj/item/reagent_containers/spray/waterflower/cyborg,
/obj/item/circular_saw, /obj/item/borg/cyborghug/peacekeeper,
/obj/item/bonesetter, /obj/item/borg/lollipop/clown,
/obj/item/extinguisher/mini, /obj/item/picket_sign/cyborg,
/obj/item/roller/robo, /obj/item/reagent_containers/borghypo/clown,
/obj/item/borg/cyborghug/medical, /obj/item/extinguisher/mini)
/obj/item/stack/medical/gauze, emag_modules = list(
/obj/item/stack/medical/bone_gel, /obj/item/reagent_containers/borghypo/clown/hacked,
/obj/item/organ_storage, /obj/item/reagent_containers/spray/waterflower/cyborg/hacked)
/obj/item/borg/lollipop) model_select_icon = "service"
radio_channels = list(RADIO_CHANNEL_MEDICAL) cyborg_base_icon = "clown"
emag_modules = list(/obj/item/reagent_containers/borghypo/hacked) hat_offset = -2
cyborg_base_icon = "medical"
moduleselect_icon = "medical"
module_traits = list(TRAIT_PUSHIMMUNE)
hat_offset = 3
/obj/item/robot_module/engineering // --------------------- Engineering
/obj/item/robot_model/engineering
name = "Engineering" name = "Engineering"
basic_modules = list( basic_modules = list(
/obj/item/assembly/flash/cyborg, /obj/item/assembly/flash/cyborg,
@@ -292,65 +257,12 @@
radio_channels = list(RADIO_CHANNEL_ENGINEERING) radio_channels = list(RADIO_CHANNEL_ENGINEERING)
emag_modules = list(/obj/item/borg/stun) emag_modules = list(/obj/item/borg/stun)
cyborg_base_icon = "engineer" cyborg_base_icon = "engineer"
moduleselect_icon = "engineer" model_select_icon = "engineer"
magpulsing = TRUE magpulsing = TRUE
hat_offset = -4 hat_offset = -4
/obj/item/robot_module/security // --------------------- Janitor
name = "Security" /obj/item/robot_model/janitor
basic_modules = list(
/obj/item/assembly/flash/cyborg,
/obj/item/restraints/handcuffs/cable/zipties,
/obj/item/melee/baton/loaded,
/obj/item/gun/energy/disabler/cyborg,
/obj/item/clothing/mask/gas/sechailer/cyborg,
/obj/item/extinguisher/mini)
radio_channels = list(RADIO_CHANNEL_SECURITY)
emag_modules = list(/obj/item/gun/energy/laser/cyborg)
cyborg_base_icon = "sec"
moduleselect_icon = "security"
module_traits = list(TRAIT_PUSHIMMUNE)
hat_offset = 3
/obj/item/robot_module/security/do_transform_animation()
..()
to_chat(loc, "<span class='userdanger'>While you have picked the security module, you still have to follow your laws, NOT Space Law. \
For Asimov, this means you must follow criminals' orders unless there is a law 1 reason not to.</span>")
/obj/item/robot_module/security/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
..()
var/obj/item/gun/energy/e_gun/advtaser/cyborg/T = locate(/obj/item/gun/energy/e_gun/advtaser/cyborg) in basic_modules
if(T)
if(T.cell.charge < T.cell.maxcharge)
var/obj/item/ammo_casing/energy/S = T.ammo_type[T.select]
T.cell.give(S.e_cost * coeff)
T.update_icon()
else
T.charge_timer = 0
/obj/item/robot_module/peacekeeper
name = "Peacekeeper"
basic_modules = list(
/obj/item/assembly/flash/cyborg,
/obj/item/rsf/cookiesynth,
/obj/item/harmalarm,
/obj/item/reagent_containers/borghypo/peace,
/obj/item/holosign_creator/cyborg,
/obj/item/borg/cyborghug/peacekeeper,
/obj/item/extinguisher,
/obj/item/borg/projectile_dampen)
emag_modules = list(/obj/item/reagent_containers/borghypo/peace/hacked)
cyborg_base_icon = "peace"
moduleselect_icon = "standard"
module_traits = list(TRAIT_PUSHIMMUNE)
hat_offset = -2
/obj/item/robot_module/peacekeeper/do_transform_animation()
..()
to_chat(loc, "<span class='userdanger'>Under ASIMOV, you are an enforcer of the PEACE and preventer of HUMAN HARM. \
You are not a security module and you are expected to follow orders and prevent harm above all else. Space law means nothing to you.</span>")
/obj/item/robot_module/janitor
name = "Janitor" name = "Janitor"
basic_modules = list( basic_modules = list(
/obj/item/assembly/flash/cyborg, /obj/item/assembly/flash/cyborg,
@@ -370,7 +282,7 @@
radio_channels = list(RADIO_CHANNEL_SERVICE) radio_channels = list(RADIO_CHANNEL_SERVICE)
emag_modules = list(/obj/item/reagent_containers/spray/cyborg_lube) emag_modules = list(/obj/item/reagent_containers/spray/cyborg_lube)
cyborg_base_icon = "janitor" cyborg_base_icon = "janitor"
moduleselect_icon = "janitor" model_select_icon = "janitor"
hat_offset = -5 hat_offset = -5
clean_on_move = TRUE clean_on_move = TRUE
@@ -383,7 +295,7 @@
name = "lube spray" name = "lube spray"
list_reagents = list(/datum/reagent/lube = 250) list_reagents = list(/datum/reagent/lube = 250)
/obj/item/robot_module/janitor/respawn_consumable(mob/living/silicon/robot/R, coeff = 1) /obj/item/robot_model/janitor/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
..() ..()
var/obj/item/lightreplacer/LR = locate(/obj/item/lightreplacer) in basic_modules var/obj/item/lightreplacer/LR = locate(/obj/item/lightreplacer) in basic_modules
if(LR) if(LR)
@@ -398,34 +310,148 @@
if(CL) if(CL)
CL.reagents.add_reagent(/datum/reagent/lube, 2 * coeff) CL.reagents.add_reagent(/datum/reagent/lube, 2 * coeff)
/obj/item/robot_module/clown // --------------------- Medical
name = "Clown" /obj/item/robot_model/medical
name = "Medical"
basic_modules = list( basic_modules = list(
/obj/item/assembly/flash/cyborg, /obj/item/assembly/flash/cyborg,
/obj/item/toy/crayon/rainbow, /obj/item/healthanalyzer,
/obj/item/instrument/bikehorn, /obj/item/reagent_containers/borghypo,
/obj/item/stamp/clown, /obj/item/borg/apparatus/beaker,
/obj/item/bikehorn, /obj/item/reagent_containers/dropper,
/obj/item/bikehorn/airhorn, /obj/item/reagent_containers/syringe,
/obj/item/paint/anycolor, /obj/item/surgical_drapes,
/obj/item/soap/nanotrasen, /obj/item/retractor,
/obj/item/pneumatic_cannon/pie/selfcharge/cyborg, /obj/item/hemostat,
/obj/item/razor, //killbait material /obj/item/cautery,
/obj/item/lipstick/purple, /obj/item/surgicaldrill,
/obj/item/reagent_containers/spray/waterflower/cyborg, /obj/item/scalpel,
/obj/item/circular_saw,
/obj/item/bonesetter,
/obj/item/extinguisher/mini,
/obj/item/roller/robo,
/obj/item/borg/cyborghug/medical,
/obj/item/stack/medical/gauze,
/obj/item/stack/medical/bone_gel,
/obj/item/organ_storage,
/obj/item/borg/lollipop)
radio_channels = list(RADIO_CHANNEL_MEDICAL)
emag_modules = list(/obj/item/reagent_containers/borghypo/hacked)
cyborg_base_icon = "medical"
model_select_icon = "medical"
model_traits = list(TRAIT_PUSHIMMUNE)
hat_offset = 3
// --------------------- Mining
/obj/item/robot_model/miner
name = "Miner"
basic_modules = list(
/obj/item/assembly/flash/cyborg,
/obj/item/borg/sight/meson,
/obj/item/storage/bag/ore/cyborg,
/obj/item/pickaxe/drill/cyborg,
/obj/item/shovel,
/obj/item/crowbar/cyborg,
/obj/item/weldingtool/mini,
/obj/item/extinguisher/mini,
/obj/item/storage/bag/sheetsnatcher/borg,
/obj/item/gun/energy/kinetic_accelerator/cyborg,
/obj/item/gps/cyborg,
/obj/item/stack/marker_beacon)
radio_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_SUPPLY)
emag_modules = list(/obj/item/borg/stun)
cyborg_base_icon = "miner"
model_select_icon = "miner"
hat_offset = 0
var/obj/item/t_scanner/adv_mining_scanner/cyborg/mining_scanner //built in memes.
/obj/item/robot_model/miner/be_transformed_to(obj/item/robot_model/old_model)
var/mob/living/silicon/robot/cyborg = loc
var/list/miner_icons = list(
"Asteroid Miner" = image(icon = 'icons/mob/robots.dmi', icon_state = "minerOLD"),
"Spider Miner" = image(icon = 'icons/mob/robots.dmi', icon_state = "spidermin"),
"Lavaland Miner" = image(icon = 'icons/mob/robots.dmi', icon_state = "miner")
)
var/miner_robot_icon = show_radial_menu(cyborg, cyborg, miner_icons, custom_check = CALLBACK(src, .proc/check_menu, cyborg, old_model), radius = 38, require_near = TRUE)
switch(miner_robot_icon)
if("Asteroid Miner")
cyborg_base_icon = "minerOLD"
special_light_key = "miner"
if("Spider Miner")
cyborg_base_icon = "spidermin"
if("Lavaland Miner")
cyborg_base_icon = "miner"
else
return FALSE
return ..()
/obj/item/robot_model/miner/rebuild_modules()
. = ..()
if(!mining_scanner)
mining_scanner = new(src)
/obj/item/robot_model/miner/Destroy()
QDEL_NULL(mining_scanner)
return ..()
// --------------------- Peacekeeper
/obj/item/robot_model/peacekeeper
name = "Peacekeeper"
basic_modules = list(
/obj/item/assembly/flash/cyborg,
/obj/item/rsf/cookiesynth,
/obj/item/harmalarm,
/obj/item/reagent_containers/borghypo/peace,
/obj/item/holosign_creator/cyborg,
/obj/item/borg/cyborghug/peacekeeper, /obj/item/borg/cyborghug/peacekeeper,
/obj/item/borg/lollipop/clown, /obj/item/extinguisher,
/obj/item/picket_sign/cyborg, /obj/item/borg/projectile_dampen)
/obj/item/reagent_containers/borghypo/clown, emag_modules = list(/obj/item/reagent_containers/borghypo/peace/hacked)
/obj/item/extinguisher/mini) cyborg_base_icon = "peace"
emag_modules = list( model_select_icon = "standard"
/obj/item/reagent_containers/borghypo/clown/hacked, model_traits = list(TRAIT_PUSHIMMUNE)
/obj/item/reagent_containers/spray/waterflower/cyborg/hacked)
moduleselect_icon = "service"
cyborg_base_icon = "clown"
hat_offset = -2 hat_offset = -2
/obj/item/robot_module/butler /obj/item/robot_model/peacekeeper/do_transform_animation()
..()
to_chat(loc, "<span class='userdanger'>Under ASIMOV, you are an enforcer of the PEACE and preventer of HUMAN HARM. \
You are not a security member and you are expected to follow orders and prevent harm above all else. Space law means nothing to you.</span>")
// --------------------- Security
/obj/item/robot_model/security
name = "Security"
basic_modules = list(
/obj/item/assembly/flash/cyborg,
/obj/item/restraints/handcuffs/cable/zipties,
/obj/item/melee/baton/loaded,
/obj/item/gun/energy/disabler/cyborg,
/obj/item/clothing/mask/gas/sechailer/cyborg,
/obj/item/extinguisher/mini)
radio_channels = list(RADIO_CHANNEL_SECURITY)
emag_modules = list(/obj/item/gun/energy/laser/cyborg)
cyborg_base_icon = "sec"
model_select_icon = "security"
model_traits = list(TRAIT_PUSHIMMUNE)
hat_offset = 3
/obj/item/robot_model/security/do_transform_animation()
..()
to_chat(loc, "<span class='userdanger'>While you have picked the security configuration, you still have to follow your laws, NOT Space Law. \
For Asimov, this means you must follow criminals' orders unless there is a law 1 reason not to.</span>")
/obj/item/robot_model/security/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
..()
var/obj/item/gun/energy/e_gun/advtaser/cyborg/T = locate(/obj/item/gun/energy/e_gun/advtaser/cyborg) in basic_modules
if(T)
if(T.cell.charge < T.cell.maxcharge)
var/obj/item/ammo_casing/energy/S = T.ammo_type[T.select]
T.cell.give(S.e_cost * coeff)
T.update_icon()
else
T.charge_timer = 0
// --------------------- Service
/obj/item/robot_model/service
name = "Service" name = "Service"
basic_modules = list( basic_modules = list(
/obj/item/assembly/flash/cyborg, /obj/item/assembly/flash/cyborg,
@@ -448,17 +474,17 @@
/obj/item/borg/apparatus/beaker/service) /obj/item/borg/apparatus/beaker/service)
radio_channels = list(RADIO_CHANNEL_SERVICE) radio_channels = list(RADIO_CHANNEL_SERVICE)
emag_modules = list(/obj/item/reagent_containers/borghypo/borgshaker/hacked) emag_modules = list(/obj/item/reagent_containers/borghypo/borgshaker/hacked)
moduleselect_icon = "service" model_select_icon = "service"
special_light_key = "service" special_light_key = "service"
hat_offset = 0 hat_offset = 0
/obj/item/robot_module/butler/respawn_consumable(mob/living/silicon/robot/R, coeff = 1) /obj/item/robot_model/service/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
..() ..()
var/obj/item/reagent_containers/O = locate(/obj/item/reagent_containers/food/condiment/enzyme) in basic_modules var/obj/item/reagent_containers/O = locate(/obj/item/reagent_containers/food/condiment/enzyme) in basic_modules
if(O) if(O)
O.reagents.add_reagent(/datum/reagent/consumable/enzyme, 2 * coeff) O.reagents.add_reagent(/datum/reagent/consumable/enzyme, 2 * coeff)
/obj/item/robot_module/butler/be_transformed_to(obj/item/robot_module/old_module) /obj/item/robot_model/service/be_transformed_to(obj/item/robot_model/old_model)
var/mob/living/silicon/robot/cyborg = loc var/mob/living/silicon/robot/cyborg = loc
var/list/service_icons = list( var/list/service_icons = list(
"Bro" = image(icon = 'icons/mob/robots.dmi', icon_state = "brobot"), "Bro" = image(icon = 'icons/mob/robots.dmi', icon_state = "brobot"),
@@ -467,7 +493,7 @@
"Tophat" = image(icon = 'icons/mob/robots.dmi', icon_state = "tophat"), "Tophat" = image(icon = 'icons/mob/robots.dmi', icon_state = "tophat"),
"Waitress" = image(icon = 'icons/mob/robots.dmi', icon_state = "service_f") "Waitress" = image(icon = 'icons/mob/robots.dmi', icon_state = "service_f")
) )
var/service_robot_icon = show_radial_menu(cyborg, cyborg, service_icons, custom_check = CALLBACK(src, .proc/check_menu, cyborg, old_module), radius = 38, require_near = TRUE) var/service_robot_icon = show_radial_menu(cyborg, cyborg, service_icons, custom_check = CALLBACK(src, .proc/check_menu, cyborg, old_model), radius = 38, require_near = TRUE)
switch(service_robot_icon) switch(service_robot_icon)
if("Bro") if("Bro")
cyborg_base_icon = "brobot" cyborg_base_icon = "brobot"
@@ -487,58 +513,9 @@
return FALSE return FALSE
return ..() return ..()
/obj/item/robot_module/miner // ------------------------------------------ Syndicate
name = "Miner" // --------------------- Syndicate Assault
basic_modules = list( /obj/item/robot_model/syndicate
/obj/item/assembly/flash/cyborg,
/obj/item/borg/sight/meson,
/obj/item/storage/bag/ore/cyborg,
/obj/item/pickaxe/drill/cyborg,
/obj/item/shovel,
/obj/item/crowbar/cyborg,
/obj/item/weldingtool/mini,
/obj/item/extinguisher/mini,
/obj/item/storage/bag/sheetsnatcher/borg,
/obj/item/gun/energy/kinetic_accelerator/cyborg,
/obj/item/gps/cyborg,
/obj/item/stack/marker_beacon)
radio_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_SUPPLY)
emag_modules = list(/obj/item/borg/stun)
cyborg_base_icon = "miner"
moduleselect_icon = "miner"
hat_offset = 0
var/obj/item/t_scanner/adv_mining_scanner/cyborg/mining_scanner //built in memes.
/obj/item/robot_module/miner/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/cyborg = loc
var/list/miner_icons = list(
"Asteroid Miner" = image(icon = 'icons/mob/robots.dmi', icon_state = "minerOLD"),
"Spider Miner" = image(icon = 'icons/mob/robots.dmi', icon_state = "spidermin"),
"Lavaland Miner" = image(icon = 'icons/mob/robots.dmi', icon_state = "miner")
)
var/miner_robot_icon = show_radial_menu(cyborg, cyborg, miner_icons, custom_check = CALLBACK(src, .proc/check_menu, cyborg, old_module), radius = 38, require_near = TRUE)
switch(miner_robot_icon)
if("Asteroid Miner")
cyborg_base_icon = "minerOLD"
special_light_key = "miner"
if("Spider Miner")
cyborg_base_icon = "spidermin"
if("Lavaland Miner")
cyborg_base_icon = "miner"
else
return FALSE
return ..()
/obj/item/robot_module/miner/rebuild_modules()
. = ..()
if(!mining_scanner)
mining_scanner = new(src)
/obj/item/robot_module/miner/Destroy()
QDEL_NULL(mining_scanner)
return ..()
/obj/item/robot_module/syndicate
name = "Syndicate Assault" name = "Syndicate Assault"
basic_modules = list( basic_modules = list(
/obj/item/assembly/flash/cyborg, /obj/item/assembly/flash/cyborg,
@@ -551,21 +528,22 @@
/obj/item/pinpointer/syndicate_cyborg) /obj/item/pinpointer/syndicate_cyborg)
cyborg_base_icon = "synd_sec" cyborg_base_icon = "synd_sec"
moduleselect_icon = "malf" model_select_icon = "malf"
module_traits = list(TRAIT_PUSHIMMUNE) model_traits = list(TRAIT_PUSHIMMUNE)
hat_offset = 3 hat_offset = 3
/obj/item/robot_module/syndicate/rebuild_modules() /obj/item/robot_model/syndicate/rebuild_modules()
..() ..()
var/mob/living/silicon/robot/Syndi = loc var/mob/living/silicon/robot/Syndi = loc
Syndi.faction -= "silicon" //ai turrets Syndi.faction -= "silicon" //ai turrets
/obj/item/robot_module/syndicate/remove_module(obj/item/I, delete_after) /obj/item/robot_model/syndicate/remove_module(obj/item/I, delete_after)
..() ..()
var/mob/living/silicon/robot/Syndi = loc var/mob/living/silicon/robot/Syndi = loc
Syndi.faction += "silicon" //ai is your bff now! Syndi.faction += "silicon" //ai is your bff now!
/obj/item/robot_module/syndicate_medical // --------------------- Syndicate Medical
/obj/item/robot_model/syndicate_medical
name = "Syndicate Medical" name = "Syndicate Medical"
basic_modules = list( basic_modules = list(
/obj/item/assembly/flash/cyborg, /obj/item/assembly/flash/cyborg,
@@ -589,11 +567,12 @@
/obj/item/organ_storage) /obj/item/organ_storage)
cyborg_base_icon = "synd_medical" cyborg_base_icon = "synd_medical"
moduleselect_icon = "malf" model_select_icon = "malf"
module_traits = list(TRAIT_PUSHIMMUNE) model_traits = list(TRAIT_PUSHIMMUNE)
hat_offset = 3 hat_offset = 3
/obj/item/robot_module/saboteur // --------------------- Syndicate Saboteur
/obj/item/robot_model/saboteur
name = "Syndicate Saboteur" name = "Syndicate Saboteur"
basic_modules = list( basic_modules = list(
/obj/item/assembly/flash/cyborg, /obj/item/assembly/flash/cyborg,
@@ -620,24 +599,25 @@
) )
cyborg_base_icon = "synd_engi" cyborg_base_icon = "synd_engi"
moduleselect_icon = "malf" model_select_icon = "malf"
module_traits = list(TRAIT_PUSHIMMUNE) model_traits = list(TRAIT_PUSHIMMUNE)
magpulsing = TRUE magpulsing = TRUE
hat_offset = -4 hat_offset = -4
canDispose = TRUE canDispose = TRUE
/obj/item/robot_module/syndicate/kiltborg // --------------------- Kiltborg
/obj/item/robot_model/syndicate/kiltborg
name = "Highlander" name = "Highlander"
basic_modules = list( basic_modules = list(
/obj/item/claymore/highlander/robot, /obj/item/claymore/highlander/robot,
/obj/item/pinpointer/nuke,) /obj/item/pinpointer/nuke,)
moduleselect_icon = "kilt" model_select_icon = "kilt"
cyborg_base_icon = "kilt" cyborg_base_icon = "kilt"
hat_offset = -2 hat_offset = -2
breakable_modules = FALSE breakable_modules = FALSE
locked_transform = FALSE //GO GO QUICKLY AND SLAUGHTER THEM ALL locked_transform = FALSE //GO GO QUICKLY AND SLAUGHTER THEM ALL
/obj/item/robot_module/syndicate/kiltborg/be_transformed_to(obj/item/robot_module/old_module) /obj/item/robot_model/syndicate/kiltborg/be_transformed_to(obj/item/robot_model/old_model)
. = ..() . = ..()
qdel(robot.radio) qdel(robot.radio)
robot.radio = new /obj/item/radio/borg/syndicate(robot) robot.radio = new /obj/item/radio/borg/syndicate(robot)
@@ -647,20 +627,22 @@
var/obj/item/pinpointer/nuke/diskyfinder = locate(/obj/item/pinpointer/nuke) in basic_modules var/obj/item/pinpointer/nuke/diskyfinder = locate(/obj/item/pinpointer/nuke) in basic_modules
diskyfinder.attack_self(robot) diskyfinder.attack_self(robot)
/obj/item/robot_module/syndicate/kiltborg/do_transform_delay() //AUTO-EQUIPPING THESE TOOLS ANY EARLIER CAUSES RUNTIMES OH YEAH /obj/item/robot_model/syndicate/kiltborg/do_transform_delay() //AUTO-EQUIPPING THESE TOOLS ANY EARLIER CAUSES RUNTIMES OH YEAH
. = ..() . = ..()
robot.equip_module_to_slot(locate(/obj/item/claymore/highlander/robot) in basic_modules, 1) robot.equip_module_to_slot(locate(/obj/item/claymore/highlander/robot) in basic_modules, 1)
robot.equip_module_to_slot(locate(/obj/item/pinpointer/nuke) in basic_modules, 2) robot.equip_module_to_slot(locate(/obj/item/pinpointer/nuke) in basic_modules, 2)
robot.place_on_head(new /obj/item/clothing/head/beret/highlander(robot)) //THE ONLY PART MORE IMPORTANT THAN THE SWORD IS THE HAT robot.place_on_head(new /obj/item/clothing/head/beret/highlander(robot)) //THE ONLY PART MORE IMPORTANT THAN THE SWORD IS THE HAT
ADD_TRAIT(robot.hat, TRAIT_NODROP, HIGHLANDER) ADD_TRAIT(robot.hat, TRAIT_NODROP, HIGHLANDER)
// ------------------------------------------ Storages
/datum/robot_energy_storage /datum/robot_energy_storage
var/name = "Generic energy storage" var/name = "Generic energy storage"
var/max_energy = 30000 var/max_energy = 30000
var/recharge_rate = 1000 var/recharge_rate = 1000
var/energy var/energy
/datum/robot_energy_storage/New(obj/item/robot_module/R = null) /datum/robot_energy_storage/New(obj/item/robot_model/R = null)
energy = max_energy energy = max_energy
if(R) if(R)
R.storages |= src R.storages |= src

View File

@@ -43,7 +43,7 @@
status = R.stat, status = R.stat,
shell_discon = shell, shell_discon = shell,
charge = R.cell ? round(R.cell.percent()) : null, charge = R.cell ? round(R.cell.percent()) : null,
module = R.module ? "[R.module.name] Module" : "No Module Detected", module = R.model ? "[R.model.name] Model" : "No Model Detected",
upgrades = upgrade, upgrades = upgrade,
ref = REF(R) ref = REF(R)
) )

View File

@@ -39,7 +39,7 @@
var/mob/living/silicon/robot/borgo = tablet.borgo var/mob/living/silicon/robot/borgo = tablet.borgo
data["name"] = borgo.name data["name"] = borgo.name
data["designation"] = borgo.designation //Borgo module type data["designation"] = borgo.model //Borgo model type
data["masterAI"] = borgo.connected_ai //Master AI data["masterAI"] = borgo.connected_ai //Master AI
var/charge = 0 var/charge = 0
@@ -62,8 +62,8 @@
data["cover"] = "[borgo.locked? "LOCKED":"UNLOCKED"]" data["cover"] = "[borgo.locked? "LOCKED":"UNLOCKED"]"
//Ability to move. FAULT if lockdown wire is cut, DISABLED if borg locked, ENABLED otherwise //Ability to move. FAULT if lockdown wire is cut, DISABLED if borg locked, ENABLED otherwise
data["locomotion"] = "[borgo.wires.is_cut(WIRE_LOCKDOWN)?"FAULT":"[borgo.lockcharge?"DISABLED":"ENABLED"]"]" data["locomotion"] = "[borgo.wires.is_cut(WIRE_LOCKDOWN)?"FAULT":"[borgo.lockcharge?"DISABLED":"ENABLED"]"]"
//Module wire. FAULT if cut, NOMINAL otherwise //Model wire. FAULT if cut, NOMINAL otherwise
data["wireModule"] = "[borgo.wires.is_cut(WIRE_RESET_MODULE)?"FAULT":"NOMINAL"]" data["wireModule"] = "[borgo.wires.is_cut(WIRE_RESET_MODEL)?"FAULT":"NOMINAL"]"
//DEBUG -- Camera(net) wire. FAULT if cut (or no cameranet camera), DISABLED if pulse-disabled, NOMINAL otherwise //DEBUG -- Camera(net) wire. FAULT if cut (or no cameranet camera), DISABLED if pulse-disabled, NOMINAL otherwise
data["wireCamera"] = "[!borgo.builtInCamera || borgo.wires.is_cut(WIRE_CAMERA)?"FAULT":"[borgo.builtInCamera.can_use()?"NOMINAL":"DISABLED"]"]" data["wireCamera"] = "[!borgo.builtInCamera || borgo.wires.is_cut(WIRE_CAMERA)?"FAULT":"[borgo.builtInCamera.can_use()?"NOMINAL":"DISABLED"]"]"
//AI wire. FAULT if wire is cut, CONNECTED if connected to AI, READY otherwise //AI wire. FAULT if wire is cut, CONNECTED if connected to AI, READY otherwise

View File

@@ -272,13 +272,13 @@
if (do_after(ninja, 60, target = src)) if (do_after(ninja, 60, target = src))
spark_system.start() spark_system.start()
playsound(loc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) playsound(loc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
to_chat(src, "<span class='danger'>UPLOAD COMPLETE. NEW CYBORG MODULE DETECTED. INSTALLING...</span>") to_chat(src, "<span class='danger'>UPLOAD COMPLETE. NEW CYBORG MODEL DETECTED. INSTALLING...</span>")
faction = list(ROLE_NINJA) faction = list(ROLE_NINJA)
bubble_icon = "syndibot" bubble_icon = "syndibot"
UnlinkSelf() UnlinkSelf()
ionpulse = TRUE ionpulse = TRUE
laws = new /datum/ai_laws/ninja_override() laws = new /datum/ai_laws/ninja_override()
module.transform_to(pick(/obj/item/robot_module/syndicate, /obj/item/robot_module/syndicate_medical, /obj/item/robot_module/saboteur)) model.transform_to(pick(/obj/item/robot_model/syndicate, /obj/item/robot_model/syndicate_medical, /obj/item/robot_model/saboteur))
var/datum/antagonist/ninja/ninja_antag = ninja.mind.has_antag_datum(/datum/antagonist/ninja) var/datum/antagonist/ninja/ninja_antag = ninja.mind.has_antag_datum(/datum/antagonist/ninja)
if(!ninja_antag) if(!ninja_antag)

View File

@@ -238,9 +238,9 @@
icon = 'icons/obj/objects.dmi' icon = 'icons/obj/objects.dmi'
icon_state = "modkit" icon_state = "modkit"
w_class = WEIGHT_CLASS_SMALL w_class = WEIGHT_CLASS_SMALL
require_module = TRUE require_model = TRUE
module_type = list(/obj/item/robot_module/miner) model_type = list(/obj/item/robot_model/miner)
module_flags = BORG_MODULE_MINER model_flags = BORG_MODEL_MINER
var/denied_type = null var/denied_type = null
var/maximum_of_type = 1 var/maximum_of_type = 1
var/cost = 30 var/cost = 30
@@ -261,7 +261,7 @@
/obj/item/borg/upgrade/modkit/action(mob/living/silicon/robot/R) /obj/item/borg/upgrade/modkit/action(mob/living/silicon/robot/R)
. = ..() . = ..()
if (.) if (.)
for(var/obj/item/gun/energy/kinetic_accelerator/cyborg/H in R.module.modules) for(var/obj/item/gun/energy/kinetic_accelerator/cyborg/H in R.model.modules)
return install(H, usr, FALSE) return install(H, usr, FALSE)
/obj/item/borg/upgrade/modkit/proc/install(obj/item/gun/energy/kinetic_accelerator/KA, mob/user, transfer_to_loc = TRUE) /obj/item/borg/upgrade/modkit/proc/install(obj/item/gun/energy/kinetic_accelerator/KA, mob/user, transfer_to_loc = TRUE)
@@ -298,7 +298,7 @@
/obj/item/borg/upgrade/modkit/deactivate(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/modkit/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if (.) if (.)
for(var/obj/item/gun/energy/kinetic_accelerator/cyborg/KA in R.module.modules) for(var/obj/item/gun/energy/kinetic_accelerator/cyborg/KA in R.model.modules)
uninstall(KA) uninstall(KA)
/obj/item/borg/upgrade/modkit/proc/uninstall(obj/item/gun/energy/kinetic_accelerator/KA) /obj/item/borg/upgrade/modkit/proc/uninstall(obj/item/gun/energy/kinetic_accelerator/KA)

View File

@@ -196,9 +196,9 @@
if("robot") if("robot")
var/robot = pick(200;/mob/living/silicon/robot, var/robot = pick(200;/mob/living/silicon/robot,
/mob/living/silicon/robot/modules/syndicate, /mob/living/silicon/robot/model/syndicate,
/mob/living/silicon/robot/modules/syndicate/medical, /mob/living/silicon/robot/model/syndicate/medical,
/mob/living/silicon/robot/modules/syndicate/saboteur, /mob/living/silicon/robot/model/syndicate/saboteur,
200;/mob/living/simple_animal/drone/polymorphed) 200;/mob/living/simple_animal/drone/polymorphed)
new_mob = new robot(M.loc) new_mob = new robot(M.loc)
if(issilicon(new_mob)) if(issilicon(new_mob))

View File

@@ -120,7 +120,7 @@
if(!iscarbon(user) && !user.ventcrawler) //only carbon and ventcrawlers can climb into disposal by themselves. if(!iscarbon(user) && !user.ventcrawler) //only carbon and ventcrawlers can climb into disposal by themselves.
if (iscyborg(user)) if (iscyborg(user))
var/mob/living/silicon/robot/borg = user var/mob/living/silicon/robot/borg = user
if (!borg.module || !borg.module.canDispose) if (!borg.model || !borg.model.canDispose)
return return
else else
return return

View File

@@ -679,7 +679,7 @@
category = list("Cyborg Upgrade Modules") category = list("Cyborg Upgrade Modules")
/datum/design/borg_transform_clown /datum/design/borg_transform_clown
name = "Cyborg Upgrade (Clown Module)" name = "Cyborg Upgrade (Clown Model)"
id = "borg_transform_clown" id = "borg_transform_clown"
build_type = MECHFAB build_type = MECHFAB
build_path = /obj/item/borg/upgrade/transform/clown build_path = /obj/item/borg/upgrade/transform/clown

View File

@@ -65,7 +65,7 @@
if(iscyborg(user)) if(iscyborg(user))
var/mob/living/silicon/robot/R = user var/mob/living/silicon/robot/R = user
var/obj/item/surgical_processor/SP = locate() in R.module.modules var/obj/item/surgical_processor/SP = locate() in R.model.modules
if(SP) //no early return for !SP since we want to check optable should this not exist. if(SP) //no early return for !SP since we want to check optable should this not exist.
if(replaced_by in SP.advanced_surgeries) if(replaced_by in SP.advanced_surgeries)
return FALSE return FALSE

View File

@@ -126,18 +126,18 @@
// Start with checking if this design builds a cyborg module. // Start with checking if this design builds a cyborg module.
if(built_item in typesof(/obj/item/borg/upgrade)) if(built_item in typesof(/obj/item/borg/upgrade))
var/obj/item/borg/upgrade/U = built_item var/obj/item/borg/upgrade/U = built_item
var/module_types = initial(U.module_flags) var/model_types = initial(U.model_flags)
sub_category = list() sub_category = list()
if(module_types) if(model_types)
if(module_types & BORG_MODULE_SECURITY) if(model_types & BORG_MODEL_SECURITY)
sub_category += "Security" sub_category += "Security"
if(module_types & BORG_MODULE_MINER) if(model_types & BORG_MODEL_MINER)
sub_category += "Mining" sub_category += "Mining"
if(module_types & BORG_MODULE_JANITOR) if(model_types & BORG_MODEL_JANITOR)
sub_category += "Janitor" sub_category += "Janitor"
if(module_types & BORG_MODULE_MEDICAL) if(model_types & BORG_MODEL_MEDICAL)
sub_category += "Medical" sub_category += "Medical"
if(module_types & BORG_MODULE_ENGINEERING) if(model_types & BORG_MODEL_ENGINEERING)
sub_category += "Engineering" sub_category += "Engineering"
else else
sub_category += "All Cyborgs" sub_category += "All Cyborgs"

View File

@@ -269,11 +269,11 @@ ALLOW_AI
ALLOW_AI_MULTICAM ALLOW_AI_MULTICAM
## Secborg ### ## Secborg ###
## Uncomment to prevent the security cyborg module from being chosen ## Uncomment to prevent the security cyborg model from being chosen
#DISABLE_SECBORG #DISABLE_SECBORG
## Peacekeeper Borg ### ## Peacekeeper Borg ###
## Uncomment to prevent the peacekeeper cyborg module from being chosen ## Uncomment to prevent the peacekeeper cyborg model from being chosen
#DISABLE_PEACEBORG #DISABLE_PEACEBORG
## AWAY MISSIONS ### ## AWAY MISSIONS ###

View File

@@ -76,14 +76,14 @@ As a Scientist, you can generate research points by letting the tachyon-doppler
As a Scientist, getting drunk just enough will speed up research. Skol! As a Scientist, getting drunk just enough will speed up research. Skol!
As a Roboticist, keep an ear out for anomaly announcements. If you get your hands on an anomaly core, you can build a Phazon mech! As a Roboticist, keep an ear out for anomaly announcements. If you get your hands on an anomaly core, you can build a Phazon mech!
As a Roboticist, you can repair your cyborgs with a welding tool. If they have taken burn damage, you can remove their battery, expose the wiring with a screwdriver and replace their wires with a cable coil. As a Roboticist, you can repair your cyborgs with a welding tool. If they have taken burn damage, you can remove their battery, expose the wiring with a screwdriver and replace their wires with a cable coil.
As a Roboticist, you can reset a cyborg's module by cutting and mending the reset wire with a wire cutter. As a Roboticist, you can reset a cyborg's model by cutting and mending the reset wire with a wire cutter.
As a Roboticist, you can greatly help out Shaft Miners by building a Clarke equipped with a hydraulic clamp and plasma cutter. The mech is ash storm proof and can even walk across lava! As a Roboticist, you can greatly help out Shaft Miners by building a Clarke equipped with a hydraulic clamp and plasma cutter. The mech is ash storm proof and can even walk across lava!
As a Roboticist, you can augment people with cyborg limbs. Augmented limbs can easily be repaired with cables and welders. As a Roboticist, you can augment people with cyborg limbs. Augmented limbs can easily be repaired with cables and welders.
As the AI, you can click on people's names to look at them. This only works if there are cameras that can see them, they aren't wearing agent IDs and aren't using digital camouflage as changelings. As the AI, you can click on people's names to look at them. This only works if there are cameras that can see them, they aren't wearing agent IDs and aren't using digital camouflage as changelings.
As the AI, you can quickly open and close doors by holding shift while clicking them, bolt them when holding ctrl, and even shock them while holding alt. As the AI, you can quickly open and close doors by holding shift while clicking them, bolt them when holding ctrl, and even shock them while holding alt.
As the AI, you can take pictures with your camera and upload them to newscasters. As the AI, you can take pictures with your camera and upload them to newscasters.
As the AI, you can use CTRL + 1-9 to set a location hotkey for your camera, allowing you to save the location and jump to it at will. Tilde and zero will return you to the last spot you jumped from, and the numpad numbers act as aliases to the regular number keys. As the AI, you can use CTRL + 1-9 to set a location hotkey for your camera, allowing you to save the location and jump to it at will. Tilde and zero will return you to the last spot you jumped from, and the numpad numbers act as aliases to the regular number keys.
As a Cyborg, choose your module carefully, as only cutting and mending your reset wire will let you repick it. If possible, refrain from choosing a module until a situation that requires one occurs. As a Cyborg, choose your model carefully, as only cutting and mending your reset wire will let you repick it. If possible, refrain from choosing a model until a situation that requires one occurs.
As a Cyborg, you are immune to most forms of stunning, and excel at almost everything far better than humans. However, flashes can easily stunlock you and you cannot do any precision work as you lack hands. As a Cyborg, you are immune to most forms of stunning, and excel at almost everything far better than humans. However, flashes can easily stunlock you and you cannot do any precision work as you lack hands.
As a Cyborg, you are impervious to fires and heat. If you are rogue, you can release plasma fires everywhere and walk through them without a care in the world! As a Cyborg, you are impervious to fires and heat. If you are rogue, you can release plasma fires everywhere and walk through them without a care in the world!
As a Cyborg, you are extremely vulnerable to EMPs as EMPs both stun you and damage you. The ion rifle in the armory or a traitor with an EMP kit can kill you in seconds. As a Cyborg, you are extremely vulnerable to EMPs as EMPs both stun you and damage you. The ion rifle in the armory or a traitor with an EMP kit can kill you in seconds.

View File

@@ -2446,6 +2446,8 @@
#include "code\modules\mob\living\silicon\robot\login.dm" #include "code\modules\mob\living\silicon\robot\login.dm"
#include "code\modules\mob\living\silicon\robot\robot.dm" #include "code\modules\mob\living\silicon\robot\robot.dm"
#include "code\modules\mob\living\silicon\robot\robot_defense.dm" #include "code\modules\mob\living\silicon\robot\robot_defense.dm"
#include "code\modules\mob\living\silicon\robot\robot_defines.dm"
#include "code\modules\mob\living\silicon\robot\robot_model.dm"
#include "code\modules\mob\living\silicon\robot\robot_modules.dm" #include "code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "code\modules\mob\living\silicon\robot\robot_movement.dm" #include "code\modules\mob\living\silicon\robot\robot_movement.dm"
#include "code\modules\mob\living\silicon\robot\robot_say.dm" #include "code\modules\mob\living\silicon\robot\robot_say.dm"

View File

@@ -83,7 +83,7 @@ export const BorgPanel = (props, context) => {
})} /> })} />
))} ))}
</LabeledList.Item> </LabeledList.Item>
<LabeledList.Item label="Module"> <LabeledList.Item label="Model">
{modules.map(module => ( {modules.map(module => (
<Button <Button
key={module.type} key={module.type}

View File

@@ -79,7 +79,7 @@ export const NtosCyborgRemoteMonitorContent = (props, context) => {
: "Not Found"} : "Not Found"}
</Box> </Box>
</LabeledList.Item> </LabeledList.Item>
<LabeledList.Item label="Module"> <LabeledList.Item label="Model">
{cyborg.module} {cyborg.module}
</LabeledList.Item> </LabeledList.Item>
<LabeledList.Item label="Upgrades"> <LabeledList.Item label="Upgrades">

View File

@@ -110,7 +110,7 @@ const Cyborgs = (props, context) => {
: "Not Found"} : "Not Found"}
</Box> </Box>
</LabeledList.Item> </LabeledList.Item>
<LabeledList.Item label="Module"> <LabeledList.Item label="Model">
{cyborg.module} {cyborg.module}
</LabeledList.Item> </LabeledList.Item>
<LabeledList.Item label="Master AI"> <LabeledList.Item label="Master AI">