diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm
index 193306b057..cd481ef19f 100644
--- a/code/_helpers/global_lists.dm
+++ b/code/_helpers/global_lists.dm
@@ -62,7 +62,7 @@ GLOBAL_LIST_EMPTY(ear_styles_list) // Stores /datum/sprite_accessory/ears indexe
GLOBAL_LIST_EMPTY(tail_styles_list) // Stores /datum/sprite_accessory/tail indexed by type
GLOBAL_LIST_EMPTY(wing_styles_list) // Stores /datum/sprite_accessory/wing indexed by type
-GLOBAL_LIST_INIT(custom_species_bases, new) // Species that can be used for a Custom Species icon base
+GLOBAL_LIST_EMPTY(custom_species_bases) // Species that can be used for a Custom Species icon base
//Customizables
GLOBAL_LIST_INIT(headsetlist, list("Standard","Bowman","Earbud"))
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index b32708f45d..fef15310ac 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -20,13 +20,13 @@
/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!")
+ to_chat(R, span_warning("Upgrade mounting error! No suitable hardpoint for \the \"[type]\" detected!"))
+ to_chat(usr, span_warning("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!")
+ to_chat(R, span_warning("Upgrade installation error! Incompatibility with \the \"[type]\" detected!"))
+ to_chat(usr, span_warning("\The \"[type]\" upgrade is not compatibile!"))
/* ######################################################################################################
# Utility section. All reusable upgrades without lasting effects, like renaming, reset, etc. go here.#
@@ -85,7 +85,7 @@
return 0
if(R.health < 0)
- to_chat(usr, "You have to repair the robot before using this module!")
+ to_chat(usr, span_warning("You have to repair the robot before using this module!"))
return 0
if(!R.key)
@@ -118,13 +118,14 @@
if(..()) return 0
if(R.has_basic_upgrade(type))
- to_chat(R, "Actuator already running on overdrive mode!")
- to_chat(usr, "It'd be unwise to plug another vtec module in!")
+ to_chat(R,span_warning("Actuator already running on overdrive mode!"))
+ to_chat(usr, span_warning("It'd be unwise to plug another vtec module in!"))
return 0
add_verb(R, /mob/living/silicon/robot/proc/toggle_vtec)
R.vtec_active = TRUE
R.hud_used.toggle_vtec_control()
+ to_chat(R, span_notice("Actuator overdrive enabled!"))
return 1
/obj/item/borg/upgrade/basic/sizeshift
@@ -138,11 +139,12 @@
if(..()) return 0
if(R.has_basic_upgrade(type))
- to_chat(R, "Size alteration module already applied!")
- to_chat(usr, "There's no space for another size alteration module!")
+ to_chat(R, span_warning("Size alteration module already applied!"))
+ to_chat(usr, span_warning("There's no space for another size alteration module!"))
return 0
add_verb(R, /mob/living/proc/set_size)
+ to_chat(R, span_notice("Size adjustments active!"))
return 1
/obj/item/borg/upgrade/basic/syndicate
@@ -156,8 +158,8 @@
if(..()) return 0
if(R.has_basic_upgrade(type))
- to_chat(R, "Secret modules already unlocked!")
- to_chat(usr, "Plugging another scambled module would be useless!")
+ to_chat(R, span_warning("Secret modules already unlocked!"))
+ to_chat(usr, span_warning("Plugging another scambled module would be useless!"))
return 0
R.emag_items = 1
@@ -174,8 +176,8 @@
if(..()) return 0
if(R.has_basic_upgrade(type))
- to_chat(R, "All possible languages already uploaded!")
- to_chat(usr, "The language database is up to date!")
+ to_chat(R, span_warning("All possible languages already uploaded!"))
+ to_chat(usr, span_warning("The language database is up to date!"))
return 0
R.add_language(LANGUAGE_SOL_COMMON, 1)
@@ -219,6 +221,7 @@
R.add_language(LANGUAGE_SHADEKIN, 1)
*/
+ to_chat(R, span_notice("Language database updated!"))
return 1
/* ###########################################################################
@@ -244,15 +247,15 @@
return 0
if(R.has_advanced_upgrade(type))
- to_chat(R, "Maximum capacity achieved for this hardpoint!")
- to_chat(usr, "There's no room for another capacity upgrade!")
+ to_chat(R, span_warning("Maximum capacity achieved for this hardpoint!"))
+ to_chat(usr, span_warning("There's no room for another capacity upgrade!"))
return 0
var/obj/item/dogborg/sleeper/B = T
var/X = B.max_item_count*2
B.max_item_count = X //I couldn't do T = maxitem*2 for some reason.
- to_chat(R, "Internal capacity doubled.")
- to_chat(usr, "Internal capacity doubled.")
+ to_chat(R, span_notice("Internal capacity doubled."))
+ to_chat(usr, span_notice("Internal capacity doubled."))
B.upgraded_capacity = TRUE
return 1
@@ -290,6 +293,7 @@
return 0
R.module.modules += new/obj/item/healthanalyzer/advanced(R.module)
+ to_chat(R, span_notice("Advanced health analyzer initialized!"))
return 1
//Robot size gun
@@ -336,15 +340,15 @@
return 0
if(R.has_restricted_upgrade(type))
- to_chat(R, "Maximum capability achieved for this hardpoint!")
- to_chat(usr, "There's no room for another capability upgrade!")
+ to_chat(R, span_warning("Maximum capability achieved for this hardpoint!"))
+ to_chat(usr, span_warning("There's no room for another capability upgrade!"))
return 0
var/obj/item/dogborg/sleeper/B = T
var/X = B.max_item_count*2 //double the capacity from 1 to 2 to allow sleepers to store some items, at most 4 with both upgrades
B.max_item_count = X //I couldn't do T = maxitem*2 for some reason.
- to_chat(R, "Internal capability upgraded.")
- to_chat(usr, "Internal capability upgraded.")
+ to_chat(R, span_notice("Internal capability upgraded."))
+ to_chat(usr, span_notice("Internal capability upgraded."))
B.compactor = TRUE
return 1
@@ -370,12 +374,13 @@
return 0
if(R.has_restricted_upgrade(type))
- to_chat(R, "Maximum cooling achieved for this hardpoint!")
- to_chat(usr, "There's no room for another cooling unit!")
+ to_chat(R, span_warning("Maximum cooling achieved for this hardpoint!"))
+ to_chat(usr, span_warning("There's no room for another cooling unit!"))
return 0
var/obj/item/gun/energy/robotic/taser/B = T
B.recharge_time = max(2 , B.recharge_time - 4)
+ to_chat(R, span_notice("Taser cooling upgraded!"))
return 1
//Advanced RPED
@@ -447,6 +452,36 @@
R.module.modules += new/obj/item/gun/energy/kinetic_accelerator/cyborg(R.module)
return 1
+/obj/item/borg/upgrade/restricted/adv_scanner
+ name = "robotic Ore Scanning Upgrade Module"
+ desc = "Used to improve the integrated robot scanning module, allowing for larger more fine-tuned scan ranges."
+ icon_state = "cyborg_upgrade3"
+ item_state = "cyborg_upgrade"
+ module_flags = BORG_MODULE_MINER
+ require_module = 1
+
+/obj/item/borg/upgrade/restricted/adv_scanner/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
+ if(!R.supports_upgrade(type))
+ generic_error(R, type)
+ return 0
+
+ var/obj/target_module = R.has_upgrade_module(/obj/item/mining_scanner/robot)
+ if(!target_module)
+ to_chat(usr, span_warning("This robot has had its scanner removed!"))
+ return 0
+
+ if(R.has_restricted_upgrade(type))
+ to_chat(R, span_warning("Scanner was already upgraded!"))
+ to_chat(usr, span_warning("There's no room for another scanning upgrade!"))
+ return 0
+
+ var/obj/item/mining_scanner/robot/robot_scanner = target_module
+ robot_scanner.upgrade()
+ to_chat(R, span_notice("Mining scanner upgraded!"))
+ return 1
+
/* ###############################################
# Unsorted section. All cargo modules go here.#
###############################################*/
diff --git a/code/modules/client/preference_setup/loadout/gear_tweaks.dm b/code/modules/client/preference_setup/loadout/gear_tweaks.dm
index 9463ed73ba..7d10a0784f 100644
--- a/code/modules/client/preference_setup/loadout/gear_tweaks.dm
+++ b/code/modules/client/preference_setup/loadout/gear_tweaks.dm
@@ -27,7 +27,7 @@
..()
/datum/gear_tweak/color/get_contents(var/metadata)
- return "Color: ⚫"
+ return "Color: ⬤"
/datum/gear_tweak/color/get_default()
return valid_colors ? valid_colors[1] : COLOR_GRAY
diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules.dm
index 268fbdde19..2f90ce85b6 100644
--- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules.dm
+++ b/code/modules/mob/living/silicon/robot/dogborg/dog_modules.dm
@@ -440,27 +440,13 @@
/obj/item/mining_scanner/robot
name = "integrated deep scan device"
- description_info = "This scanner can be upgraded for mining points."
- var/upgrade_cost = 2500
-
-/obj/item/mining_scanner/robot/attackby(obj/item/O, mob/user)
- if(exact)
- return
- if(!istype(O, /obj/item/card/id/cargo/miner/borg))
- return
- if(!(user == loc || user == loc.loc))
- return
- var/obj/item/card/id/cargo/miner/borg/id = O
- if(!id.adjust_mining_points(-upgrade_cost))
- return
- upgrade(user)
+ description_info = "A basic, integrated ore scanning device which can be upgraded."
/obj/item/mining_scanner/robot/proc/upgrade(mob/user)
desc = "An advanced device used to locate ore deep underground."
description_info = "This scanner has variable range, you can use the Set Scanner Range verb, or alt+click the device. Drills dig in 5x5."
scan_time = 0.5 SECONDS
exact = TRUE
- to_chat(user, span_notice("You've upgraded the mining scanner for [upgrade_cost] points."))
/obj/item/mining_scanner/robot/click_alt(mob/user)
change_size(user)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index f2d01df56e..998196797d 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -1570,6 +1570,14 @@
return "" // Return this to have the analyzer show an error if the module is missing. FALSE / NULL are used for missing upgrades themselves
else
return FALSE
+ if(given_type == /obj/item/borg/upgrade/restricted/adv_scanner)
+ var/obj/item/mining_scanner/robot/robot_scanner = has_upgrade_module(/obj/item/mining_scanner/robot)
+ if(robot_scanner && robot_scanner.exact)
+ return robot_scanner
+ else if(!robot_scanner)
+ return "" // Return this to have the analyzer show an error if the module is missing. FALSE / NULL are used for missing upgrades themselves
+ else
+ return FALSE
if(given_type == /obj/item/borg/upgrade/restricted/advrped)
return has_upgrade_module(/obj/item/storage/part_replacer/adv)
if(given_type == /obj/item/borg/upgrade/restricted/diamonddrill)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm
index 85cb519cd3..907e180e0d 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm
@@ -622,7 +622,7 @@
name = "miner robot module"
channels = list(CHANNEL_SUPPLY = 1)
networks = list(NETWORK_MINE)
- supported_upgrades = list(/obj/item/borg/upgrade/restricted/pka, /obj/item/borg/upgrade/restricted/diamonddrill)
+ supported_upgrades = list(/obj/item/borg/upgrade/restricted/pka, /obj/item/borg/upgrade/restricted/diamonddrill, /obj/item/borg/upgrade/restricted/adv_scanner)
pto_type = PTO_CARGO
/obj/item/robot_module/robot/miner/create_equipment(var/mob/living/silicon/robot/robot)
diff --git a/code/modules/research/tg/designs/prosfab_designs.dm b/code/modules/research/tg/designs/prosfab_designs.dm
index 72c1c9d843..679dcf6248 100644
--- a/code/modules/research/tg/designs/prosfab_designs.dm
+++ b/code/modules/research/tg/designs/prosfab_designs.dm
@@ -477,6 +477,17 @@
materials = list(MAT_PLASTEEL = 5000, MAT_GLASS = 1000, MAT_URANIUM = 500, MAT_PLATINUM = 350)
build_path = /obj/item/borg/upgrade/restricted/pka
+/datum/design_techweb/prosfab/robot_upgrade/restricted/adv_scanner
+ category = list(
+ RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_RESTRICTED + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_MINING
+ )
+ name = "Ore Scanning Upgrade"
+ desc = "An upgrade module to improve the potency of the integrated ore scanner."
+ id = "borg_adv_scanner_module"
+ // req_tech = list(TECH_ENGINEERING = 6, TECH_MATERIAL = 5, TECH_POWER = 4)
+ materials = list(MAT_STEEL = 6000, MAT_GLASS = 4000, MAT_GOLD = 2000, MAT_VERDANTIUM = 1500, MAT_DIAMOND = 350)
+ build_path = /obj/item/borg/upgrade/restricted/adv_scanner
+
/datum/design_techweb/prosfab/robot_upgrade/restricted/tasercooler
category = list(
RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_RESTRICTED + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_SECURITY
diff --git a/code/modules/research/tg/techwebs/nodes/mining_nodes.dm b/code/modules/research/tg/techwebs/nodes/mining_nodes.dm
index 5091f8b86d..d6c9abab28 100644
--- a/code/modules/research/tg/techwebs/nodes/mining_nodes.dm
+++ b/code/modules/research/tg/techwebs/nodes/mining_nodes.dm
@@ -65,6 +65,7 @@
design_ids = list(
"borg_pka_module",
"pka_mineaoe",
+ "borg_adv_scanner_module",
// "damagemod",
// "cooldownmod",
// "triggermod",
diff --git a/tgui/packages/tgui/interfaces/Changelog/index.tsx b/tgui/packages/tgui/interfaces/Changelog/index.tsx
index 302e656fe0..88ea607c76 100644
--- a/tgui/packages/tgui/interfaces/Changelog/index.tsx
+++ b/tgui/packages/tgui/interfaces/Changelog/index.tsx
@@ -5,6 +5,7 @@ import { resolveAsset } from 'tgui/assets';
import { useBackend } from 'tgui/backend';
import { Window } from 'tgui/layouts';
import { Stack } from 'tgui-core/components';
+import { fetchRetry } from 'tgui-core/http';
import { Changes } from './Changes';
import { DateDropdown } from './DateDropdown';
import { Footer } from './Resources/Footer';
@@ -38,7 +39,7 @@ export const Changelog = (props) => {
act('get_month', { date });
- fetch(resolveAsset(`${date}.yml`)).then(async (changelogData) => {
+ fetchRetry(resolveAsset(`${date}.yml`)).then(async (changelogData) => {
const result = await changelogData.text();
const errorRegex = /^Cannot find/;