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