diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index c6ad076b102..d04022cc3e8 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -43,6 +43,7 @@
#define ui_borg_sensor "CENTER-3:16, SOUTH:5" //borgs
#define ui_borg_lamp "CENTER-4:16, SOUTH:5" //borgs
+#define ui_borg_thrusters "CENTER-5:16, SOUTH:5"//borgs
#define ui_inv1 "CENTER-2:16,SOUTH:5" //borgs
#define ui_inv2 "CENTER-1 :16,SOUTH:5" //borgs
#define ui_inv3 "CENTER :16,SOUTH:5" //borgs
diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm
index 861209033af..b95bacd06e2 100644
--- a/code/_onclick/hud/robot.dm
+++ b/code/_onclick/hud/robot.dm
@@ -70,6 +70,14 @@
var/mob/living/silicon/robot/R = usr
R.control_headlamp()
+/obj/screen/robot/thrusters
+ name = "ion thrusters"
+ icon_state = "ionpulse0"
+
+/obj/screen/robot/thrusters/Click()
+ var/mob/living/silicon/robot/R = usr
+ R.toggle_ionpulse()
+
/obj/screen/robot/panel
name = "installed modules"
icon_state = "panel"
@@ -117,10 +125,10 @@
using.screen_loc = ui_borg_sensor
static_inventory += using
-//Intent
- using = new /obj/screen/act_intent/robot()
- using.icon_state = mymob.a_intent
- static_inventory += using
+//Intent
+ using = new /obj/screen/act_intent/robot()
+ using.icon_state = mymob.a_intent
+ static_inventory += using
action_intent = using
//Health
@@ -141,8 +149,8 @@
mymob.pullin.screen_loc = ui_borg_pull
hotkeybuttons += mymob.pullin
- mymob.zone_sel = new /obj/screen/zone_sel/robot()
- mymob.zone_sel.update_icon(mymob)
+ mymob.zone_sel = new /obj/screen/zone_sel/robot()
+ mymob.zone_sel.update_icon(mymob)
static_inventory += mymob.zone_sel
//Headlamp
@@ -150,6 +158,11 @@
mymobR.lamp_button.screen_loc = ui_borg_lamp
static_inventory += mymobR.lamp_button
+//Thrusters
+ using = new /obj/screen/robot/thrusters()
+ using.screen_loc = ui_borg_thrusters
+ static_inventory += using
+ mymobR.thruster_button = using
/datum/hud/proc/toggle_show_robot_modules()
if(!isrobot(mymob))
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 512baa30703..3836b8eca80 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -2,59 +2,71 @@
// Contains various borg upgrades.
/obj/item/borg/upgrade
- name = "A borg upgrade module."
+ name = "borg upgrade module."
desc = "Protected by FRM."
icon = 'icons/obj/module.dmi'
icon_state = "cyborg_upgrade"
var/locked = 0
- var/require_module = 0
var/installed = 0
+ var/require_module = 0
+ var/module_type = null
-/obj/item/borg/upgrade/proc/action(var/mob/living/silicon/robot/R)
+/obj/item/borg/upgrade/proc/action(mob/living/silicon/robot/R)
if(R.stat == DEAD)
- to_chat(usr, "\red The [src] will not function on a deceased robot.")
+ to_chat(usr, "[src] will not function on a deceased cyborg.")
+ return 1
+ if(module_type && !istype(R.module, module_type))
+ to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
+ to_chat(usr, "There's no mounting point for the module!")
return 1
- return 0
-
/obj/item/borg/upgrade/reset
- name = "robotic module reset board"
- desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the robot."
+ name = "cyborg module reset board"
+ desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the cyborg."
icon_state = "cyborg_upgrade1"
require_module = 1
-/obj/item/borg/upgrade/reset/action(var/mob/living/silicon/robot/R)
- if(..()) return 0
+/obj/item/borg/upgrade/reset/action(mob/living/silicon/robot/R)
+ if(..())
+ return
+
+ R.notify_ai(2)
+
R.uneq_all()
R.hands.icon_state = "nomod"
R.icon_state = "robot"
qdel(R.module)
R.module = null
- R.camera.network.Remove(list("Engineering","Medical","Mining Outpost"))
+
+ R.camera.network.Remove(list("Engineering", "Medical", "Mining Outpost"))
R.rename_character(R.real_name, R.get_default_name("Default"))
- R.status_flags |= CANPUSH
R.languages = list()
R.speech_synthesizer_langs = list()
- R.notify_ai(2)
- R.jetpackoverlay = 0
+
R.update_icons()
R.update_headlamp()
+
+ R.speed = 0 // Remove upgrades.
+ R.ionpulse = 0
R.magpulse = 0
R.add_language("Robot Talk", 1)
+ R.status_flags |= CANPUSH
+
return 1
/obj/item/borg/upgrade/rename
- name = "robot reclassification board"
+ name = "cyborg reclassification board"
desc = "Used to rename a cyborg."
icon_state = "cyborg_upgrade1"
var/heldname = "default name"
-/obj/item/borg/upgrade/rename/attack_self(mob/user as mob)
- heldname = stripped_input(user, "Enter new robot name", "Robot Reclassification", heldname, MAX_NAME_LEN)
+/obj/item/borg/upgrade/rename/attack_self(mob/user)
+ heldname = stripped_input(user, "Enter new robot name", "Cyborg Reclassification", heldname, MAX_NAME_LEN)
/obj/item/borg/upgrade/rename/action(var/mob/living/silicon/robot/R)
- if(..()) return 0
+ if(..())
+ return
R.notify_ai(3, R.name, heldname)
R.name = heldname
R.custom_name = heldname
@@ -63,14 +75,13 @@
return 1
/obj/item/borg/upgrade/restart
- name = "robot emergency restart module"
- desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online."
+ name = "cyborg emergency reboot module"
+ desc = "Used to force a reboot of a disabled-but-repaired cyborg, bringing it back online."
icon_state = "cyborg_upgrade1"
-
-/obj/item/borg/upgrade/restart/action(var/mob/living/silicon/robot/R)
+/obj/item/borg/upgrade/restart/action(mob/living/silicon/robot/R)
if(R.health < 0)
- to_chat(usr, "You have to repair the robot before using this module!")
+ to_chat(usr, "You have to repair the cyborg before using this module!")
return 0
if(!R.key)
@@ -82,6 +93,7 @@
dead_mob_list -= R //please never forget this ever kthx
living_mob_list += R
R.notify_ai(1)
+
return 1
@@ -92,126 +104,224 @@
require_module = 1
/obj/item/borg/upgrade/vtec/action(var/mob/living/silicon/robot/R)
- if(..()) return 0
+ if(..())
+ return
+ if(R.speed < 0)
+ to_chat(R, "A VTEC unit is already installed!")
+ to_chat(usr, "There's no room for another VTEC unit!")
+ return
- if(R.speed == -1)
- return 0
+ R.speed = -1 // Gotta go fast.
- R.speed--
return 1
-
/obj/item/borg/upgrade/disablercooler
- name = "robotic 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."
icon_state = "cyborg_upgrade3"
require_module = 1
+ module_type = /obj/item/weapon/robot_module/security
+/obj/item/borg/upgrade/disablercooler/action(mob/living/silicon/robot/R)
+ if(..())
+ return
-/obj/item/borg/upgrade/disablercooler/action(var/mob/living/silicon/robot/R)
- if(..()) return 0
-
- if(!istype(R.module, /obj/item/weapon/robot_module/security))
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
- return 0
-
- var/obj/item/weapon/gun/energy/disabler/cyborg/T = locate() in R.module
+ var/obj/item/weapon/gun/energy/disabler/cyborg/T = locate() in R.module.modules
if(!T)
- T = locate() in R.module.contents
- if(!T)
- T = locate() in R.module.modules
- if(!T)
- to_chat(usr, "This robot has had its disabler removed!")
- return 0
-
+ to_chat(usr, "There's no disabler in this unit!")
+ return
if(T.charge_delay <= 2)
- to_chat(R, "Maximum cooling achieved for this hardpoint!")
- to_chat(usr, "There's no room for another cooling unit!")
- return 0
+ to_chat(R, "A cooling unit is already installed!")
+ to_chat(usr, "There's no room for another cooling unit!")
+ return
- else
- T.charge_delay = max(2 , T.charge_delay - 4)
+ T.charge_delay = max(2 , T.charge_delay - 4)
return 1
-/obj/item/borg/upgrade/jetpack
- name = "mining robot jetpack"
- desc = "A carbon dioxide jetpack suitable for low-gravity mining operations."
+/obj/item/borg/upgrade/thrusters
+ name = "ion thruster upgrade"
+ desc = "A energy-operated thruster system for cyborgs."
icon_state = "cyborg_upgrade3"
- require_module = 1
-/obj/item/borg/upgrade/jetpack/action(var/mob/living/silicon/robot/R)
- if(..()) return 0
+/obj/item/borg/upgrade/thrusters/action(mob/living/silicon/robot/R)
+ if(..())
+ return
- if(!istype(R.module, /obj/item/weapon/robot_module/miner))
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
- return 0
- else
- R.module.modules += new/obj/item/weapon/tank/jetpack/carbondioxide
- for(var/obj/item/weapon/tank/jetpack/carbondioxide in R.module.modules)
- R.internals = src
- R.jetpackoverlay = 1
- R.update_icons()
- return 1
+ if(R.ionpulse)
+ to_chat(usr, "This unit already has ion thrusters installed!")
+ return
+
+ R.ionpulse = 1
+ return 1
/obj/item/borg/upgrade/ddrill
name = "mining cyborg diamond drill"
desc = "A diamond drill replacement for the mining module's standard drill."
icon_state = "cyborg_upgrade3"
require_module = 1
+ module_type = /obj/item/weapon/robot_module/miner
-/obj/item/borg/upgrade/ddrill/action(var/mob/living/silicon/robot/R)
- if(..()) return 0
+/obj/item/borg/upgrade/ddrill/action(mob/living/silicon/robot/R)
+ if(..())
+ return
- if(!istype(R.module, /obj/item/weapon/robot_module/miner))
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
- return 0
- else
- for(var/obj/item/weapon/pickaxe/drill/cyborg/D in R.module.modules)
- R.module.modules -= D
- qdel(D)
- for(var/obj/item/weapon/shovel/S in R.module.modules)
- R.module.modules -= S
- qdel(S)
- R.module.modules += new /obj/item/weapon/pickaxe/drill/cyborg/diamond(R.module)
- R.module.rebuild()
- return 1
+ for(var/obj/item/weapon/pickaxe/drill/cyborg/D in R.module.modules)
+ qdel(D)
+ for(var/obj/item/weapon/shovel/S in R.module.modules)
+ qdel(S)
+
+ R.module.modules += new /obj/item/weapon/pickaxe/drill/cyborg/diamond(R.module)
+ R.module.rebuild()
+
+ return 1
/obj/item/borg/upgrade/soh
name = "mining cyborg satchel of holding"
desc = "A satchel of holding replacement for mining cyborg's ore satchel module."
icon_state = "cyborg_upgrade3"
require_module = 1
+ module_type = /obj/item/weapon/robot_module/miner
-/obj/item/borg/upgrade/soh/action(var/mob/living/silicon/robot/R)
- if(..()) return 0
+/obj/item/borg/upgrade/soh/action(mob/living/silicon/robot/R)
+ if(..())
+ return
- if(!istype(R.module, /obj/item/weapon/robot_module/miner))
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
- return 0
- else
- for(var/obj/item/weapon/storage/bag/ore/cyborg/S in R.module.modules)
- R.module.modules -= S
- qdel(S)
- R.module.modules += new /obj/item/weapon/storage/bag/ore/holding/cyborg(R.module)
- R.module.rebuild()
- return 1
+ for(var/obj/item/weapon/storage/bag/ore/cyborg/S in R.module.modules)
+ qdel(S)
-/obj/item/borg/upgrade/syndicate/
- name = "Illegal Equipment Module"
- desc = "Unlocks the hidden, deadlier functions of a robot"
+ R.module.modules += new /obj/item/weapon/storage/bag/ore/holding(R.module)
+ R.module.rebuild()
+
+ return 1
+
+/obj/item/borg/upgrade/hyperka
+ name = "mining cyborg hyper-kinetic accelerator"
+ desc = "A satchel of holding replacement for mining cyborg's ore satchel module."
+ icon_state = "cyborg_upgrade3"
+ require_module = 1
+ module_type = /obj/item/weapon/robot_module/miner
+
+/obj/item/borg/upgrade/hyperka/action(mob/living/silicon/robot/R)
+ if(..())
+ return
+
+ for(var/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg/H in R.module.modules)
+ qdel(H)
+
+ R.module.modules += new /obj/item/weapon/gun/energy/kinetic_accelerator/hyper/cyborg(R.module)
+ R.module.rebuild()
+
+ return 1
+
+/obj/item/borg/upgrade/syndicate
+ name = "illegal equipment module"
+ desc = "Unlocks the hidden, deadlier functions of a cyborg"
icon_state = "cyborg_upgrade3"
require_module = 1
-/obj/item/borg/upgrade/syndicate/action(var/mob/living/silicon/robot/R)
- if(..()) return 0
+/obj/item/borg/upgrade/syndicate/action(mob/living/silicon/robot/R)
+ if(..())
+ return
- if(R.emagged == 1)
- return 0
+ if(R.emagged)
+ return
R.emagged = 1
+
return 1
+
+/obj/item/borg/upgrade/selfrepair
+ name = "self-repair module"
+ desc = "This module will repair the cyborg over time."
+ icon_state = "cyborg_upgrade5"
+ require_module = 1
+ var/repair_amount = -1
+ var/repair_tick = 1
+ var/msg_cooldown = 0
+ var/on = 0
+ var/powercost = 10
+ var/mob/living/silicon/robot/cyborg
+
+/obj/item/borg/upgrade/selfrepair/action(mob/living/silicon/robot/R)
+ if(..())
+ return
+
+ var/obj/item/borg/upgrade/selfrepair/U = locate() in R
+ if(U)
+ to_chat(usr, "This unit is already equipped with a self-repair module.")
+ return 0
+
+ cyborg = R
+ icon_state = "selfrepair_off"
+ action_button_name = "Toggle Self-Repair"
+ return 1
+
+/obj/item/borg/upgrade/selfrepair/Destroy()
+ cyborg = null
+ processing_objects -= src
+ on = 0
+ return ..()
+
+/obj/item/borg/upgrade/selfrepair/ui_action_click()
+ on = !on
+ if(on)
+ to_chat(cyborg, "You activate the self-repair module.")
+ processing_objects |= src
+ else
+ to_chat(cyborg, "You deactivate the self-repair module.")
+ processing_objects -= src
+ update_icon()
+
+/obj/item/borg/upgrade/selfrepair/update_icon()
+ if(cyborg)
+ icon_state = "selfrepair_[on ? "on" : "off"]"
+ else
+ icon_state = "cyborg_upgrade5"
+
+/obj/item/borg/upgrade/selfrepair/proc/deactivate()
+ processing_objects -= src
+ on = 0
+ update_icon()
+
+/obj/item/borg/upgrade/selfrepair/process()
+ if(!repair_tick)
+ repair_tick = 1
+ return
+
+ if(cyborg && (cyborg.stat != DEAD) && on)
+ if(!cyborg.cell)
+ to_chat(cyborg, "Self-repair module deactivated. Please, insert the power cell.")
+ deactivate()
+ return
+
+ if(cyborg.cell.charge < powercost * 2)
+ to_chat(cyborg, "Self-repair module deactivated. Please recharge.")
+ deactivate()
+ return
+
+ if(cyborg.health < cyborg.maxHealth)
+ if(cyborg.health < 0)
+ repair_amount = -2.5
+ powercost = 30
+ else
+ repair_amount = -1
+ powercost = 10
+ cyborg.adjustBruteLoss(repair_amount)
+ cyborg.adjustFireLoss(repair_amount)
+ cyborg.updatehealth()
+ cyborg.cell.use(powercost)
+ else
+ cyborg.cell.use(5)
+ repair_tick = 0
+
+ if((world.time - 2000) > msg_cooldown )
+ var/msgmode = "standby"
+ if(cyborg.health < 0)
+ msgmode = "critical"
+ else if(cyborg.health < cyborg.maxHealth)
+ msgmode = "normal"
+ to_chat(cyborg, "Self-repair is active in [msgmode] mode.")
+ msg_cooldown = world.time
+ else
+ deactivate()
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index cc586d37bb7..b18ff0abea3 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -21,6 +21,7 @@ var/list/robot_verbs_default = list(
var/obj/screen/inv2 = null
var/obj/screen/inv3 = null
var/obj/screen/lamp_button = null
+ var/obj/screen/thruster_button = null
var/shown_robot_modules = 0 //Used to determine whether they have the module menu shown or not
var/obj/screen/robot_modules_background
@@ -57,8 +58,6 @@ var/list/robot_verbs_default = list(
var/viewalerts = 0
var/modtype = "Default"
var/lower_mod = 0
- var/jetpack = 0
- var/datum/effect/system/ion_trail_follow/ion_trail = null
var/datum/effect/system/spark_spread/spark_system//So they can initialize sparks whenever/N
var/jeton = 0
var/low_power_mode = 0 //whether the robot has no charge left.
@@ -81,8 +80,10 @@ var/list/robot_verbs_default = list(
hud_possible = list(SPECIALROLE_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD,NATIONS_HUD)
- var/jetpackoverlay = 0
var/magpulse = 0
+ var/ionpulse = 0 // Jetpack-like effect.
+ var/ionpulse_on = 0 // Jetpack-like effect.
+ var/datum/effect/system/ion_trail_follow/ion_trail // Ionpulse effect.
var/obj/item/borg/sight/hud/sec/sechud = null
var/obj/item/borg/sight/hud/med/healthhud = null
@@ -464,6 +465,35 @@ var/list/robot_verbs_default = list(
src.verbs -= robot_verbs_default
src.verbs -= silicon_subsystems
+/mob/living/silicon/robot/proc/ionpulse()
+ if(!ionpulse_on)
+ return
+
+ if(cell.charge <= 50)
+ toggle_ionpulse()
+ return
+
+ cell.charge -= 50 // 500 steps on a default cell.
+ return 1
+
+/mob/living/silicon/robot/proc/toggle_ionpulse()
+ if(!ionpulse)
+ to_chat(src, "No thrusters are installed!")
+ return
+
+ if(!ion_trail)
+ ion_trail = new
+ ion_trail.set_up(src)
+
+ ionpulse_on = !ionpulse_on
+ to_chat(src, "You [ionpulse_on ? null :"de"]activate your ion thrusters.")
+ if(ionpulse_on)
+ ion_trail.start()
+ else
+ ion_trail.stop()
+ if(thruster_button)
+ thruster_button.icon_state = "ionpulse[ionpulse_on]"
+
/mob/living/silicon/robot/blob_act()
if(stat != 2)
adjustBruteLoss(60)
@@ -488,23 +518,6 @@ var/list/robot_verbs_default = list(
stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]")
return 0
-
-// this function displays jetpack pressure in the stat panel
-/mob/living/silicon/robot/proc/show_jetpack_pressure()
- // if you have a jetpack, show the internal tank pressure
- var/obj/item/weapon/tank/jetpack/current_jetpack = installed_jetpack()
- if(current_jetpack)
- stat("Internal Atmosphere Info", current_jetpack.name)
- stat("Tank Pressure", current_jetpack.air_contents.return_pressure())
-
-
-// this function returns the robots jetpack, if one is installed
-/mob/living/silicon/robot/proc/installed_jetpack()
- if(module)
- return (locate(/obj/item/weapon/tank/jetpack) in module.modules)
- return 0
-
-
// this function displays the cyborgs current cell charge in the stat panel
/mob/living/silicon/robot/proc/show_cell_power()
if(cell)
@@ -519,7 +532,6 @@ var/list/robot_verbs_default = list(
statpanel("Status")
if(client.statpanel == "Status")
show_cell_power()
- show_jetpack_pressure()
/mob/living/silicon/robot/restrained()
return 0
@@ -1022,9 +1034,6 @@ var/list/robot_verbs_default = list(
for(var/obj/item/borg/combat/shield/S in module.modules)
if(activated(S))
overlays += "[base_icon]-shield"
-
- if(jetpackoverlay)
- overlays += "minerjetpack-[icon_state]"
update_fire()
/mob/living/silicon/robot/proc/installed_modules()
@@ -1343,6 +1352,7 @@ var/list/robot_verbs_default = list(
faction = list("nanotrasen")
designation = "Nanotrasen Combat"
req_access = list(access_cent_specops)
+ ionpulse = 1
var/searching_for_ckey = 0
/mob/living/silicon/robot/deathsquad/New(loc)
@@ -1390,6 +1400,7 @@ var/list/robot_verbs_default = list(
designation = "Syndicate Assault"
modtype = "Syndicate"
req_access = list(access_syndicate)
+ ionpulse = 1
lawchannel = "State"
var/playstyle_string = "You are a Syndicate assault cyborg!
\
You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 3eb032726bf..762efbcf02d 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -8,7 +8,6 @@
var/list/modules = list()
var/obj/item/emag = null
- var/obj/item/borg/upgrade/jetpack = null
var/list/subsystems = list()
var/module_type = "NoMod" // For icon usage
@@ -39,8 +38,6 @@
modules.Cut()
qdel(emag)
emag = null
- qdel(jetpack)
- jetpack = null
return ..()
/obj/item/weapon/robot_module/proc/fix_modules()
@@ -316,16 +313,18 @@
module_type = "Miner"
/obj/item/weapon/robot_module/miner/New()
- src.modules += new /obj/item/device/flash/cyborg(src)
- src.modules += new /obj/item/borg/sight/meson(src)
- src.modules += new /obj/item/weapon/wrench(src)
- src.modules += new /obj/item/weapon/screwdriver(src)
- src.modules += new /obj/item/device/t_scanner/adv_mining_scanner/cyborg(src)
- src.modules += new /obj/item/weapon/storage/bag/ore/cyborg(src)
- src.modules += new /obj/item/weapon/pickaxe/drill/cyborg(src)
- src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src)
- src.modules += new /obj/item/weapon/gun/energy/kinetic_accelerator/cyborg(src)
- src.emag = new /obj/item/borg/stun(src)
+ modules += new /obj/item/device/flash/cyborg(src)
+ modules += new /obj/item/borg/sight/meson(src)
+ modules += new /obj/item/weapon/storage/bag/ore/cyborg(src)
+ modules += new /obj/item/weapon/pickaxe/drill/cyborg(src)
+ modules += new /obj/item/weapon/shovel(src)
+ modules += new /obj/item/weapon/weldingtool/mini(src)
+ modules += new /obj/item/weapon/extinguisher/mini(src)
+ modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src)
+ modules += new /obj/item/device/t_scanner/adv_mining_scanner/cyborg(src)
+ modules += new /obj/item/weapon/gun/energy/kinetic_accelerator/cyborg(src)
+ modules += new /obj/item/device/gps/cyborg(src)
+ emag = new /obj/item/borg/stun(src)
fix_modules()
@@ -338,7 +337,6 @@
src.modules += new /obj/item/borg/sight/thermal(src)
src.modules += new /obj/item/weapon/melee/energy/sword/cyborg(src)
src.modules += new /obj/item/weapon/gun/energy/pulse/cyborg(src)
- src.modules += new /obj/item/weapon/tank/jetpack/carbondioxide(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.emag = null
@@ -354,7 +352,6 @@
src.modules += new /obj/item/weapon/gun/energy/printer(src)
src.modules += new /obj/item/weapon/gun/projectile/revolver/grenadelauncher/multi/cyborg(src)
src.modules += new /obj/item/weapon/card/emag(src)
- src.modules += new /obj/item/weapon/tank/jetpack/carbondioxide(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.modules += new /obj/item/weapon/pinpointer/operative(src)
src.emag = null
@@ -393,7 +390,6 @@
src.modules += new /obj/item/weapon/surgicaldrill(src)
src.modules += new /obj/item/weapon/melee/energy/sword/cyborg/saw(src) //Energy saw -- primary weapon
src.modules += new /obj/item/weapon/card/emag(src)
- src.modules += new /obj/item/weapon/tank/jetpack/carbondioxide(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.modules += new /obj/item/weapon/pinpointer/operative(src)
src.emag = null
diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm
index 00ed6522440..ff28a93a64e 100644
--- a/code/modules/mob/living/silicon/robot/robot_movement.dm
+++ b/code/modules/mob/living/silicon/robot/robot_movement.dm
@@ -1,9 +1,8 @@
/mob/living/silicon/robot/Process_Spacemove(var/movement_dir = 0)
- if(module)
- for(var/obj/item/weapon/tank/jetpack/J in module.modules)
- if(J && istype(J, /obj/item/weapon/tank/jetpack))
- if(J.allow_thrust(0.01)) return 1
- if(..()) return 1
+ if(ionpulse())
+ return 1
+ if(..())
+ return 1
return 0
//No longer needed, but I'll leave it here incase we plan to re-use it.
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 33b0d83eee1..3bb94133e16 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -122,6 +122,10 @@
holds_charge = TRUE
unique_frequency = TRUE
+/obj/item/weapon/gun/energy/kinetic_accelerator/hyper/cyborg
+ holds_charge = TRUE
+ unique_frequency = TRUE
+
/obj/item/weapon/gun/energy/kinetic_accelerator/New()
. = ..()
if(!holds_charge)
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index 941083c5da6..8f2b16626d3 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -960,34 +960,13 @@
category = list("Exosuit Equipment")
//Cyborg Upgrade Modules
-/datum/design/borg_syndicate_module
- name = "Borg Illegal Weapons Upgrade"
- desc = "Allows for the construction of illegal upgrades for cyborgs"
- id = "borg_syndicate_module"
- build_type = MECHFAB
- req_tech = list("combat" = 4, "syndicate" = 3)
- build_path = /obj/item/borg/upgrade/syndicate
- materials = list(MAT_METAL=10000,MAT_GLASS=15000,MAT_DIAMOND = 10000)
- construction_time = 120
- category = list("Cyborg Upgrade Modules")
-/datum/design/borg_upgrade_jetpack
- name = "Cyborg Upgrade Module (Mining Jetpack)"
- id = "borg_upgrade_jetpack"
+/datum/design/borg_upgrade_reset
+ name = "Cyborg Upgrade Module (Reset)"
+ id = "borg_upgrade_reset"
build_type = MECHFAB
- build_path = /obj/item/borg/upgrade/jetpack
- req_tech = list("engineering" = 4, "power" = 4)
- materials = list(MAT_METAL=10000, MAT_PLASMA=5000, MAT_URANIUM = 6000)
- construction_time = 120
- category = list("Cyborg Upgrade Modules")
-
-/datum/design/borg_upgrade_disablercooler
- name = "Cyborg Upgrade Module (Rapid Disabler Cooling)"
- id = "borg_upgrade_disablercooler"
- build_type = MECHFAB
- build_path = /obj/item/borg/upgrade/disablercooler
- req_tech = list("combat" = 5, "power" = 4)
- materials = list(MAT_METAL=80000 , MAT_GLASS=6000 , MAT_GOLD= 2000, MAT_DIAMOND = 500)
+ build_path = /obj/item/borg/upgrade/reset
+ materials = list(MAT_METAL=10000)
construction_time = 120
category = list("Cyborg Upgrade Modules")
@@ -1000,15 +979,6 @@
construction_time = 120
category = list("Cyborg Upgrade Modules")
-/datum/design/borg_upgrade_reset
- name = "Cyborg Upgrade Module (Reset)"
- id = "borg_upgrade_reset"
- build_type = MECHFAB
- build_path = /obj/item/borg/upgrade/reset
- materials = list(MAT_METAL=10000)
- construction_time = 120
- category = list("Cyborg Upgrade Modules")
-
/datum/design/borg_upgrade_restart
name = "Cyborg Upgrade Module (Restart)"
id = "borg_upgrade_restart"
@@ -1028,6 +998,26 @@
construction_time = 120
category = list("Cyborg Upgrade Modules")
+/datum/design/borg_upgrade_thrusters
+ name = "Cyborg Upgrade (Ion Thrusters)"
+ id = "borg_upgrade_thrusters"
+ build_type = MECHFAB
+ build_path = /obj/item/borg/upgrade/thrusters
+ req_tech = list("engineering" = 4, "powerstorage" = 4)
+ materials = list(MAT_METAL=10000, MAT_PLASMA=5000, MAT_URANIUM = 6000)
+ construction_time = 120
+ category = list("Cyborg Upgrade Modules")
+
+/datum/design/borg_upgrade_disablercooler
+ name = "Cyborg Upgrade Module (Rapid Disabler Cooling)"
+ id = "borg_upgrade_disablercooler"
+ build_type = MECHFAB
+ build_path = /obj/item/borg/upgrade/disablercooler
+ req_tech = list("combat" = 5, "power" = 4)
+ materials = list(MAT_METAL=80000 , MAT_GLASS=6000 , MAT_GOLD= 2000, MAT_DIAMOND = 500)
+ construction_time = 120
+ category = list("Cyborg Upgrade Modules")
+
/datum/design/borg_upgrade_diamonddrill
name = "Cyborg Upgrade (Diamond Drill)"
id = "borg_upgrade_diamonddrill"
@@ -1048,6 +1038,36 @@
construction_time = 120
category = list("Cyborg Upgrade Modules")
+/datum/design/borg_upgrade_hyperka
+ name = "Cyborg Upgrade (Hyper-Kinetic Accelerator)"
+ id = "borg_upgrade_hyperka"
+ req_tech = list("materials" = 7, "powerstorage" = 5, "engineering" = 5, "magnets" = 5, "combat" = 4)
+ build_type = MECHFAB //Reqs same as human Hyper KA
+ materials = list(MAT_METAL = 8000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_GOLD = 2000, MAT_DIAMOND = 2000)
+ build_path = /obj/item/borg/upgrade/hyperka
+ construction_time = 120
+ category = list("Cyborg Upgrade Modules")
+
+/datum/design/borg_syndicate_module
+ name = "Cyborg Upgrade (Illegal Modules)"
+ id = "borg_syndicate_module"
+ build_type = MECHFAB
+ req_tech = list("combat" = 4, "syndicate" = 3)
+ build_path = /obj/item/borg/upgrade/syndicate
+ materials = list(MAT_METAL=10000,MAT_GLASS=15000,MAT_DIAMOND = 10000)
+ construction_time = 120
+ category = list("Cyborg Upgrade Modules")
+
+/datum/design/borg_upgrade_selfrepair
+ name = "Cyborg Upgrade (Self-repair)"
+ id = "borg_upgrade_selfrepair"
+ build_type = MECHFAB
+ build_path = /obj/item/borg/upgrade/selfrepair
+ req_tech = list("materials" = 4, "engineering" = 4)
+ materials = list(MAT_METAL=15000, MAT_GLASS=15000)
+ construction_time = 120
+ category = list("Cyborg Upgrade Modules")
+
//Misc
/datum/design/mecha_tracking
name = "Exosuit Tracking Beacon"
diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm
index ee698cec30f..34db61ba18b 100644
--- a/code/modules/telesci/gps.dm
+++ b/code/modules/telesci/gps.dm
@@ -79,3 +79,9 @@ var/list/GPS_list = list()
icon_state = "gps-m"
gpstag = "MINE0"
desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life."
+
+/obj/item/device/gps/cyborg
+ icon_state = "gps-b"
+ gpstag = "BORG0"
+ desc = "A mining cyborg internal positioning system. Used as a recovery beacon for damaged cyborg assets, or a collaboration tool for mining teams."
+ flags = NODROP
\ No newline at end of file
diff --git a/icons/mob/screen_robot.dmi b/icons/mob/screen_robot.dmi
index 0128584d284..000317e3f12 100644
Binary files a/icons/mob/screen_robot.dmi and b/icons/mob/screen_robot.dmi differ
diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi
index ffa5d773b97..6d5a5b70d41 100644
Binary files a/icons/obj/module.dmi and b/icons/obj/module.dmi differ
diff --git a/icons/obj/telescience.dmi b/icons/obj/telescience.dmi
index 6b691557229..378da290cb8 100644
Binary files a/icons/obj/telescience.dmi and b/icons/obj/telescience.dmi differ