diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm
index 22c43fa5747..38311fa289c 100644
--- a/code/__defines/misc.dm
+++ b/code/__defines/misc.dm
@@ -8,13 +8,15 @@
#define INVISIBILITY_LIGHTING 20
#define INVISIBILITY_LEVEL_ONE 35
#define INVISIBILITY_LEVEL_TWO 45
+#define INVISIBILITY_SHADEKIN 55
#define INVISIBILITY_OBSERVER 60
#define INVISIBILITY_EYE 61
#define SEE_INVISIBLE_LIVING 25
-#define SEE_INVISIBLE_NOLIGHTING 15
+#define SEE_INVISIBLE_NOLIGHTING 15
#define SEE_INVISIBLE_LEVEL_ONE 35
#define SEE_INVISIBLE_LEVEL_TWO 45
+#define SEE_INVISIBILITY_SHADEKIN 55
#define SEE_INVISIBLE_CULT 60
#define SEE_INVISIBLE_OBSERVER 61
diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm
index b8457de50bd..3bb8ebe6b0d 100644
--- a/code/__defines/mobs.dm
+++ b/code/__defines/mobs.dm
@@ -27,6 +27,7 @@
#define BORGTHERM 0x2
#define BORGXRAY 0x4
#define BORGMATERIAL 0x8
+#define BORGANOMALOUS 0x10
#define STANCE_ATTACK 11 // Backwards compatability
#define STANCE_ATTACKING 12 // Ditto
diff --git a/code/__defines/span_vr.dm b/code/__defines/span_vr.dm
index eaf45491cd3..49e4e0ef69d 100644
--- a/code/__defines/span_vr.dm
+++ b/code/__defines/span_vr.dm
@@ -52,6 +52,12 @@
#define span_reflex_shoot(str) ("" + str + "")
+/* Vore messages */
+
+#define span_vdanger(str) ("" + str + "")
+#define span_vwarning(str) ("" + str + "")
+#define span_vnotice(str) ("" + str + "")
+
/* Languages */
#define span_alien(str) ("" + str + "")
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index c7563b4412f..30ff96b052a 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -36,6 +36,8 @@
/obj/item/borg/sight/xray
name = "\proper x-ray vision"
sight_mode = BORGXRAY
+ icon_state = "night"
+ icon = 'icons/inventory/eyes/item.dmi'
/obj/item/borg/sight/thermal
@@ -57,6 +59,12 @@
icon_state = "material"
icon = 'icons/inventory/eyes/item.dmi'
+/obj/item/borg/sight/anomalous
+ name = "\proper anomaly vision"
+ sight_mode = BORGANOMALOUS
+ icon_state = "denight"
+ icon = 'icons/inventory/eyes/item.dmi'
+
/obj/item/borg/sight/hud
name = "hud"
var/obj/item/clothing/glasses/hud/hud = null
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index aba84bf0005..fe41bc658ff 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -18,6 +18,16 @@
return 1
return 0
+/obj/item/borg/upgrade/proc/generic_error(var/mob/living/silicon/robot/R, var/obj/item/borg/type)
+ type = lowertext(initial(type.name))
+ to_chat(R, "Upgrade mounting error! No suitable hardpoint for \the \"[type]\" detected!")
+ to_chat(usr, "There's no mounting point for \the \"[type]\" module!")
+
+/obj/item/borg/upgrade/proc/software_error(var/mob/living/silicon/robot/R, var/obj/item/borg/type)
+ type = lowertext(initial(type.name))
+ to_chat(R, "Upgrade installation error! Incompatibility with \the \"[type]\" detected!")
+ to_chat(usr, "\The \"[type]\" upgrade is not compatibile!")
+
/* ######################################################################################################
# Utility section. All reusable upgrades without lasting effects, like renaming, reset, etc. go here.#
######################################################################################################*/
@@ -252,8 +262,7 @@
if(..()) return 0
if(R.has_advanced_upgrade(type))
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
+ generic_error(R, type)
return 0
R.module.modules += new/obj/item/weapon/tank/jetpack/carbondioxide(R.module)
@@ -272,8 +281,7 @@
if(..()) return 0
if(R.has_advanced_upgrade(type))
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
+ generic_error(R, type)
return 0
R.module.modules += new/obj/item/device/healthanalyzer/advanced(R.module)
@@ -291,8 +299,7 @@
if(..()) return 0
if(R.has_advanced_upgrade(type))
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
+ generic_error(R, type)
return 0
R.module.modules += new/obj/item/weapon/gun/energy/sizegun/mounted(R.module)
@@ -315,8 +322,7 @@
if(..()) return 0
if(!R.supports_upgrade(type))
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
+ generic_error(R, type)
return 0
var/obj/T = R.has_upgrade_module(/obj/item/device/dogborg/sleeper)
@@ -350,8 +356,7 @@
if(..()) return 0
if(!R.supports_upgrade(type))
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
+ generic_error(R, type)
return 0
var/obj/T = R.has_upgrade_module(/obj/item/weapon/gun/energy/taser/mounted/cyborg)
@@ -381,13 +386,11 @@
if(..()) return 0
if(!R.supports_upgrade(type))
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
+ generic_error(R, type)
return 0
if(R.has_restricted_upgrade(type))
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
+ generic_error(R, type)
return 0
R.module.modules += new/obj/item/weapon/storage/part_replacer/adv(R.module)
@@ -406,13 +409,11 @@
if(..()) return 0
if(!R.supports_upgrade(type))
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
+ generic_error(R, type)
return 0
if(R.has_restricted_upgrade(type))
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
+ generic_error(R, type)
return 0
R.module.modules += new/obj/item/weapon/pickaxe/diamonddrill(R.module)
@@ -431,13 +432,11 @@
if(..()) return 0
if(!R.supports_upgrade(type))
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
+ generic_error(R, type)
return 0
if(R.has_restricted_upgrade(type))
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
+ generic_error(R, type)
return 0
R.module.modules += new/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg(R.module)
@@ -462,9 +461,98 @@
if(..()) return 0
if(R.has_no_prod_upgrade(type))
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(usr, "There's no mounting point for the module!")
+ generic_error(R, type)
return 0
R.module.modules += new/obj/item/weapon/gun/projectile/cyborgtoy(R.module)
return 1
+
+/obj/item/borg/upgrade/no_prod/vision_xray
+ name = "Robot x-ray vision module"
+ desc = "Vision alterantion software to add x-ray sight capabilities."
+ icon_state = "cyborg_upgrade5"
+ item_state = "cyborg_upgrade"
+ require_module = 1
+ hidden_from_scan = 1
+
+/obj/item/borg/upgrade/no_prod/vision_xray/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
+ if(R.has_no_prod_upgrade(type))
+ software_error(R, type)
+ return 0
+
+ R.module.modules += new/obj/item/borg/sight/xray(R.module)
+ return 1
+
+/obj/item/borg/upgrade/no_prod/vision_thermal
+ name = "Robot thermal vision module"
+ desc = "Vision alterantion software to add thermal sight capabilities."
+ icon_state = "cyborg_upgrade5"
+ item_state = "cyborg_upgrade"
+ require_module = 1
+ hidden_from_scan = 1
+
+/obj/item/borg/upgrade/no_prod/vision_thermal/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
+ if(R.has_no_prod_upgrade(type))
+ software_error(R, type)
+ return 0
+
+ R.module.modules += new/obj/item/borg/sight/thermal(R.module)
+ return 1
+
+/obj/item/borg/upgrade/no_prod/vision_meson
+ name = "Robot meson vision module"
+ desc = "Vision alterantion software to add meson sight capabilities."
+ icon_state = "cyborg_upgrade5"
+ item_state = "cyborg_upgrade"
+ require_module = 1
+ hidden_from_scan = 1
+
+/obj/item/borg/upgrade/no_prod/vision_meson/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
+ if(R.has_no_prod_upgrade(type))
+ software_error(R, type)
+ return 0
+
+ R.module.modules += new/obj/item/borg/sight/meson(R.module)
+ return 1
+
+/obj/item/borg/upgrade/no_prod/vision_material
+ name = "Robot material vision module"
+ desc = "Vision alterantion software to add material sight capabilities."
+ icon_state = "cyborg_upgrade5"
+ item_state = "cyborg_upgrade"
+ require_module = 1
+ hidden_from_scan = 1
+
+/obj/item/borg/upgrade/no_prod/vision_material/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
+ if(R.has_no_prod_upgrade(type))
+ software_error(R, type)
+ return 0
+
+ R.module.modules += new/obj/item/borg/sight/material(R.module)
+ return 1
+
+/obj/item/borg/upgrade/no_prod/vision_anomalous
+ name = "Robot anomalous vision module"
+ desc = "Vision alterantion software to add anomalous sight capabilities."
+ icon_state = "cyborg_upgrade5"
+ item_state = "cyborg_upgrade"
+ require_module = 1
+ hidden_from_scan = 1
+
+/obj/item/borg/upgrade/no_prod/vision_anomalous/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
+ if(R.has_no_prod_upgrade(type))
+ software_error(R, type)
+ return 0
+
+ R.module.modules += new/obj/item/borg/sight/anomalous(R.module)
+ return 1
diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm
index c2d00548c16..c1439e71fec 100644
--- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm
+++ b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm
@@ -297,7 +297,8 @@
if(src.emagged)
var/mob/living/silicon/robot/R = user
var/mob/living/L = target
- if(R.cell.charge <= 666)
+ if(!R.use_direct_power(666, 100))
+ to_chat(user, span_warning("Warning, low power detected. Aborting action."))
return
L.Stun(1)
L.Weaken(1)
@@ -305,7 +306,6 @@
L.visible_message("[user] has shocked [L] with its tongue!", \
"[user] has shocked you with its tongue! You can feel the betrayal.")
playsound(src, 'sound/weapons/Egloves.ogg', 50, 1, -1)
- R.cell.charge -= 666
else
user.visible_message("\The [user] affectionately licks all over \the [target]'s face!", "You affectionately lick all over \the [target]'s face!")
playsound(src, 'sound/effects/attackblob.ogg', 50, 1)
@@ -406,6 +406,7 @@
desc = "Leap at your target to momentarily stun them."
force = 0
throwforce = 0
+ var/bluespace = FALSE
/obj/item/weapon/dogborg/pounce/New()
..()
@@ -413,14 +414,16 @@
/obj/item/weapon/dogborg/pounce/attack_self(mob/user)
var/mob/living/silicon/robot/R = user
- R.leap()
+ R.leap(bluespace)
-/mob/living/silicon/robot/proc/leap()
+/mob/living/silicon/robot/proc/leap(var/bluespace = FALSE)
if(last_special > world.time)
to_chat(src, "Your leap actuators are still recharging.")
return
- if(cell.charge < 1000)
+ var/power_cost = bluespace ? 1000 : 750
+ var/minimum_power = bluespace ? 2500 : 1000
+ if(cell.charge < minimum_power)
to_chat(src, "Cell charge too low to continue.")
return
@@ -429,7 +432,8 @@
return
var/list/choices = list()
- for(var/mob/living/M in view(3,src))
+ var/leap_distance = bluespace ? 5 : 3
+ for(var/mob/living/M in view(leap_distance,src))
if(!istype(M,/mob/living/silicon))
choices += M
choices -= src
@@ -438,7 +442,16 @@
if(!T || !src || src.stat) return
- if(get_dist(get_turf(T), get_turf(src)) > 3) return
+ if(get_dist(get_turf(T), get_turf(src)) > leap_distance) return
+
+ if(ishuman(T))
+ var/mob/living/carbon/human/H = T
+ if(H.get_species() == SPECIES_SHADEKIN && (H.ability_flags & AB_PHASE_SHIFTED))
+ power_cost *= 2
+
+ if(!use_direct_power(power_cost, minimum_power - power_cost))
+ to_chat(src, span_warning("Warning, low power detected. Aborting action."))
+ return
if(last_special > world.time)
return
@@ -452,12 +465,16 @@
pixel_y = pixel_y + 10
src.visible_message("\The [src] leaps at [T]!")
- src.throw_at(get_step(get_turf(T),get_turf(src)), 4, 1, src)
+ if(bluespace)
+ src.forceMove(get_turf(T))
+ T.hitby(src)
+ else
+ src.throw_at(get_step(get_turf(T),get_turf(src)), 4, 1, src)
playsound(src, 'sound/mecha/mechstep2.ogg', 50, 1)
pixel_y = default_pixel_y
- cell.charge -= 750
- sleep(5)
+ if(!bluespace)
+ sleep(5)
if(status_flags & LEAPING) status_flags &= ~LEAPING
@@ -470,6 +487,7 @@
if(H.species.lightweight == 1)
H.Weaken(3)
return
+
var/armor_block = run_armor_check(T, "melee")
var/armor_soak = get_armor_soak(T, "melee")
T.apply_damage(20, HALLOSS,, armor_block, armor_soak)
diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm
index de42bb8d171..98e91cdcdd9 100644
--- a/code/modules/mob/living/silicon/robot/inventory.dm
+++ b/code/modules/mob/living/silicon/robot/inventory.dm
@@ -51,6 +51,7 @@
module_state_3:loc = module
module_state_3 = null
inv3.icon_state = "inv3"
+ after_equip()
update_icon()
hud_used.update_robot_modules_display()
@@ -84,6 +85,7 @@
module_state_3:loc = module
module_state_3 = null
inv3.icon_state = "inv3"
+ after_equip()
update_icon()
/mob/living/silicon/robot/proc/activated(obj/item/O)
@@ -252,6 +254,23 @@
sight_mode |= module_state_3:sight_mode
else
to_chat(src, "You need to disable a module first!")
+ return
+ after_equip()
+
+/mob/living/silicon/robot/proc/after_equip()
+ if(sight_mode & BORGANOMALOUS)
+ var/obj/item/weapon/dogborg/pounce/pounce = has_upgrade_module(/obj/item/weapon/dogborg/pounce)
+ if(pounce)
+ pounce.name = "bluespace pounce"
+ pounce.icon_state = "bluespace_pounce"
+ pounce.bluespace = TRUE
+ else
+ var/obj/item/weapon/dogborg/pounce/pounce = has_upgrade_module(/obj/item/weapon/dogborg/pounce)
+ if(pounce)
+ pounce.name = initial(pounce.name)
+ pounce.icon_state = initial(pounce.icon_state)
+ pounce.desc = initial(pounce.desc)
+ pounce.bluespace = initial(pounce.bluespace)
/mob/living/silicon/robot/put_in_hands(var/obj/item/W) // No hands.
W.loc = get_turf(src)
@@ -271,4 +290,4 @@
if(module_state_2)
. += module_state_2
if(module_state_3)
- . += module_state_3
\ No newline at end of file
+ . += module_state_3
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index e69de8b3fdf..7bc8c4f7a2d 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -188,6 +188,10 @@
src.see_in_dark = 8
src.see_invisible = SEE_INVISIBLE_LEVEL_TWO
fullbright = TRUE
+ else if (src.sight_mode & BORGANOMALOUS)
+ src.see_in_dark = 8
+ src.see_invisible = INVISIBILITY_SHADEKIN
+ fullbright = TRUE
else if (!seedarkness)
src.sight &= ~SEE_MOBS
src.sight &= ~SEE_TURFS
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 284331ce8cb..16615288388 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -1304,6 +1304,20 @@
return 1
return 0
+// Function to directly drain power from the robot's cell, allows to set a minimum level beneath which
+// abilities can no longer be used
+/mob/living/silicon/robot/proc/use_direct_power(var/amount = 0, var/lower_limit = 0)
+ // No cell inserted
+ if(!cell)
+ return FALSE
+
+ // Power cell does not have sufficient charge to remain above the power limit.
+ if(cell.charge - (amount + lower_limit) <= 0)
+ return FALSE
+
+ cell.charge -= amount
+ return TRUE
+
/mob/living/silicon/robot/binarycheck()
if(get_restraining_bolt())
return FALSE
@@ -1444,7 +1458,7 @@
G.drop_item_nm()
/mob/living/silicon/robot/disable_spoiler_vision()
- if(sight_mode & (BORGMESON|BORGMATERIAL|BORGXRAY)) // Whyyyyyyyy have seperate defines.
+ if(sight_mode & (BORGMESON|BORGMATERIAL|BORGXRAY|BORGANOMALOUS)) // Whyyyyyyyy have seperate defines.
var/i = 0
// Borg inventory code is very . . interesting and as such, unequiping a specific item requires jumping through some (for) loops.
var/current_selection_index = get_selected_module() // Will be 0 if nothing is selected.
@@ -1452,7 +1466,7 @@
i++
if(istype(thing, /obj/item/borg/sight))
var/obj/item/borg/sight/S = thing
- if(S.sight_mode & (BORGMESON|BORGMATERIAL|BORGXRAY))
+ if(S.sight_mode & (BORGMESON|BORGMATERIAL|BORGXRAY|BORGANOMALOUS))
select_module(i)
uneq_active()
@@ -1558,6 +1572,16 @@
/mob/living/silicon/robot/proc/has_no_prod_upgrade(var/given_type)
if(given_type == /obj/item/borg/upgrade/no_prod/toygun)
return has_upgrade_module(/obj/item/weapon/gun/projectile/cyborgtoy)
+ if(given_type == /obj/item/borg/upgrade/no_prod/vision_xray)
+ return has_upgrade_module(/obj/item/borg/sight/xray)
+ if(given_type == /obj/item/borg/upgrade/no_prod/vision_thermal)
+ return has_upgrade_module(/obj/item/borg/sight/thermal)
+ if(given_type == /obj/item/borg/upgrade/no_prod/vision_meson)
+ return has_upgrade_module(/obj/item/borg/sight/meson)
+ if(given_type == /obj/item/borg/upgrade/no_prod/vision_material)
+ return has_upgrade_module(/obj/item/borg/sight/material)
+ if(given_type == /obj/item/borg/upgrade/no_prod/vision_anomalous)
+ return has_upgrade_module(/obj/item/borg/sight/anomalous)
return null
/mob/living/silicon/robot/proc/has_upgrade(var/given_type)
diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm
index 749a5d2c5d0..89d4a69c708 100644
--- a/code/modules/mob/living/silicon/robot/robot_damage.dm
+++ b/code/modules/mob/living/silicon/robot/robot_damage.dm
@@ -76,9 +76,7 @@
var/absorb_burn = burn*shield.shield_level
var/cost = (absorb_brute+absorb_burn) * 25
- cell.charge -= cost
- if(cell.charge <= 0)
- cell.charge = 0
+ if(!use_direct_power(cost, 200))
to_chat(src, "[span_red("Your shield has overloaded!")]")
else
brute -= absorb_brute
@@ -123,9 +121,7 @@
var/absorb_burn = burn*shield.shield_level
var/cost = (absorb_brute+absorb_burn) * 25
- cell.charge -= cost
- if(cell.charge <= 0)
- cell.charge = 0
+ if(!use_direct_power(cost, 200))
to_chat(src, "[span_red("Your shield has overloaded!")]")
else
brute -= absorb_brute
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index a27d6b396e0..f8990712473 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1175,7 +1175,7 @@
if(client)
if(a_intent == I_HELP || client.prefs.throwmode_loud)
src.visible_message("[src] relaxes from their ready stance.","You relax from your ready stance.")
- if(src.throw_icon) //in case we don't have the HUD and we use the hotkey
+ if(src.throw_icon && !issilicon(src)) //in case we don't have the HUD and we use the hotkey. Silicon use this for something else. Do not overwrite their HUD icon
src.throw_icon.icon_state = "act_throw_off"
/mob/proc/throw_mode_on()
@@ -1186,7 +1186,7 @@
src.visible_message("[src] winds up to throw [get_active_hand()]!","You wind up to throw [get_active_hand()].")
else
src.visible_message("[src] looks ready to catch anything thrown at them!","You get ready to catch anything thrown at you.")
- if(src.throw_icon)
+ if(src.throw_icon && !issilicon(src)) // Silicon use this for something else. Do not overwrite their HUD icon
src.throw_icon.icon_state = "act_throw_on"
/mob/proc/isSynthetic()
diff --git a/code/modules/projectiles/guns/launcher/confetti.dm b/code/modules/projectiles/guns/launcher/confetti.dm
index a6924b34347..f6cffa45cb0 100644
--- a/code/modules/projectiles/guns/launcher/confetti.dm
+++ b/code/modules/projectiles/guns/launcher/confetti.dm
@@ -76,26 +76,22 @@
var/choice = tgui_alert(usr, "Load the Party Canon with?", "Change What?", list("Confetti","Banana Peel","Cream Pie"))
if(!choice)
return
+ if(istype(usr,/mob/living/silicon/robot))
+ var/mob/living/silicon/robot/R = usr
+ if(!R.use_direct_power(200, 400))
+ to_chat(R, span_warning("Warning, low power detected. Aborting action."))
+ return
playsound(src, 'sound/effects/pop.ogg', 50, 0)
switch(choice)
if("Confetti")
chambered = new /obj/item/weapon/grenade/confetti/party_ball
to_chat(usr, span_blue("Confetti loaded."))
- if(istype(usr,/mob/living/silicon/robot))
- var/mob/living/silicon/robot/R = usr
- R.cell.charge -= 200
if("Banana Peel")
chambered = new /obj/item/weapon/bananapeel
to_chat(usr, span_blue("Banana peel loaded."))
- if(istype(usr,/mob/living/silicon/robot))
- var/mob/living/silicon/robot/R = usr
- R.cell.charge -= 200
if("Cream Pie")
chambered = new /obj/item/weapon/reagent_containers/food/snacks/pie
to_chat(usr, span_blue("Banana cream pie loaded."))
- if(istype(usr,/mob/living/silicon/robot))
- var/mob/living/silicon/robot/R = usr
- R.cell.charge -= 200
else
to_chat(usr, span_red("The [src] is already loaded!"))
diff --git a/code/modules/research/prosfab_designs.dm b/code/modules/research/prosfab_designs.dm
index e168af2b23c..0a725814d8d 100644
--- a/code/modules/research/prosfab_designs.dm
+++ b/code/modules/research/prosfab_designs.dm
@@ -520,6 +520,31 @@
id = "borg_hound_cyborg_blaster"
build_path = /obj/item/borg/upgrade/no_prod/toygun
+/datum/design/item/prosfab/robot_upgrade/no_prod/vision_xray
+ name = "X-ray vision"
+ id = "borg_hound_vision_xray"
+ build_path = /obj/item/borg/upgrade/no_prod/vision_xray
+
+/datum/design/item/prosfab/robot_upgrade/no_prod/vision_thermal
+ name = "Thermal vision"
+ id = "borg_hound_vision_thermal"
+ build_path = /obj/item/borg/upgrade/no_prod/vision_thermal
+
+/datum/design/item/prosfab/robot_upgrade/no_prod/vision_meson
+ name = "Meson vision"
+ id = "borg_hound_vision_meson"
+ build_path = /obj/item/borg/upgrade/no_prod/vision_meson
+
+/datum/design/item/prosfab/robot_upgrade/no_prod/vision_material
+ name = "Material vision"
+ id = "borg_hound_vision_material"
+ build_path = /obj/item/borg/upgrade/no_prod/vision_material
+
+/datum/design/item/prosfab/robot_upgrade/no_prod/vision_anomalous
+ name = "Anomalous vision"
+ id = "borg_hound_vision_anomalous"
+ build_path = /obj/item/borg/upgrade/no_prod/vision_anomalous
+
// Synthmorph Bags.
/datum/design/item/prosfab/synthmorphbag
diff --git a/icons/mob/dogborg_vr.dmi b/icons/mob/dogborg_vr.dmi
index f6c27374d43..d19ff1c7c8f 100644
Binary files a/icons/mob/dogborg_vr.dmi and b/icons/mob/dogborg_vr.dmi differ