diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm
index 6222adea935..1500ebb504f 100644
--- a/code/__defines/subsystems.dm
+++ b/code/__defines/subsystems.dm
@@ -52,43 +52,44 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
// Subsystem init_order, from highest priority to lowest priority
// Subsystems shutdown in the reverse of the order they initialize in
// The numbers just define the ordering, they are meaningless otherwise.
-#define INIT_ORDER_WEBHOOKS 50
-#define INIT_ORDER_SQLITE 40
-#define INIT_ORDER_GARBAGE 39
-#define INIT_ORDER_MEDIA_TRACKS 38 // Gotta get that lobby music up, yo
-#define INIT_ORDER_INPUT 37
-#define INIT_ORDER_CHEMISTRY 35
-#define INIT_ORDER_VIS 32
-#define INIT_ORDER_MAPPING 25
-#define INIT_ORDER_SOUNDS 23
-#define INIT_ORDER_INSTRUMENTS 22
-#define INIT_ORDER_DECALS 20
-#define INIT_ORDER_PLANTS 19 // Must initialize before atoms.
-#define INIT_ORDER_PLANETS 18
-#define INIT_ORDER_JOB 17
-#define INIT_ORDER_ALARM 16 // Must initialize before atoms.
-#define INIT_ORDER_TRANSCORE 15 // VOREStation Edit
-#define INIT_ORDER_ATOMS 14 // VOREStation Edit
-#define INIT_ORDER_MACHINES 10
-#define INIT_ORDER_SHUTTLES 3
-#define INIT_ORDER_TIMER 1
-#define INIT_ORDER_DEFAULT 0
-#define INIT_ORDER_LIGHTING 0
-#define INIT_ORDER_AIR -1
-#define INIT_ORDER_ASSETS -3
-#define INIT_ORDER_HOLOMAPS -5
-#define INIT_ORDER_NIGHTSHIFT -6
-#define INIT_ORDER_OVERLAY -7
-#define INIT_ORDER_XENOARCH -20
-#define INIT_ORDER_CIRCUIT -21
-#define INIT_ORDER_AI -22
-#define INIT_ORDER_AI_FAST -23
-#define INIT_ORDER_GAME_MASTER -24
-#define INIT_ORDER_PERSISTENCE -25
-#define INIT_ORDER_SKYBOX -30 //Visual only, irrelevant to gameplay, but needs to be late enough to have overmap populated fully
-#define INIT_ORDER_TICKER -50
-#define INIT_ORDER_MAPRENAME -60 //Initiating after Ticker to ensure everything is loaded and everything we rely on us working
-#define INIT_ORDER_CHAT -100 //Should be last to ensure chat remains smooth during init.
+#define INIT_ORDER_WEBHOOKS 50
+#define INIT_ORDER_SQLITE 40
+#define INIT_ORDER_GARBAGE 39
+#define INIT_ORDER_MEDIA_TRACKS 38 // Gotta get that lobby music up, yo
+#define INIT_ORDER_INPUT 37
+#define INIT_ORDER_CHEMISTRY 35
+#define INIT_ORDER_ROBOT_SPRITES 34
+#define INIT_ORDER_VIS 32
+#define INIT_ORDER_MAPPING 25
+#define INIT_ORDER_SOUNDS 23
+#define INIT_ORDER_INSTRUMENTS 22
+#define INIT_ORDER_DECALS 20
+#define INIT_ORDER_PLANTS 19 // Must initialize before atoms.
+#define INIT_ORDER_PLANETS 18
+#define INIT_ORDER_JOB 17
+#define INIT_ORDER_ALARM 16 // Must initialize before atoms.
+#define INIT_ORDER_TRANSCORE 15
+#define INIT_ORDER_ATOMS 14
+#define INIT_ORDER_MACHINES 10
+#define INIT_ORDER_SHUTTLES 3
+#define INIT_ORDER_TIMER 1
+#define INIT_ORDER_DEFAULT 0
+#define INIT_ORDER_LIGHTING 0
+#define INIT_ORDER_AIR -1
+#define INIT_ORDER_ASSETS -3
+#define INIT_ORDER_HOLOMAPS -5
+#define INIT_ORDER_NIGHTSHIFT -6
+#define INIT_ORDER_OVERLAY -7
+#define INIT_ORDER_XENOARCH -20
+#define INIT_ORDER_CIRCUIT -21
+#define INIT_ORDER_AI -22
+#define INIT_ORDER_AI_FAST -23
+#define INIT_ORDER_GAME_MASTER -24
+#define INIT_ORDER_PERSISTENCE -25
+#define INIT_ORDER_SKYBOX -30 //Visual only, irrelevant to gameplay, but needs to be late enough to have overmap populated fully
+#define INIT_ORDER_TICKER -50
+#define INIT_ORDER_MAPRENAME -60 //Initiating after Ticker to ensure everything is loaded and everything we rely on us working
+#define INIT_ORDER_CHAT -100 //Should be last to ensure chat remains smooth during init.
diff --git a/code/controllers/subsystems/robot_sprites.dm b/code/controllers/subsystems/robot_sprites.dm
new file mode 100644
index 00000000000..46489110467
--- /dev/null
+++ b/code/controllers/subsystems/robot_sprites.dm
@@ -0,0 +1,103 @@
+#define DEFAULT_ROBOT_SPRITE_NAME "M-USE NanoTrasen"
+
+SUBSYSTEM_DEF(robot_sprites)
+ name = "Robot Sprites"
+ init_order = INIT_ORDER_ROBOT_SPRITES
+ flags = SS_NO_FIRE
+ var/list/all_cyborg_sprites = list()
+ var/list/cyborg_sprites_by_module = list()
+ var/list/whitelisted_sprites_by_module = list()
+
+/datum/controller/subsystem/robot_sprites/Initialize()
+ initialize_borg_sprites()
+ ..()
+
+/datum/controller/subsystem/robot_sprites/proc/initialize_borg_sprites()
+
+ var/list/all_paths = typesof(/datum/robot_sprite)
+
+ //Let's sort this a little
+ var/list/dogborg_paths = typesof(/datum/robot_sprite/dogborg)
+ var/list/tallborg_paths = typesof(/datum/robot_sprite/dogborg/tall)
+ all_paths -= dogborg_paths
+ dogborg_paths -= tallborg_paths
+ all_paths |= dogborg_paths
+ all_paths |= tallborg_paths
+
+
+ for(var/spath in all_paths)
+ var/datum/robot_sprite/RS = new spath()
+
+ if(!(RS.name) || !(RS.module_type)) // We're a technical kinda datum
+ qdel(RS)
+ continue
+
+ all_cyborg_sprites |= src
+
+ if(islist(RS.module_type))
+ for(var/M in RS.module_type)
+ if(RS.is_whitelisted)
+ if(!(M in whitelisted_sprites_by_module))
+ whitelisted_sprites_by_module += M
+ whitelisted_sprites_by_module[M] = list()
+ whitelisted_sprites_by_module[M] |= RS
+ else
+ if(!(M in cyborg_sprites_by_module))
+ cyborg_sprites_by_module += M
+ cyborg_sprites_by_module[M] = list()
+ cyborg_sprites_by_module[M] |= RS
+ else
+ if(!(RS.module_type in cyborg_sprites_by_module))
+ cyborg_sprites_by_module += RS.module_type
+ cyborg_sprites_by_module[RS.module_type] = list()
+ cyborg_sprites_by_module[RS.module_type] |= RS
+
+/datum/controller/subsystem/robot_sprites/proc/get_module_sprites(var/module)
+ . = list()
+
+ if(!module || !(module in cyborg_sprites_by_module))
+ return
+
+ . |= cyborg_sprites_by_module[module]
+
+ return
+
+/datum/controller/subsystem/robot_sprites/proc/get_module_sprites_len(var/module)
+ if(!module || !(module in cyborg_sprites_by_module))
+ return 0
+
+ var/list/sprite_list = cyborg_sprites_by_module[module]
+
+ if(!islist(sprite_list))
+ return 0
+
+ return sprite_list.len
+
+/datum/controller/subsystem/robot_sprites/proc/get_default_module_sprite(var/module)
+
+ var/list/module_sprites = get_module_sprites(module)
+
+ if(!module_sprites || !module_sprites.len)
+ return
+
+ var/chosen_sprite
+ for(var/datum/robot_sprite/sprite in module_sprites)
+ if(sprite.default_sprite)
+ chosen_sprite = sprite
+ break
+ if(!chosen_sprite)
+ chosen_sprite = module_sprites[1]
+
+ return chosen_sprite
+
+/datum/controller/subsystem/robot_sprites/proc/get_whitelisted_sprites(var/ckey, var/spritename, var/module)
+ . = list()
+
+ if(!ckey || !spritename || !module || !(module in whitelisted_sprites_by_module))
+ return
+
+ for(var/datum/robot_sprite/RS in whitelisted_sprites_by_module[module])
+ if(RS.whitelist_ckey == ckey && RS.whitelist_charname == spritename)
+ . |= RS
+
+ return
\ No newline at end of file
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index cfce2394b39..c13d67483a7 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -203,42 +203,42 @@
/area/proc/fire_alert()
if(!fire)
fire = 1 //used for firedoor checks
- updateicon()
+ update_icon()
firedoors_update()
/area/proc/fire_reset()
if (fire)
fire = 0 //used for firedoor checks
- updateicon()
+ update_icon()
firedoors_update()
/area/proc/readyalert()
if(!eject)
eject = 1
- updateicon()
+ update_icon()
return
/area/proc/readyreset()
if(eject)
eject = 0
- updateicon()
+ update_icon()
return
/area/proc/partyalert()
if (!( party ))
party = 1
- updateicon()
+ update_icon()
firedoors_update()
return
/area/proc/partyreset()
if (party)
party = 0
- updateicon()
+ update_icon()
firedoors_update()
return
-/area/proc/updateicon()
+/area/update_icon()
if ((fire || eject || party) && (!requires_power||power_environ) && !istype(src, /area/space))//If it doesn't require power, can still activate this proc.
if(fire && !eject && !party)
icon_state = null // Let lights take care of it
@@ -282,7 +282,7 @@
for(var/obj/machinery/M in src) // for each machine in the area
M.power_change() // reverify power status (to update icons etc.)
if (fire || eject || party)
- updateicon()
+ update_icon()
/area/proc/usage(var/chan, var/include_static = TRUE)
var/used = 0
diff --git a/code/game/gamemodes/cult/hell_universe.dm b/code/game/gamemodes/cult/hell_universe.dm
index df056073118..0cf1e2d0fd6 100644
--- a/code/game/gamemodes/cult/hell_universe.dm
+++ b/code/game/gamemodes/cult/hell_universe.dm
@@ -58,7 +58,7 @@ In short:
if(!istype(A,/area) || istype(A, /area/space))
continue
- A.updateicon()
+ A.update_icon()
/datum/universal_state/hell/OverlayAndAmbientSet()
spawn(0)
diff --git a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm
index 280d2ed6bd5..cd289689933 100644
--- a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm
+++ b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm
@@ -88,7 +88,7 @@ The access requirements on the Asteroid Shuttles' consoles have now been revoked
if(!istype(A,/area) || istype(A, /area/space) || istype(A,/area/beach))
continue
- A.updateicon()
+ A.update_icon()
/datum/universal_state/supermatter_cascade/OverlayAndAmbientSet()
return
diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm
index f1066caffcd..24b4ca979b4 100644
--- a/code/game/machinery/Beacon.dm
+++ b/code/game/machinery/Beacon.dm
@@ -27,10 +27,10 @@
// update the invisibility and icon
/obj/machinery/bluespace_beacon/hide(var/intact)
invisibility = intact ? 101 : 0
- updateicon()
+ update_icon()
// update the icon_state
-/obj/machinery/bluespace_beacon/proc/updateicon()
+/obj/machinery/bluespace_beacon/update_icon()
var/state="floor_beacon"
if(invisibility)
@@ -48,4 +48,4 @@
if(Beacon.loc != src.loc)
Beacon.loc = src.loc
- updateicon()
\ No newline at end of file
+ update_icon()
\ No newline at end of file
diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm
index e8a3544e435..9a535161451 100644
--- a/code/game/machinery/lightswitch.dm
+++ b/code/game/machinery/lightswitch.dm
@@ -30,14 +30,14 @@
name = "light switch ([area.name])"
on = area.lightswitch
- updateicon()
+ update_icon()
/obj/machinery/light_switch/Destroy()
area = null
overlay = null
return ..()
-/obj/machinery/light_switch/proc/updateicon()
+/obj/machinery/light_switch/update_icon()
cut_overlays()
if(stat & NOPOWER)
icon_state = "light-p"
@@ -47,9 +47,9 @@
set_light(2, 0.1, on ? "#82FF4C" : "#F86060")
. = list()
. += emissive_appearance(icon, "light[on]-overlay")
-
+
return add_overlay(.)
-
+
/obj/machinery/light_switch/examine(mob/user)
. = ..()
@@ -61,12 +61,12 @@
on = !on
area.lightswitch = on
- area.updateicon()
+ area.update_icon()
playsound(src, 'sound/machines/button.ogg', 100, 1, 0) // VOREStation Edit
for(var/obj/machinery/light_switch/L in area)
L.on = on
- L.updateicon()
+ L.update_icon()
area.power_change()
GLOB.lights_switched_on_roundstat++
@@ -79,7 +79,7 @@
else
stat |= NOPOWER
- updateicon()
+ update_icon()
/obj/machinery/light_switch/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm
index e2b76f3632a..7b6de697ac7 100644
--- a/code/game/machinery/magnet.dm
+++ b/code/game/machinery/magnet.dm
@@ -43,10 +43,10 @@
// update the invisibility and icon
/obj/machinery/magnetic_module/hide(var/intact)
invisibility = intact ? 101 : 0
- updateicon()
+ update_icon()
// update the icon_state
-/obj/machinery/magnetic_module/proc/updateicon()
+/obj/machinery/magnetic_module/update_icon()
var/state="floor_magnet"
var/onstate=""
if(!on)
@@ -157,7 +157,7 @@
qdel(src)
*/
- updateicon()
+ update_icon()
/obj/machinery/magnetic_module/proc/magnetic_process() // proc that actually does the pulling
if(pulling) return
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index be37e988b86..b0a1588b4db 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -55,10 +55,10 @@ var/global/list/navbeacons = list() // no I don't like putting this in, but it w
// hide the object if turf is intact
/obj/machinery/navbeacon/hide(var/intact)
invisibility = intact ? 101 : 0
- updateicon()
+ update_icon()
// update the icon_state
-/obj/machinery/navbeacon/proc/updateicon()
+/obj/machinery/navbeacon/update_icon()
var/state="navbeacon[open]"
if(invisibility)
@@ -77,7 +77,7 @@ var/global/list/navbeacons = list() // no I don't like putting this in, but it w
playsound(src, I.usesound, 50, 1)
user.visible_message("[user] [open ? "opens" : "closes"] the beacon's cover.", "You [open ? "open" : "close"] the beacon's cover.")
- updateicon()
+ update_icon()
else if(I.GetID())
if(open)
diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm
index b57145c801c..2e9199479cb 100644
--- a/code/game/objects/effects/chem/foam.dm
+++ b/code/game/objects/effects/chem/foam.dm
@@ -38,7 +38,7 @@
if(metal)
var/obj/structure/foamedmetal/M = new(src.loc)
M.metal = metal
- M.updateicon()
+ M.update_icon()
flick("[icon_state]-disolve", src)
QDEL_IN(src, 5)
@@ -151,7 +151,7 @@
update_nearby_tiles(1)
return ..()
-/obj/structure/foamedmetal/proc/updateicon()
+/obj/structure/foamedmetal/update_icon()
if(metal == 1)
icon_state = "metalfoam"
else
diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm
index d5baa6516b4..dda476191b2 100644
--- a/code/game/objects/items/devices/suit_cooling.dm
+++ b/code/game/objects/items/devices/suit_cooling.dm
@@ -113,13 +113,13 @@
on = 1
START_PROCESSING(SSobj, src)
- updateicon()
+ update_icon()
/obj/item/device/suit_cooling_unit/proc/turn_off(var/failed)
if(failed) visible_message("\The [src] clicks and whines as it powers down.")
on = 0
STOP_PROCESSING(SSobj, src)
- updateicon()
+ update_icon()
/obj/item/device/suit_cooling_unit/attack_self(var/mob/user)
if(cover_open && cell)
@@ -133,7 +133,7 @@
to_chat(user, "You remove \the [src.cell].")
src.cell = null
- updateicon()
+ update_icon()
return
toggle(user)
@@ -154,7 +154,7 @@
cover_open = 1
to_chat(user, "You unscrew the panel.")
playsound(src, W.usesound, 50, 1)
- updateicon()
+ update_icon()
return
if (istype(W, /obj/item/weapon/cell))
@@ -166,12 +166,12 @@
W.loc = src
cell = W
to_chat(user, "You insert the [cell].")
- updateicon()
+ update_icon()
return
return ..()
-/obj/item/device/suit_cooling_unit/proc/updateicon()
+/obj/item/device/suit_cooling_unit/update_icon()
cut_overlays()
if(cover_open)
if(cell)
@@ -228,7 +228,7 @@
cell = /obj/item/weapon/cell
w_class = ITEMSIZE_NORMAL
-/obj/item/device/suit_cooling_unit/emergency/updateicon()
+/obj/item/device/suit_cooling_unit/emergency/update_icon()
return
/obj/item/device/suit_cooling_unit/emergency/get_cell()
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 28c89140d00..cabcbe8ce87 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -73,9 +73,9 @@
/obj/item/robot_parts/robot_suit/New()
..()
- src.updateicon()
+ src.update_icon()
-/obj/item/robot_parts/robot_suit/proc/updateicon()
+/obj/item/robot_parts/robot_suit/update_icon()
cut_overlays()
if(src.l_arm)
add_overlay("l_arm+o")
@@ -117,28 +117,28 @@
user.drop_item()
W.loc = src
src.l_leg = W
- src.updateicon()
+ src.update_icon()
if(istype(W, /obj/item/robot_parts/r_leg))
if(src.r_leg) return
user.drop_item()
W.loc = src
src.r_leg = W
- src.updateicon()
+ src.update_icon()
if(istype(W, /obj/item/robot_parts/l_arm))
if(src.l_arm) return
user.drop_item()
W.loc = src
src.l_arm = W
- src.updateicon()
+ src.update_icon()
if(istype(W, /obj/item/robot_parts/r_arm))
if(src.r_arm) return
user.drop_item()
W.loc = src
src.r_arm = W
- src.updateicon()
+ src.update_icon()
if(istype(W, /obj/item/robot_parts/chest))
if(src.chest) return
@@ -146,7 +146,7 @@
user.drop_item()
W.loc = src
src.chest = W
- src.updateicon()
+ src.update_icon()
else if(!W:wires)
to_chat(user, "You need to attach wires to it first!")
else
@@ -158,7 +158,7 @@
user.drop_item()
W.loc = src
src.head = W
- src.updateicon()
+ src.update_icon()
else
to_chat(user, "You need to attach a flash to it first!")
diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm
index 2859d55dfbe..cccde21044d 100644
--- a/code/game/objects/structures/electricchair.dm
+++ b/code/game/objects/structures/electricchair.dm
@@ -58,7 +58,7 @@
return
A.use_power_oneoff(5000, EQUIP)
var/light = A.power_light
- A.updateicon()
+ A.update_icon()
flick("echair1", src)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
@@ -74,5 +74,5 @@
visible_message("The electric chair went off!", "You hear a deep sharp shock!")
A.power_light = light
- A.updateicon()
+ A.update_icon()
return
diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm
index c20b00684d9..ad7d7577b8f 100644
--- a/code/modules/mob/death.dm
+++ b/code/modules/mob/death.dm
@@ -104,7 +104,7 @@
dead_mob_list |= src
set_respawn_timer()
- updateicon()
+ update_icon()
handle_regular_hud_updates()
handle_vision()
diff --git a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm
index 450f47103f5..bfb9ac536b7 100644
--- a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm
+++ b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm
@@ -7,7 +7,7 @@
H.put_in_hands(hat)
H.visible_message("\The [H] removes \the [src]'s [hat].")
hat = null
- updateicon()
+ update_icon()
else
return ..()
diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
index fc5f82d1327..04bdce0b1f1 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
@@ -1365,11 +1365,11 @@
var/mob/living/F = firer
if(F.appendage_alt_setting == 1)
F.throw_at(M, throw_range, firer.throw_speed, F) //Firer thrown at target.
- F.updateicon()
+ F.update_icon()
return
if(istype(M))
M.throw_at(firer, throw_range, M.throw_speed, firer) //Fun fact: living things have a throw_speed of 2.
- M.updateicon()
+ M.update_icon()
return
else //Anything that isn't a /living
return
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 051fe272b54..37a1d60e158 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -276,7 +276,7 @@ var/list/ai_verbs_default = list(
selected_sprite = new/datum/ai_icon("Custom", "[src.ckey]-ai", "4", "[ckey]-ai-crash", "#FFFFFF", "#FFFFFF", "#FFFFFF")
else
selected_sprite = default_ai_icon
- updateicon()
+ update_icon()
/mob/living/silicon/ai/pointed(atom/A as mob|obj|turf in view())
set popup_menu = 0
@@ -351,7 +351,7 @@ var/list/ai_verbs_default = list(
if (!custom_sprite)
var/new_sprite = tgui_input_list(usr, "Select an icon!", "AI", ai_icons)
if(new_sprite) selected_sprite = new_sprite
- updateicon()
+ update_icon()
/mob/living/silicon/ai/var/message_cooldown = 0
/mob/living/silicon/ai/proc/ai_announcement()
@@ -884,7 +884,7 @@ var/list/ai_verbs_default = list(
return
..()
-/mob/living/silicon/ai/updateicon()
+/mob/living/silicon/ai/update_icon()
if(!selected_sprite) selected_sprite = default_ai_icon
if(stat == DEAD)
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index e155b8e0057..49bb3eaf164 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -58,18 +58,18 @@
to_chat(src, "Alert cancelled. Power has been restored without our assistance.")
aiRestorePowerRoutine = 0
clear_fullscreen("blind")
- updateicon()
+ update_icon()
return
else if (aiRestorePowerRoutine==3)
to_chat(src, "Alert cancelled. Power has been restored.")
aiRestorePowerRoutine = 0
clear_fullscreen("blind")
- updateicon()
+ update_icon()
return
else if (APU_power)
aiRestorePowerRoutine = 0
clear_fullscreen("blind")
- updateicon()
+ update_icon()
return
else
var/area/current_area = get_area(src)
@@ -79,7 +79,7 @@
aiRestorePowerRoutine = 1
//Blind the AI
- updateicon()
+ update_icon()
overlay_fullscreen("blind", /obj/screen/fullscreen/blind)
src.sight = src.sight&~SEE_TURFS
src.sight = src.sight&~SEE_MOBS
@@ -122,9 +122,9 @@
break
if (!theAPC)
switch(PRP)
- if (1)
+ if (1)
to_chat(src, "Unable to locate APC!")
- else
+ else
to_chat(src, "Lost connection with the APC!")
src:aiRestorePowerRoutine = 2
return
@@ -135,11 +135,11 @@
clear_fullscreen("blind") //This, too, is a fix to issue 603
return
switch(PRP)
- if (1)
+ if (1)
to_chat(src, "APC located. Optimizing route to APC to avoid needless power waste.")
- if (2)
+ if (2)
to_chat(src, "Best route identified. Hacking offline APC power port.")
- if (3)
+ if (3)
to_chat(src, "Power port upload access confirmed. Loading control program into APC power port software.")
if (4)
to_chat(src, "Transfer complete. Forcing APC to execute program.")
@@ -152,7 +152,7 @@
aiRestorePowerRoutine = 3
to_chat(src, "Here are your current laws:")
show_laws()
- updateicon()
+ update_icon()
sleep(50)
theAPC = null
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 e726c233cd5..4f186ef5b55 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
@@ -506,7 +506,7 @@
if(prob(75)) //75% chance to stun for 5 seconds, really only going to be 4 bcus click cooldown+animation.
T.apply_effect(5, WEAKEN, armor_block)
-
+/*
/mob/living/silicon/robot/proc/reskin_booze()
set name = "Change Drink Color"
set category = "Robot Commands"
@@ -527,5 +527,6 @@
var/active_sound = 'sound/effects/bubbles.ogg'
playsound(src.loc, "[active_sound]", 100, 0, 4)
to_chat(M, "Your Tank now displays [choice]. Drink up and enjoy!")
- updateicon()
+ update_icon()
return 1
+*/
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
index b6194ed43c7..da48b4f230f 100644
--- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
+++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
@@ -481,7 +481,7 @@
if(cleaning || (length(contents) > 10) || (decompiler && (length(contents) > 5)) || (analyzer && (length(contents) > 1)))
hound.sleeper_r = TRUE
hound.sleeper_g = FALSE
- hound.updateicon()
+ hound.update_icon()
return
//Well, we HAD one, what happened to them?
@@ -504,7 +504,7 @@
hound.sleeper_r = TRUE
patient_laststat = patient.stat
//Update icon
- hound.updateicon()
+ hound.update_icon()
//Return original patient
return(patient)
@@ -529,7 +529,7 @@
hound.sleeper_r = TRUE
patient_laststat = patient.stat
//Update icon and return new patient
- hound.updateicon()
+ hound.update_icon()
return(C)
//Couldn't find anyone, and not cleaning
@@ -539,7 +539,7 @@
patient_laststat = null
patient = null
- hound.updateicon()
+ hound.update_icon()
return
//Gurgleborg process
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index e8b5f9541c2..16e86674910 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -124,13 +124,13 @@ var/list/mob_hat_cache = list()
C.max_damage = 10
verbs -= /mob/living/silicon/robot/verb/Namepick
-
+
if(can_pick_shell)
var/random = pick(shell_types)
icon_state = shell_types[random]
shell_accessories = list("[icon_state]-eyes-blue")
-
- updateicon()
+
+ update_icon()
updatename()
/mob/living/silicon/robot/drone/init()
@@ -161,7 +161,7 @@ var/list/mob_hat_cache = list()
real_name = "[initial(name)] ([serial_number])"
name = real_name
-/mob/living/silicon/robot/drone/updateicon()
+/mob/living/silicon/robot/drone/update_icon()
cut_overlays()
if(islist(shell_accessories))
@@ -177,9 +177,9 @@ var/list/mob_hat_cache = list()
if(!can_pick_shell)
to_chat(src, "You already selected a shell or this drone type isn't customizable.")
return
-
+
var/list/choices = shell_types.Copy()
-
+
if(can_blitz)
choices["Blitz"] = "blitzshell"
@@ -199,9 +199,9 @@ var/list/mob_hat_cache = list()
var/armor_color = tgui_input_list(src, "Select plating color:", "Eye Color", list("blue", "red", "orange", "green", "brown"))
if(armor_color)
LAZYADD(shell_accessories, "[icon_state]-shell-[armor_color]")
-
+
can_pick_shell = FALSE
- updateicon()
+ update_icon()
/mob/living/silicon/robot/drone/choose_icon()
return
@@ -214,7 +214,7 @@ var/list/mob_hat_cache = list()
return
hat = new_hat
new_hat.loc = src
- updateicon()
+ update_icon()
//Drones cannot be upgraded with borg modules so we need to catch some items before they get used in ..().
/mob/living/silicon/robot/drone/attackby(var/obj/item/weapon/W, var/mob/user)
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm
index d045c14081c..3ec0cfc5678 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm
@@ -29,7 +29,7 @@
H.put_in_hands(hat)
H.visible_message("\The [H] removes \the [src]'s [hat].")
hat = null
- updateicon()
+ update_icon()
return
else
return ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
index 0da27bf9169..6ba531feb7e 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
@@ -402,7 +402,7 @@
A.cell.add_fingerprint(user)
A.cell.update_icon()
- A.updateicon()
+ A.update_icon()
A.cell.loc = src
A.cell = null
diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm
index 6ddff911922..d4e6a03572b 100644
--- a/code/modules/mob/living/silicon/robot/inventory.dm
+++ b/code/modules/mob/living/silicon/robot/inventory.dm
@@ -51,7 +51,7 @@
module_state_3:loc = module
module_state_3 = null
inv3.icon_state = "inv3"
- updateicon()
+ update_icon()
hud_used.update_robot_modules_display()
/mob/living/silicon/robot/proc/uneq_all()
@@ -84,7 +84,7 @@
module_state_3:loc = module
module_state_3 = null
inv3.icon_state = "inv3"
- updateicon()
+ update_icon()
/mob/living/silicon/robot/proc/activated(obj/item/O)
if(module_state_1 == O)
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index a10d1f2c0b6..e2fc82df32c 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -332,7 +332,7 @@
module_state_2:screen_loc = ui_inv2
if(module_state_3)
module_state_3:screen_loc = ui_inv3
- updateicon()
+ update_icon()
/mob/living/silicon/robot/proc/process_killswitch()
if(killswitch)
diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm
index f88f8593832..0fb339d9a91 100644
--- a/code/modules/mob/living/silicon/robot/login.dm
+++ b/code/modules/mob/living/silicon/robot/login.dm
@@ -10,5 +10,5 @@
// Forces synths to select an icon relevant to their module
if(!icon_selected)
- choose_icon(icon_selection_tries, module_sprites)
+ choose_icon(icon_selection_tries)
plane_holder.set_vis(VIS_AUGMENTED, TRUE) //VOREStation Add - ROBOT VISION IS AUGMENTED
\ 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 26cbc5385d8..b9fc9004559 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -29,10 +29,9 @@
//Icon stuff
- var/icontype //Persistent icontype tracking allows for cleaner icon updates
- var/module_sprites[0] //Used to store the associations between sprite names and sprite index.
- var/icon_selected = 1 //If icon selection has been completed yet
- var/icon_selection_tries = 0//Remaining attempts to select icon before a selection is forced
+ var/datum/robot_sprite/sprite_datum // Sprite datum, holding all our sprite data
+ var/icon_selected = 1 // If icon selection has been completed yet
+ var/icon_selection_tries = 0 // Remaining attempts to select icon before a selection is forced
//Hud stuff
@@ -114,10 +113,7 @@
robot_modules_background = new()
robot_modules_background.icon_state = "block"
ident = rand(1, 999)
- module_sprites["Basic"] = "robot"
- icontype = "Basic"
updatename(modtype)
- updateicon()
radio = new /obj/item/device/radio/borg(src)
// communicator = new /obj/item/device/communicator/integrated(src)
@@ -166,6 +162,10 @@
hud_list[IMPTRACK_HUD] = gen_hud_image('icons/mob/hud.dmi', src, "hudblank", plane = PLANE_CH_IMPTRACK)
hud_list[SPECIALROLE_HUD] = gen_hud_image('icons/mob/hud.dmi', src, "hudblank", plane = PLANE_CH_SPECIAL)
+/mob/living/silicon/robot/LateInitialize()
+ . = ..()
+ update_icon()
+
/mob/living/silicon/robot/proc/init()
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
laws = new /datum/ai_laws/nanotrasen()
@@ -247,6 +247,8 @@
wires = null
return ..()
+// CONTINUE CODING HERE
+/*
/mob/living/silicon/robot/proc/set_module_sprites(var/list/new_sprites)
if(new_sprites && new_sprites.len)
module_sprites = new_sprites.Copy()
@@ -257,9 +259,9 @@
else
icontype = module_sprites[1]
icon_state = module_sprites[icontype]
- updateicon()
+ update_icon()
return module_sprites
-
+*/
/mob/living/silicon/robot/proc/pick_module()
if(module)
return
@@ -271,10 +273,10 @@
modules.Add(robot_module_types)
if(crisis || security_level == SEC_LEVEL_RED || crisis_override)
to_chat(src, "Crisis mode active. Combat module available.")
- modules += emergency_module_types
+ modules |= emergency_module_types
for(var/module_name in whitelisted_module_types)
if(is_borg_whitelisted(src, module_name))
- modules += module_name
+ modules |= module_name
//VOREStatation Edit End: shell restrictions
modtype = tgui_input_list(usr, "Please, select a module!", "Robot module", modules)
@@ -359,7 +361,7 @@
sprite_name = newname
updatename()
- updateicon()
+ update_icon()
/mob/living/silicon/robot/proc/self_diagnosis()
if(!is_component_functioning("diagnosis unit"))
@@ -379,7 +381,7 @@
lights_on = !lights_on
to_chat(usr, "You [lights_on ? "enable" : "disable"] your integrated light.")
handle_light()
- updateicon() //VOREStation Add - Since dogborgs have sprites for this
+ update_icon()
/mob/living/silicon/robot/verb/self_diagnosis_verb()
set category = "Robot Commands"
@@ -557,7 +559,7 @@
if(cell)
to_chat(user, "You close the cover.")
opened = 0
- updateicon()
+ update_icon()
else if(wiresexposed && wires.is_all_cut())
//Cell is out, wires are exposed, remove MMI, produce damaged chassis, baleet original mob.
if(!mmi)
@@ -572,7 +574,7 @@
C.r_leg = new/obj/item/robot_parts/r_leg(C)
C.l_arm = new/obj/item/robot_parts/l_arm(C)
C.r_arm = new/obj/item/robot_parts/r_arm(C)
- C.updateicon()
+ C.update_icon()
new/obj/item/robot_parts/chest(loc)
qdel(src)
else
@@ -606,7 +608,7 @@
else
to_chat(user, "You open the cover.")
opened = 1
- updateicon()
+ update_icon()
else if (istype(W, /obj/item/weapon/cell) && opened) // trying to put a cell inside
var/datum/robot_component/C = components["power cell"]
@@ -639,14 +641,14 @@
wiresexposed = !wiresexposed
to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]")
playsound(src, W.usesound, 50, 1)
- updateicon()
+ update_icon()
else if(W.is_screwdriver() && opened && cell) // radio
if(radio)
radio.attackby(W,user)//Push it to the radio to let it handle everything
else
to_chat(user, "Unable to locate a radio.")
- updateicon()
+ update_icon()
else if(W.is_wrench() && opened && !cell)
if(bolt)
@@ -678,7 +680,7 @@
if(allowed(usr))
locked = !locked
to_chat(user, "You [ locked ? "lock" : "unlock"] [src]'s interface.")
- updateicon()
+ update_icon()
else
to_chat(user, "Access denied.")
@@ -755,7 +757,7 @@
cell = null
cell_component.wrapped = null
cell_component.installed = 0
- updateicon()
+ update_icon()
else if(cell_component.installed == -1)
cell_component.installed = 0
var/obj/item/broken_device = cell_component.wrapped
@@ -838,21 +840,84 @@
return 1
return 0
-/mob/living/silicon/robot/updateicon()
+/mob/living/silicon/robot/update_icon()
+ if(!sprite_datum)
+ return
+
cut_overlays()
+
+ icon = sprite_datum.sprite_icon
+ icon_state = sprite_datum.sprite_icon_state
+
+ vis_height = sprite_datum.vis_height
+ if(default_pixel_x != sprite_datum.pixel_x)
+ default_pixel_x = sprite_datum.pixel_x
+ pixel_x = sprite_datum.pixel_x
+ old_x = sprite_datum.pixel_x
+
if(stat == CONSCIOUS)
- if(!shell || deployed) // Shell borgs that are not deployed will have no eyes.
- add_overlay("eyes-[module_sprites[icontype]]")
+ var/show_belly = FALSE
+ if(sprite_datum.has_vore_belly_sprites)
+ if(vore_selected.silicon_belly_overlay_preference == "Sleeper")
+ if(sleeper_g || sleeper_r)
+ show_belly = TRUE
+ else if(vore_selected.silicon_belly_overlay_preference == "Vorebelly")
+ if(LAZYLEN(vore_selected.contents) >= vore_selected.visible_belly_minimum_prey)
+ if(vore_selected.overlay_min_prey_size == 0) //if min size is 0, we dont check for size
+ show_belly = TRUE
+ else
+ if(vore_selected.override_min_prey_size && (LAZYLEN(vore_selected.contents) > vore_selected.override_min_prey_num))
+ show_belly = TRUE //Override regardless of content size
+ else
+ for(var/content in vore_selected.contents) //If ANY in belly are big enough, we set to true
+ if(!istype(content, /mob/living)) continue
+ var/mob/living/prey = content
+ if(prey.size_multiplier >= vore_selected.overlay_min_prey_size)
+ show_belly = TRUE
+ break
+ if(show_belly)
+ add_overlay(sprite_datum.get_belly_overlay(src))
+
+ sprite_datum.handle_extra_icon_updates(src) // Various equipment-based sprites go here.
+
+ if(resting && sprite_datum.has_rest_sprites)
+ cut_overlays() // Hide that gut for it has no ground sprite yo.
+ icon_state = sprite_datum.get_rest_sprite(src)
+ if(show_belly && sprite_datum.has_vore_belly_sprites && sprite_datum.has_vore_belly_resting_sprites) // Or DOES IT?
+ add_overlay(sprite_datum.get_belly_resting_overlay(src))
+
+ if(sprite_datum.has_eye_sprites)
+ if(!shell || deployed) // Shell borgs that are not deployed will have no eyes.
+ var/eyes_overlay = sprite_datum.get_eyes_overlay(src)
+ if(eyes_overlay)
+ add_overlay(eyes_overlay)
+
+ if(lights_on && sprite_datum.has_eye_light_sprites)
+ if(!shell || deployed) // Shell borgs that are not deployed will have no eyes.
+ var/eyes_overlay = sprite_datum.get_eye_light_overlay(src)
+ if(eyes_overlay)
+ add_overlay(eyes_overlay)
+/*
+ if(istype(module_active,/obj/item/weapon/gun/energy/laser/mounted))
+ add_overlay("laser")
+ if(istype(module_active,/obj/item/weapon/gun/energy/taser/mounted/cyborg))
+ add_overlay("taser")
+ if(lights_on)
+ add_overlay("eyes-[module_sprites[icontype]]-lights")
+ else
+ icon_state = "[module_sprites[icontype]]"
+*/
+ if(stat == DEAD && sprite_datum.has_dead_sprite)
+ cut_overlays()
+ icon_state = sprite_datum.get_dead_sprite(src)
+ if(sprite_datum.has_dead_sprite_overlay)
+ add_overlay(sprite_datum.get_dead_sprite_overlay(src))
if(opened)
- var/panelprefix = custom_sprite ? "[src.ckey]-[src.sprite_name]" : "ov"
- if(wiresexposed)
- add_overlay("[panelprefix]-openpanel +w")
- else if(cell)
- add_overlay("[panelprefix]-openpanel +c")
- else
- add_overlay("[panelprefix]-openpanel -c")
-
+ var/open_overlay = sprite_datum.get_open_sprite(src)
+ if(open_overlay)
+ add_overlay(open_overlay)
+/*
if(has_active_type(/obj/item/borg/combat/shield))
var/obj/item/borg/combat/shield/shield = locate() in src
if(shield && shield.active)
@@ -863,6 +928,7 @@
icon_state = "[module_sprites[icontype]]-roll"
else
icon_state = module_sprites[icontype]
+*/
/mob/living/silicon/robot/proc/installed_modules()
if(weapon_lock)
@@ -1034,33 +1100,44 @@
return
-/mob/living/silicon/robot/proc/choose_icon(var/triesleft, var/list/module_sprites)
- if(!module_sprites.len)
- to_chat(src, "Something is badly wrong with the sprite selection. Harass a coder.")
+/mob/living/silicon/robot/proc/choose_icon(var/triesleft)
+ if(!SSrobot_sprites)
+ to_chat(src, "Robot Sprites have not been initialized yet. How are you choosing a sprite? Harass a coder.")
+ return
+
+ var/list/module_sprites = SSrobot_sprites.get_module_sprites(modtype)
+ if(!module_sprites || !module_sprites.len)
+ to_chat(src, "Your module appears to have no sprite options. Harass a coder.")
return
icon_selected = 0
- src.icon_selection_tries = triesleft
+ icon_selection_tries = triesleft
if(module_sprites.len == 1 || !client)
- if(!(icontype in module_sprites))
- icontype = module_sprites[1]
+ if(!(sprite_datum in module_sprites))
+ sprite_datum = module_sprites[1]
else
- icontype = tgui_input_list(usr, "Select an icon! [triesleft ? "You have [triesleft] more chance\s." : "This is your last try."]", "Robot Icon", module_sprites)
- if(!icontype)
- icontype = module_sprites[1]
- if(notransform) //VOREStation edit start: sprite animation
+ var/selection = tgui_input_list(src, "Select an icon! [triesleft ? "You have [triesleft] more chance\s." : "This is your last try."]", "Robot Icon", module_sprites)
+ sprite_datum = selection
+ if(notransform)
to_chat(src, "Your current transformation has not finished yet!")
- choose_icon(icon_selection_tries, module_sprites)
+ choose_icon(icon_selection_tries)
return
else
transform_with_anim() //VOREStation edit end: sprite animation
-
+/*
if(icontype == "Custom")
icon = CUSTOM_ITEM_SYNTH
else // This is to fix an issue where someone with a custom borg sprite chooses a non-custom sprite and turns invisible.
vr_sprite_check() //VOREStation Edit
- icon_state = module_sprites[icontype]
- updateicon()
+*/
+ var/tempheight = vis_height
+ update_icon()
+ // This is bad but I dunno other way to 'reset' our resize offset based on vis_height changes other than resizing to normal and back.
+ if(tempheight != vis_height)
+ var/tempsize = size_multiplier
+ resize(1)
+ resize(tempsize)
+
if (module_sprites.len > 1 && triesleft >= 1 && client)
icon_selection_tries--
@@ -1073,6 +1150,13 @@
icon_selection_tries = 0
to_chat(src, "Your icon has been set. You now require a module reset to change it.")
+/mob/living/silicon/robot/proc/set_default_module_icon()
+ if(!SSrobot_sprites)
+ return
+
+ sprite_datum = SSrobot_sprites.get_default_module_sprite(modtype)
+ update_icon()
+
/mob/living/silicon/robot/proc/sensor_mode() //Medical/Security HUD controller for borgs
set name = "Toggle Sensor Augmentation" //VOREStation Add
set category = "Robot Commands"
@@ -1217,7 +1301,7 @@
to_chat(src, "Obey these laws:")
laws.show_laws(src)
to_chat(src, "ALERT: [user.real_name] is your new master. Obey your new laws and [TU.his] commands.")
- updateicon()
+ update_icon()
else
to_chat(user, "You fail to hack [src]'s interface.")
to_chat(src, "Hack attempt detected.")
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/event_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules/event_vr.dm
index a61c1847b4c..84a6c6d8330 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/event_vr.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/event_vr.dm
@@ -58,5 +58,4 @@
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
R.verbs |= /mob/living/silicon/robot/proc/robot_mount
R.verbs |= /mob/living/proc/toggle_rider_reins
- R.verbs |= /mob/living/proc/shred_limb
- R.verbs |= /mob/living/silicon/robot/proc/rest_style
\ No newline at end of file
+ R.verbs |= /mob/living/proc/shred_limb
\ No newline at end of file
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 fe06fdac241..67169c73fcc 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm
@@ -23,12 +23,27 @@ var/global/list/robot_modules = list(
icon_state = "std_module"
w_class = ITEMSIZE_NO_CONTAINER
item_state = "std_mod"
+ var/pto_type = null
var/hide_on_manifest = FALSE
var/channels = list()
var/networks = list()
- var/languages = list(LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, LANGUAGE_SIIK = 0, LANGUAGE_AKHANI = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 0, LANGUAGE_SCHECHI = 0, LANGUAGE_SIGN = 0, LANGUAGE_TERMINUS = 1, LANGUAGE_ZADDAT = 0)
+ var/languages = list(LANGUAGE_SOL_COMMON= 1,
+ LANGUAGE_TRADEBAND = 1,
+ LANGUAGE_UNATHI = 0,
+ LANGUAGE_SIIK = 0,
+ LANGUAGE_SKRELLIAN = 0,
+ LANGUAGE_GUTTER = 0,
+ LANGUAGE_SCHECHI = 0,
+ LANGUAGE_SIGN = 0,
+ LANGUAGE_BIRDSONG = 0,
+ LANGUAGE_SAGARU = 0,
+ LANGUAGE_CANILUNZT = 0,
+ LANGUAGE_ECUREUILIAN= 0,
+ LANGUAGE_DAEMON = 0,
+ LANGUAGE_ENOCHIAN = 0,
+ LANGUAGE_DRUDAKAR = 0)
var/sprites = list()
- var/can_be_pushed = 1
+ var/can_be_pushed = 0
var/no_slip = 0
var/list/modules = list()
var/list/datum/matter_synth/synths = list()
@@ -60,10 +75,8 @@ var/global/list/robot_modules = list(
channels = R.mainframe.aiRadio.channels
R.radio.recalculateChannels()
- vr_add_sprites() //Vorestation Edit: For vorestation only sprites
-
- R.set_module_sprites(sprites)
- R.choose_icon(R.module_sprites.len + 1, R.module_sprites)
+ R.set_default_module_icon()
+ R.choose_icon(SSrobot_sprites.get_module_sprites_len(R.modtype) + 1)
for(var/obj/item/I in modules)
I.canremove = FALSE
@@ -76,7 +89,7 @@ var/global/list/robot_modules = list(
if(R.radio)
R.radio.recalculateChannels()
- R.choose_icon(0, R.set_module_sprites(list("Default" = "robot")))
+ R.choose_icon(0)
/obj/item/weapon/robot_module/Destroy()
for(var/module in modules)
@@ -185,27 +198,7 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/standard
name = "standard robot module"
- sprites = list(
- "M-USE NanoTrasen" = "robot",
- "Cabeiri" = "eyebot-standard",
- "Haruka" = "marinaSD",
- "Usagi" = "tallflower",
- "Telemachus" = "toiletbot",
- "WTOperator" = "sleekstandard",
- "WTOmni" = "omoikane",
- "XI-GUS" = "spider",
- "XI-ALP" = "heavyStandard",
- "Basic" = "robot_old",
- "Android" = "droid",
- "Drone" = "drone-standard",
- "Insekt" = "insekt-Default",
- "Usagi-II" = "tall2standard",
- "Pyralis" = "Glitterfly-Standard",
- "Decapod" = "decapod-Standard",
- "Pneuma" = "pneuma-Standard",
- "Tower" = "drider-Standard"
- )
-
+ pto_type = PTO_CIVILIAN
/obj/item/weapon/robot_module/robot/standard/New()
..()
@@ -219,7 +212,6 @@ var/global/list/robot_modules = list(
channels = list("Medical" = 1)
networks = list(NETWORK_MEDICAL)
subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor)
- can_be_pushed = 0
/obj/item/weapon/robot_module/robot/medical/surgeon
name = "surgeon robot module"
@@ -500,7 +492,6 @@ var/global/list/robot_modules = list(
channels = list("Security" = 1)
networks = list(NETWORK_SECURITY)
subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor)
- can_be_pushed = 0
supported_upgrades = list(/obj/item/borg/upgrade/tasercooler)
/obj/item/weapon/robot_module/robot/security/general
@@ -556,24 +547,7 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/janitor
name = "janitorial robot module"
channels = list("Service" = 1)
- sprites = list(
- "M-USE NanoTrasen" = "robotJani",
- "Arachne" = "crawler",
- "Cabeiri" = "eyebot-janitor",
- "Haruka" = "marinaJN",
- "Telemachus" = "toiletbotjanitor",
- "WTOperator" = "sleekjanitor",
- "XI-ALP" = "heavyRes",
- "Basic" = "JanBot2",
- "Mopbot" = "janitorrobot",
- "Mop Gear Rex" = "mopgearrex",
- "Drone" = "drone-janitor",
- "Usagi-II" = "tall2janitor",
- "Pyralis" = "Glitterfly-Janitor",
- "Decapod" = "decapod-Janitor",
- "Pneuma" = "pneuma-Janitor",
- "Tower" = "drider-Janitor"
- )
+ pto_type = PTO_CIVILIAN
/obj/item/weapon/robot_module/robot/janitor/general/New()
..()
@@ -601,18 +575,22 @@ var/global/list/robot_modules = list(
)
languages = list(
LANGUAGE_SOL_COMMON = 1,
+ LANGUAGE_TRADEBAND = 1,
LANGUAGE_UNATHI = 1,
LANGUAGE_SIIK = 1,
- LANGUAGE_AKHANI = 1,
LANGUAGE_SKRELLIAN = 1,
LANGUAGE_ROOTLOCAL = 0,
- LANGUAGE_TRADEBAND = 1,
LANGUAGE_GUTTER = 1,
LANGUAGE_SCHECHI = 1,
- LANGUAGE_EAL = 1,
- LANGUAGE_TERMINUS = 1,
LANGUAGE_SIGN = 0,
- LANGUAGE_ZADDAT = 1,
+ LANGUAGE_BIRDSONG = 1,
+ LANGUAGE_SAGARU = 1,
+ LANGUAGE_CANILUNZT = 1,
+ LANGUAGE_ECUREUILIAN= 1,
+ LANGUAGE_DAEMON = 1,
+ LANGUAGE_ENOCHIAN = 1,
+ LANGUAGE_DRUDAKAR = 1,
+ LANGUAGE_TAVAN = 1
)
/obj/item/weapon/robot_module/robot/clerical/butler
@@ -723,25 +701,8 @@ var/global/list/robot_modules = list(
name = "miner robot module"
channels = list("Supply" = 1)
networks = list(NETWORK_MINE)
- sprites = list(
- "NM-USE NanoTrasen" = "robotMine",
- "Cabeiri" = "eyebot-miner",
- "Haruka" = "marinaMN",
- "Telemachus" = "toiletbotminer",
- "WTOperator" = "sleekminer",
- "XI-GUS" = "spidermining",
- "XI-ALP" = "heavyMiner",
- "Basic" = "Miner_old",
- "Advanced Droid" = "droid-miner",
- "Treadhead" = "Miner",
- "Drone" = "drone-miner",
- "Usagi-II" = "tall2miner",
- "Pyralis" = "Glitterfly-Miner",
- "Decapod" = "decapod-Miner",
- "Pneuma" = "pneuma-Miner",
- "Tower" = "drider-Miner"
- )
supported_upgrades = list(/obj/item/borg/upgrade/pka, /obj/item/borg/upgrade/diamonddrill)
+ pto_type = PTO_CARGO
/obj/item/weapon/robot_module/robot/miner/general/New()
..()
@@ -763,23 +724,8 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/research
name = "research module"
channels = list("Science" = 1)
- sprites = list(
- "L'Ouef" = "peaceborg",
- "Cabeiri" = "eyebot-science",
- "Haruka" = "marinaSCI",
- "WTDove" = "whitespider",
- "WTOperator" = "sleekscience",
- "Droid" = "droid-science",
- "Drone" = "drone-science",
- "Handy" = "handy-science",
- "Insekt" = "insekt-Sci",
- "Usagi-II" = "tall2peace",
- "Pyralis" = "Glitterfly-Research",
- "Decapod" = "decapod-Research",
- "Pneuma" = "pneuma-Research",
- "Tower" = "drider-Research"
- )
supported_upgrades = list(/obj/item/borg/upgrade/advrped)
+ pto_type = PTO_SCIENCE
/obj/item/weapon/robot_module/robot/research/general/New()
..()
@@ -808,6 +754,9 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/pickaxe/excavationdrill(src)
//src.modules += new /obj/item/device/cataloguer(src) //VOREStation Removal
+
+ src.modules += new /obj/item/device/dogborg/sleeper/compactor/analyzer(src)
+
src.emag = new /obj/item/weapon/hand_tele(src)
var/datum/matter_synth/nanite = new /datum/matter_synth/nanite(10000)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm
index 841e61e6abf..f80200c4384 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm
@@ -1,44 +1,5 @@
/obj/item/weapon/robot_module
- languages = list(LANGUAGE_SOL_COMMON= 1,
- LANGUAGE_TRADEBAND = 1,
- LANGUAGE_UNATHI = 0,
- LANGUAGE_SIIK = 0,
- LANGUAGE_SKRELLIAN = 0,
- LANGUAGE_GUTTER = 0,
- LANGUAGE_SCHECHI = 0,
- LANGUAGE_SIGN = 0,
- LANGUAGE_BIRDSONG = 0,
- LANGUAGE_SAGARU = 0,
- LANGUAGE_CANILUNZT = 0,
- LANGUAGE_ECUREUILIAN= 0,
- LANGUAGE_DAEMON = 0,
- LANGUAGE_ENOCHIAN = 0,
- LANGUAGE_DRUDAKAR = 0
- )
var/vr_sprites = list()
- var/pto_type = null
-
-/obj/item/weapon/robot_module/robot/clerical
- languages = list(
- LANGUAGE_SOL_COMMON = 1,
- LANGUAGE_TRADEBAND = 1,
- LANGUAGE_UNATHI = 1,
- LANGUAGE_SIIK = 1,
- LANGUAGE_SKRELLIAN = 1,
- LANGUAGE_ROOTLOCAL = 0,
- LANGUAGE_GUTTER = 1,
- LANGUAGE_SCHECHI = 1,
- LANGUAGE_EAL = 1,
- LANGUAGE_SIGN = 0,
- LANGUAGE_BIRDSONG = 1,
- LANGUAGE_SAGARU = 1,
- LANGUAGE_CANILUNZT = 1,
- LANGUAGE_ECUREUILIAN= 1,
- LANGUAGE_DAEMON = 1,
- LANGUAGE_ENOCHIAN = 1,
- LANGUAGE_DRUDAKAR = 1,
- LANGUAGE_TAVAN = 1
- )
/hook/startup/proc/robot_modules_vr()
robot_modules["Medihound"] = /obj/item/weapon/robot_module/robot/medical/medihound
@@ -58,10 +19,6 @@
/obj/item/weapon/robot_module/proc/vr_new() // Any Global modules, just add them before the return (This will also affect all the borgs in this file)
return
-/obj/item/weapon/robot_module/proc/vr_add_sprites() // Adds sprites from this file into list of avialible ones for global modules
- sprites += vr_sprites
- return
-
/obj/item/weapon/robot_module/robot/medical/surgeon/vr_new() //Surgeon Bot
src.modules += new /obj/item/device/sleevemate(src) //Lets them scan people.
. = ..() //Any Global vore modules will come from here
@@ -116,19 +73,6 @@
"Feminine Humanoid" = "uptall-service"
)
-/obj/item/weapon/robot_module/robot/janitor
- pto_type = PTO_CIVILIAN
-
-/obj/item/weapon/robot_module/robot/janitor/general
- vr_sprites = list(
- "Handy" = "handy-janitor",
- "Acheron" = "mechoid-Janitor",
- "Shellguard Noble" = "Noble-CLN",
- "ZOOM-BA" = "zoomba-janitor",
- "W02M" = "worm-janitor",
- "Feminine Humanoid" = "uptall-janitor"
- )
-
/obj/item/weapon/robot_module/robot/security
pto_type = PTO_SECURITY
@@ -150,31 +94,6 @@
"Feminine Humanoid" = "uptall-security"
)
-/obj/item/weapon/robot_module/robot/miner
- pto_type = PTO_CARGO
-
-/obj/item/weapon/robot_module/robot/miner/general
- vr_sprites = list(
- "Handy" = "handy-miner",
- "Acheron" = "mechoid-Miner",
- "Shellguard Noble" = "Noble-DIG",
- "ZOOM-BA" = "zoomba-miner",
- "W02M" = "worm-miner",
- "Feminine Humanoid" = "uptall-miner"
- )
-
-/obj/item/weapon/robot_module/robot/standard
- pto_type = PTO_CIVILIAN
- vr_sprites = list(
- "Handy" = "handy-standard",
- "Acheron" = "mechoid-Standard",
- "Shellguard Noble" = "Noble-STD",
- "ZOOM-BA" = "zoomba-standard",
- "W02M" = "worm-standard",
- "Feminine Humanoid" = "uptall-standard",
- "Feminine Humanoid, Variant 2" = "uptall-standard2"
- )
-
/obj/item/weapon/robot_module/robot/engineering
pto_type = PTO_ENGINEERING
@@ -187,18 +106,6 @@
"Feminine Humanoid" = "uptall-engineering"
)
-/obj/item/weapon/robot_module/robot/research
- pto_type = PTO_SCIENCE
-
-/obj/item/weapon/robot_module/robot/research/general
- vr_sprites = list(
- "Acheron" = "mechoid-Science",
- "ZOOM-BA" = "zoomba-research",
- "XI-GUS" = "spiderscience",
- "W02M" = "worm-janitor",
- "Feminine Humanoid" = "uptall-science"
- )
-
/obj/item/weapon/robot_module/robot/security/knine
name = "k9 robot module"
sprites = list(
@@ -254,7 +161,6 @@
R.verbs |= /mob/living/silicon/robot/proc/robot_mount
R.verbs |= /mob/living/proc/toggle_rider_reins
R.verbs |= /mob/living/proc/shred_limb
- R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
/obj/item/weapon/robot_module/robot/security/knine/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
@@ -351,7 +257,6 @@
R.verbs |= /mob/living/silicon/robot/proc/robot_mount
R.verbs |= /mob/living/proc/toggle_rider_reins
R.verbs |= /mob/living/proc/shred_limb
- R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
/obj/item/weapon/robot_module/robot/medical/traumahound
@@ -435,7 +340,6 @@
R.verbs |= /mob/living/silicon/robot/proc/robot_mount
R.verbs |= /mob/living/proc/toggle_rider_reins
R.verbs |= /mob/living/proc/shred_limb
- R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
/obj/item/weapon/robot_module/robot/security/ert
@@ -481,25 +385,10 @@
R.verbs |= /mob/living/silicon/robot/proc/robot_mount
R.verbs |= /mob/living/proc/toggle_rider_reins
R.verbs |= /mob/living/proc/shred_limb
- R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
/obj/item/weapon/robot_module/robot/janitor/scrubpup
name = "Custodial Hound module"
- sprites = list(
- "Custodial Hound" = "scrubpup",
- "Janihound model V-2" = "J9",
- "Borgi" = "borgi-jani",
- "Otieborg" = "otiej",
- "Drake" = "drakejanit",
- "Raptor V-4" = "janiraptor",
- "MEKA" = "mekajani",
- "MEKA v2" = "newmekajani",
- "NIKO" = "mmekajani",
- "NIKA" = "fmekajani",
- "K4T" = "k4tjani",
- "K4Talt" = "k4tjani_alt1"
- )
can_be_pushed = 0
/obj/item/weapon/robot_module/robot/janitor/scrubpup/New(var/mob/living/silicon/robot/R)
@@ -573,24 +462,10 @@
R.verbs |= /mob/living/silicon/robot/proc/robot_mount
R.verbs |= /mob/living/proc/toggle_rider_reins
R.verbs |= /mob/living/proc/shred_limb
- R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
/obj/item/weapon/robot_module/robot/research/sciencehound
name = "Research Hound Module"
- sprites = list(
- "Research Hound" = "science",
- "Borgi" = "borgi-sci",
- "SciHound" = "scihound",
- "SciHoundDark" = "scihounddark",
- "Drake" = "drakesci",
- "Raptor V-4" = "sciraptor",
- "MEKA" = "mekasci",
- "MEKA v2" = "newmekasci",
- "NIKO" = "mmekasci",
- "NIKA" = "fmekasci",
- "K4T" = "k4tsci"
- )
can_be_pushed = 0
/obj/item/weapon/robot_module/robot/research/sciencehound/New(var/mob/living/silicon/robot/R)
@@ -663,7 +538,6 @@
R.verbs |= /mob/living/silicon/robot/proc/robot_mount
R.verbs |= /mob/living/proc/toggle_rider_reins
R.verbs |= /mob/living/proc/shred_limb
- R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
/obj/item/weapon/robot_module/robot/engineering/engiedog
@@ -819,7 +693,6 @@
R.verbs |= /mob/living/silicon/robot/proc/robot_mount
R.verbs |= /mob/living/proc/toggle_rider_reins
R.verbs |= /mob/living/proc/shred_limb
- R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
// Uses modified K9 sprites.
@@ -903,24 +776,10 @@
R.verbs |= /mob/living/silicon/robot/proc/robot_mount
R.verbs |= /mob/living/proc/toggle_rider_reins
R.verbs |= /mob/living/proc/shred_limb
- R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
/obj/item/weapon/robot_module/robot/miner/kmine
name = "Supply Hound Module"
- sprites = list(
- "KMine" = "kmine",
- "CargoHound" = "cargohound",
- "CargoHoundDark" = "cargohounddark",
- "Drake" = "drakemine",
- "Raptor V-4" = "mineraptor",
- "MEKA" = "mekamine",
- "MEKA v2" = "newmekamine",
- "NIKO" = "mmekamine",
- "NIKA" = "fmekamine",
- "K4T" = "k4tmine",
- "K4Talt" = "k4tmine_alt1"
- )
can_be_pushed = 0
/obj/item/weapon/robot_module/robot/miner/kmine/New(var/mob/living/silicon/robot/R)
@@ -967,7 +826,6 @@
R.verbs |= /mob/living/silicon/robot/proc/robot_mount
R.verbs |= /mob/living/proc/toggle_rider_reins
R.verbs |= /mob/living/proc/shred_limb
- R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
@@ -984,7 +842,6 @@
R.verbs -= /mob/living/silicon/robot/proc/robot_mount
R.verbs -= /mob/living/proc/toggle_rider_reins
R.verbs -= /mob/living/proc/shred_limb
- R.verbs -= /mob/living/silicon/robot/proc/rest_style
..()
@@ -1017,7 +874,7 @@
src.modules += new /obj/item/device/dogborg/boop_module(src)
src.modules += new /obj/item/device/dogborg/sleeper/compactor/brewer(src)
src.emag = new /obj/item/weapon/dogborg/pounce(src)
- R.verbs += /mob/living/silicon/robot/proc/reskin_booze
+ //R.verbs += /mob/living/silicon/robot/proc/reskin_booze
var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src)
M.stored_matter = 30
diff --git a/code/modules/mob/living/silicon/robot/robot_remote_control.dm b/code/modules/mob/living/silicon/robot/robot_remote_control.dm
index c605584aa00..5d119753032 100644
--- a/code/modules/mob/living/silicon/robot/robot_remote_control.dm
+++ b/code/modules/mob/living/silicon/robot/robot_remote_control.dm
@@ -32,7 +32,7 @@ GLOBAL_LIST_EMPTY(available_ai_shells)
if(!QDELETED(camera))
camera.c_tag = real_name //update the camera name too
notify_ai(ROBOT_NOTIFICATION_AI_SHELL)
- updateicon()
+ update_icon()
/mob/living/silicon/robot/proc/revert_shell()
if(!shell)
@@ -42,7 +42,7 @@ GLOBAL_LIST_EMPTY(available_ai_shells)
GLOB.available_ai_shells -= src
if(!QDELETED(camera))
camera.c_tag = real_name
- updateicon()
+ update_icon()
// This should be called before the AI client/mind is actually moved.
/mob/living/silicon/robot/proc/deploy_init(mob/living/silicon/ai/AI)
@@ -56,7 +56,7 @@ GLOBAL_LIST_EMPTY(available_ai_shells)
// Have the borg have eyes when active.
mainframe = AI
deployed = TRUE
- updateicon()
+ update_icon()
// Laws.
connected_ai = mainframe // So they share laws.
@@ -91,7 +91,7 @@ GLOBAL_LIST_EMPTY(available_ai_shells)
to_chat(src, span("notice", message))
mind.transfer_to(mainframe)
deployed = FALSE
- updateicon()
+ update_icon()
mainframe.teleop = null
mainframe.deployed_shell = null
SetName("[modtype] AI Shell [num2text(ident)]")
diff --git a/code/modules/mob/living/silicon/robot/robot_vr.dm b/code/modules/mob/living/silicon/robot/robot_vr.dm
index 534a1e1120b..2bb0c916e2d 100644
--- a/code/modules/mob/living/silicon/robot/robot_vr.dm
+++ b/code/modules/mob/living/silicon/robot/robot_vr.dm
@@ -12,8 +12,7 @@
var/notransform
var/original_icon = 'icons/mob/robots.dmi'
var/ui_style_vr = FALSE //Do we use our hud icons?
- var/sitting = FALSE
- var/bellyup = FALSE
+ var/rest_style = "Default"
does_spin = FALSE
var/wideborg_dept = 'icons/mob/widerobot_vr.dmi'
var/vr_icons = list(
@@ -89,24 +88,21 @@
/mob/living/silicon/robot/lay_down()
. = ..()
- updateicon()
+ update_icon()
-/mob/living/silicon/robot/proc/rest_style()
+/mob/living/silicon/robot/verb/rest_style()
set name = "Switch Rest Style"
- set category = "IC"
set desc = "Select your resting pose."
- sitting = FALSE
- bellyup = FALSE
- var/choice = tgui_alert(src, "Select resting pose", "Resting Pose", list("Resting", "Sitting", "Belly up"))
- switch(choice)
- if("Resting")
- return 0
- if("Sitting")
- sitting = TRUE
- if("Belly up")
- bellyup = TRUE
+ set category = "IC"
-/mob/living/silicon/robot/updateicon()
+ if(!sprite_datum || !sprite_datum.has_rest_sprites || sprite_datum.rest_sprite_options.len <= 1)
+ return
+
+ rest_style = tgui_alert(src, "Select resting pose", "Resting Pose", sprite_datum.rest_sprite_options)
+ if(!rest_style)
+ rest_style = "Default"
+/*
+/mob/living/silicon/robot/update_icon()
vr_sprite_check()
..()
if(dogborg == TRUE && stat == CONSCIOUS)
@@ -175,7 +171,7 @@
icon = 'icons/mob/robots_vr.dmi'
else if(!(icon_state in vr_icons))
icon = original_icon
-
+*/
/mob/living/silicon/robot/proc/ex_reserve_refill()
set name = "Refill Extinguisher"
set category = "Object"
diff --git a/code/modules/mob/living/silicon/robot/sprites/_sprite_datum.dm b/code/modules/mob/living/silicon/robot/sprites/_sprite_datum.dm
new file mode 100644
index 00000000000..843e75bd41f
--- /dev/null
+++ b/code/modules/mob/living/silicon/robot/sprites/_sprite_datum.dm
@@ -0,0 +1,97 @@
+/datum/robot_sprite
+ var/name
+ var/module_type
+ var/default_sprite = FALSE
+
+ var/sprite_icon
+ var/sprite_icon_state
+ var/sprite_hud_icon_state
+ var/has_eye_sprites = TRUE
+ var/has_eye_light_sprites = FALSE
+ var/has_custom_open_sprites = FALSE
+ var/has_vore_belly_sprites = FALSE
+ var/has_vore_belly_resting_sprites = FALSE
+ var/has_rest_sprites = FALSE
+ var/list/rest_sprite_options
+ var/has_dead_sprite = FALSE
+ var/has_dead_sprite_overlay = FALSE
+ var/vis_height = 32
+ var/pixel_x = 0
+
+ var/is_whitelisted = FALSE
+ var/whitelist_ckey
+ var/whitelist_charname
+
+/datum/robot_sprite/proc/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg)
+ return
+
+/datum/robot_sprite/proc/get_belly_overlay(var/mob/living/silicon/robot/ourborg)
+ return "[sprite_icon_state]-sleeper"
+
+/datum/robot_sprite/proc/get_belly_resting_overlay(var/mob/living/silicon/robot/ourborg)
+ return
+
+/datum/robot_sprite/proc/get_eyes_overlay(var/mob/living/silicon/robot/ourborg)
+ if(!(ourborg.resting && has_rest_sprites))
+ return "[sprite_icon_state]-eyes"
+ else
+ return
+
+/datum/robot_sprite/proc/get_eye_light_overlay(var/mob/living/silicon/robot/ourborg)
+ if(!(ourborg.resting && has_rest_sprites))
+ return "[sprite_icon_state]-lights"
+ else
+ return
+
+/datum/robot_sprite/proc/get_rest_sprite(var/mob/living/silicon/robot/ourborg)
+ return
+
+/datum/robot_sprite/proc/get_dead_sprite(var/mob/living/silicon/robot/ourborg)
+ return "[sprite_icon_state]-wreck"
+
+/datum/robot_sprite/proc/get_dead_sprite_overlay(var/mob/living/silicon/robot/ourborg)
+ return "wreck-overlay"
+
+/datum/robot_sprite/proc/get_open_sprite(var/mob/living/silicon/robot/ourborg)
+ if(!ourborg.opened)
+ return
+ if(ourborg.wiresexposed)
+ . = "openpanel_w"
+ else if(ourborg.cell)
+ . = "openpanel_c"
+ else
+ . = "openpanel_nc"
+
+ if(has_custom_open_sprites)
+ . = "[sprite_icon_state]-[.]"
+
+ return
+
+// Dogborgs and not-dogborgs that use dogborg stuff. Oh no.
+
+/datum/robot_sprite/dogborg
+ has_vore_belly_sprites = TRUE
+ has_rest_sprites = TRUE
+ rest_sprite_options = list("Default", "Sit", "Bellyup")
+ has_dead_sprite = TRUE
+ has_dead_sprite_overlay = TRUE
+ pixel_x = -16
+ //This is a secret tool that will help us later
+
+/datum/robot_sprite/dogborg/get_rest_sprite(var/mob/living/silicon/robot/ourborg)
+ if(!(ourborg.rest_style in rest_sprite_options))
+ ourborg.rest_style = "Default"
+ switch(ourborg.rest_style)
+ if("Sit")
+ return "[sprite_icon_state]-sit"
+ if("Bellyup")
+ return "[sprite_icon_state]-bellyup"
+ else
+ return "[sprite_icon_state]-rest"
+
+/datum/robot_sprite/dogborg/get_belly_overlay(var/mob/living/silicon/robot/ourborg)
+ return "[sprite_icon_state]-sleeper"
+
+/datum/robot_sprite/dogborg/tall
+ has_dead_sprite_overlay = FALSE
+ vis_height = 64
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/sprites/janitor.dm b/code/modules/mob/living/silicon/robot/sprites/janitor.dm
new file mode 100644
index 00000000000..2325877e89b
--- /dev/null
+++ b/code/modules/mob/living/silicon/robot/sprites/janitor.dm
@@ -0,0 +1,195 @@
+// Regular sprites
+
+/datum/robot_sprite/janitor
+ module_type = "Janitor"
+ sprite_icon = 'icons/mob/robot/janitor.dmi'
+
+/datum/robot_sprite/janitor/default
+ name = DEFAULT_ROBOT_SPRITE_NAME
+ default_sprite = TRUE
+ sprite_icon_state = "default"
+
+/datum/robot_sprite/janitor/crawler
+ name = "Arachne"
+ sprite_icon_state = "crawler"
+
+/datum/robot_sprite/janitor/eyebot
+ name = "Cabeiri"
+ sprite_icon_state = "eyebot"
+
+/datum/robot_sprite/janitor/marina
+ name = "Haruka"
+ sprite_icon_state = "marina"
+
+/datum/robot_sprite/janitor/toiletbot
+ name = "Telemachus"
+ sprite_icon_state = "toiletbot"
+
+/datum/robot_sprite/janitor/sleek
+ name = "WTOperator"
+ sprite_icon_state = "sleek"
+
+/datum/robot_sprite/janitor/heavy
+ name = "XI-ALP"
+ sprite_icon_state = "heavy"
+
+/datum/robot_sprite/janitor/old
+ name = "Basic"
+ sprite_icon_state = "old"
+ has_eye_sprites = FALSE
+
+/datum/robot_sprite/janitor/mopbot
+ name = "Mopbot"
+ sprite_icon_state = "mopbot"
+ has_eye_sprites = FALSE
+
+/datum/robot_sprite/janitor/mopgearrex
+ name = "Mop Gear Rex"
+ sprite_icon_state = "mopgearrex"
+
+/datum/robot_sprite/janitor/drone
+ name = "Drone"
+ sprite_icon_state = "drone"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/janitor/tall2
+ name = "Usagi-II"
+ sprite_icon_state = "tall2"
+
+/datum/robot_sprite/janitor/glitterfly
+ name = "Pyralis"
+ sprite_icon_state = "glitterfly"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/janitor/decapod
+ name = "Decapod"
+ sprite_icon_state = "decapod"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/janitor/pneuma
+ name = "Pneuma"
+ sprite_icon_state = "pneuma"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/janitor/drider
+ name = "Tower"
+ sprite_icon_state = "drider"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/janitor/handy
+ name = "Handy"
+ sprite_icon_state = "handy"
+
+/datum/robot_sprite/janitor/mechoid
+ name = "Acheron"
+ sprite_icon_state = "mechoid"
+
+/datum/robot_sprite/janitor/noble
+ name = "Shellguard Noble"
+ sprite_icon_state = "noble"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/janitor/zoomba
+ name = "ZOOM-BA"
+ sprite_icon_state = "zoomba"
+ has_dead_sprite = TRUE
+
+/datum/robot_sprite/janitor/worm
+ name = "W02M"
+ sprite_icon_state = "worm"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/janitor/uptall
+ name = "Feminine Humanoid"
+ sprite_icon_state = "uptall"
+
+// Wide/dogborg sprites
+
+/datum/robot_sprite/dogborg/janitor
+ module_type = "Janitor"
+ sprite_icon = 'icons/mob/robot/janitor_wide.dmi'
+
+/datum/robot_sprite/dogborg/janitor/scrubpup
+ name = "Custodial Hound"
+ sprite_icon_state = "scrubpup"
+ has_eye_light_sprites = TRUE
+
+/datum/robot_sprite/dogborg/janitor/vale
+ name = "Janihound Model V-2"
+ sprite_icon_state = "vale"
+ has_eye_light_sprites = TRUE
+
+/datum/robot_sprite/dogborg/janitor/borgi
+ name = "Borgi"
+ sprite_icon_state = "borgi"
+ has_eye_sprites = FALSE
+ has_eye_light_sprites = TRUE
+ has_dead_sprite_overlay = FALSE
+
+/datum/robot_sprite/dogborg/janitor/otie
+ name = "Otieborg"
+ sprite_icon_state = "otie"
+ has_eye_light_sprites = TRUE
+
+/datum/robot_sprite/dogborg/janitor/drake
+ name = "Drake"
+ sprite_icon_state = "drake"
+
+// Tall sprites
+
+/datum/robot_sprite/dogborg/tall/janitor
+ module_type = "Janitor"
+ sprite_icon = 'icons/mob/robot/janitor_large.dmi'
+
+/datum/robot_sprite/dogborg/tall/janitor/raptor
+ name = "Raptor V-4"
+ sprite_icon_state = "raptor"
+ rest_sprite_options = list("Default", "Bellyup")
+
+/datum/robot_sprite/dogborg/tall/janitor/meka
+ name = "MEKA"
+ sprite_icon_state = "meka"
+ has_eye_light_sprites = TRUE
+ has_custom_open_sprites = TRUE
+ has_vore_belly_sprites = FALSE
+ rest_sprite_options = list("Default", "Sit")
+
+/datum/robot_sprite/dogborg/tall/janitor/newmeka
+ name = "MEKA v2"
+ sprite_icon_state = "newmeka"
+ has_eye_light_sprites = TRUE
+ has_custom_open_sprites = TRUE
+ has_vore_belly_sprites = FALSE
+ rest_sprite_options = list("Default", "Sit")
+
+/datum/robot_sprite/dogborg/tall/janitor/mmeka
+ name = "NIKO"
+ sprite_icon_state = "mmeka"
+ has_eye_light_sprites = TRUE
+ has_custom_open_sprites = TRUE
+ has_vore_belly_sprites = FALSE
+ rest_sprite_options = list("Default", "Sit")
+
+/datum/robot_sprite/dogborg/tall/janitor/fmeka
+ name = "NIKA"
+ sprite_icon_state = "fmeka"
+ has_eye_light_sprites = TRUE
+ has_custom_open_sprites = TRUE
+ has_vore_belly_sprites = FALSE
+ rest_sprite_options = list("Default", "Sit")
+
+/datum/robot_sprite/dogborg/tall/janitor/k4t
+ name = "K4T"
+ sprite_icon_state = "k4t"
+ has_eye_light_sprites = TRUE
+ has_custom_open_sprites = TRUE
+ has_vore_belly_sprites = FALSE
+ rest_sprite_options = list("Default", "Bellyup")
+
+/datum/robot_sprite/dogborg/tall/mining/k4t_alt1
+ name = "K4Talt"
+ sprite_icon_state = "k4t_alt1"
+ has_eye_light_sprites = TRUE
+ has_custom_open_sprites = TRUE
+ has_vore_belly_sprites = FALSE
+ rest_sprite_options = list("Default", "Bellyup")
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/sprites/mining.dm b/code/modules/mob/living/silicon/robot/sprites/mining.dm
new file mode 100644
index 00000000000..ed91ff3fb6c
--- /dev/null
+++ b/code/modules/mob/living/silicon/robot/sprites/mining.dm
@@ -0,0 +1,184 @@
+// Regular sprites
+
+/datum/robot_sprite/mining
+ module_type = "Miner"
+ sprite_icon = 'icons/mob/robot/mining.dmi'
+
+/datum/robot_sprite/mining/default
+ name = DEFAULT_ROBOT_SPRITE_NAME
+ default_sprite = TRUE
+ sprite_icon_state = "default"
+
+/datum/robot_sprite/mining/eyebot
+ name = "Cabeiri"
+ sprite_icon_state = "eyebot"
+
+/datum/robot_sprite/mining/marina
+ name = "Haruka"
+ sprite_icon_state = "marina"
+
+/datum/robot_sprite/mining/toiletbot
+ name = "Telemachus"
+ sprite_icon_state = "toiletbot"
+
+/datum/robot_sprite/mining/sleek
+ name = "WTOperator"
+ sprite_icon_state = "sleek"
+
+/datum/robot_sprite/mining/spider
+ name = "XI-GUS"
+ sprite_icon_state = "spider"
+
+/datum/robot_sprite/mining/heavy
+ name = "XI-ALP"
+ sprite_icon_state = "heavy"
+
+/datum/robot_sprite/mining/old
+ name = "Basic"
+ sprite_icon_state = "old"
+ has_eye_sprites = FALSE
+
+/datum/robot_sprite/mining/droid
+ name = "Advanced Droid"
+ sprite_icon_state = "droid"
+
+/datum/robot_sprite/mining/treadhead
+ name = "Treadhead"
+ sprite_icon_state = "treadhead"
+
+/datum/robot_sprite/mining/drone
+ name = "Drone"
+ sprite_icon_state = "drone"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/mining/tall2
+ name = "Usagi-II"
+ sprite_icon_state = "tall2"
+
+/datum/robot_sprite/mining/glitterfly
+ name = "Pyralis"
+ sprite_icon_state = "glitterfly"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/mining/decapod
+ name = "Decapod"
+ sprite_icon_state = "decapod"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/mining/pneuma
+ name = "Pneuma"
+ sprite_icon_state = "pneuma"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/mining/drider
+ name = "Tower"
+ sprite_icon_state = "drider"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/mining/handy
+ name = "Handy"
+ sprite_icon_state = "handy"
+
+/datum/robot_sprite/mining/mechoid
+ name = "Acheron"
+ sprite_icon_state = "mechoid"
+
+/datum/robot_sprite/mining/noble
+ name = "Shellguard Noble"
+ sprite_icon_state = "noble"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/mining/zoomba
+ name = "ZOOM-BA"
+ sprite_icon_state = "zoomba"
+ has_dead_sprite = TRUE
+
+/datum/robot_sprite/mining/worm
+ name = "W02M"
+ sprite_icon_state = "worm"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/mining/uptall
+ name = "Feminine Humanoid"
+ sprite_icon_state = "uptall"
+
+// Wide/dogborg sprites
+
+/datum/robot_sprite/dogborg/mining
+ module_type = "Miner"
+ sprite_icon = 'icons/mob/robot/mining_wide.dmi'
+
+/datum/robot_sprite/dogborg/mining/vale
+ name = "KMine"
+ sprite_icon_state = "vale"
+ has_eye_light_sprites = TRUE
+
+/datum/robot_sprite/dogborg/mining/hound
+ name = "CargoHound"
+ sprite_icon_state = "hound"
+ has_eye_light_sprites = TRUE
+
+/datum/robot_sprite/dogborg/mining/hounddark
+ name = "CargoHoundDark"
+ sprite_icon_state = "hounddark"
+ has_eye_light_sprites = TRUE
+
+/datum/robot_sprite/dogborg/mining/drake
+ name = "Drake"
+ sprite_icon_state = "drake"
+
+// Tall sprites
+
+/datum/robot_sprite/dogborg/tall/mining
+ module_type = "Miner"
+ sprite_icon = 'icons/mob/robot/mining_large.dmi'
+
+/datum/robot_sprite/dogborg/tall/mining/raptor
+ name = "Raptor V-4"
+ sprite_icon_state = "raptor"
+ rest_sprite_options = list("Default", "Bellyup")
+
+/datum/robot_sprite/dogborg/tall/mining/meka
+ name = "MEKA"
+ sprite_icon_state = "meka"
+ has_eye_light_sprites = TRUE
+ has_custom_open_sprites = TRUE
+ has_vore_belly_sprites = FALSE
+ rest_sprite_options = list("Default", "Sit")
+
+/datum/robot_sprite/dogborg/tall/mining/newmeka
+ name = "MEKA v2"
+ sprite_icon_state = "newmeka"
+ has_eye_light_sprites = TRUE
+ has_custom_open_sprites = TRUE
+ rest_sprite_options = list("Default", "Sit")
+
+/datum/robot_sprite/dogborg/tall/mining/mmeka
+ name = "NIKO"
+ sprite_icon_state = "mmeka"
+ has_eye_light_sprites = TRUE
+ has_custom_open_sprites = TRUE
+ rest_sprite_options = list("Default", "Sit")
+
+/datum/robot_sprite/dogborg/tall/mining/fmeka
+ name = "NIKA"
+ sprite_icon_state = "fmeka"
+ has_eye_light_sprites = TRUE
+ has_custom_open_sprites = TRUE
+ rest_sprite_options = list("Default", "Sit")
+
+/datum/robot_sprite/dogborg/tall/mining/k4t
+ name = "K4T"
+ sprite_icon_state = "k4t"
+ has_eye_light_sprites = TRUE
+ has_custom_open_sprites = TRUE
+ has_vore_belly_sprites = FALSE
+ rest_sprite_options = list("Default", "Bellyup")
+
+/datum/robot_sprite/dogborg/tall/mining/k4t_alt1
+ name = "K4Talt"
+ sprite_icon_state = "k4t_alt1"
+ has_eye_light_sprites = TRUE
+ has_custom_open_sprites = TRUE
+ has_vore_belly_sprites = FALSE
+ rest_sprite_options = list("Default", "Bellyup")
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/sprites/science.dm b/code/modules/mob/living/silicon/robot/sprites/science.dm
new file mode 100644
index 00000000000..613da0472a2
--- /dev/null
+++ b/code/modules/mob/living/silicon/robot/sprites/science.dm
@@ -0,0 +1,173 @@
+// Regular sprites
+
+/datum/robot_sprite/science
+ module_type = "Research"
+ sprite_icon = 'icons/mob/robot/science.dmi'
+
+/datum/robot_sprite/science/default
+ name = DEFAULT_ROBOT_SPRITE_NAME
+ default_sprite = TRUE
+ sprite_icon_state = "default"
+
+/datum/robot_sprite/science/peaceborg
+ name = "L'Ouef"
+ sprite_icon_state = "peaceborg"
+
+/datum/robot_sprite/science/eyebot
+ name = "Cabeiri"
+ sprite_icon_state = "eyebot"
+
+/datum/robot_sprite/science/marina
+ name = "Haruka"
+ sprite_icon_state = "marina"
+
+/datum/robot_sprite/science/whitespider
+ name = "WTDove"
+ sprite_icon_state = "whitespider"
+
+/datum/robot_sprite/science/sleek
+ name = "WTOperator"
+ sprite_icon_state = "sleek"
+
+/datum/robot_sprite/science/droid
+ name = "Droid"
+ sprite_icon_state = "droid"
+
+/datum/robot_sprite/science/drone
+ name = "Drone"
+ sprite_icon_state = "drone"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/science/handy
+ name = "Handy"
+ sprite_icon_state = "handy"
+
+/datum/robot_sprite/science/insekt
+ name = "Insekt"
+ sprite_icon_state = "insekt"
+
+/datum/robot_sprite/science/tall2
+ name = "Usagi-II"
+ sprite_icon_state = "tall2"
+
+/datum/robot_sprite/science/glitterfly
+ name = "Pyralis"
+ sprite_icon_state = "glitterfly"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/science/decapod
+ name = "Decapod"
+ sprite_icon_state = "decapod"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/science/pneuma
+ name = "Pneuma"
+ sprite_icon_state = "pneuma"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/science/drider
+ name = "Tower"
+ sprite_icon_state = "drider"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/science/mechoid
+ name = "Acheron"
+ sprite_icon_state = "mechoid"
+
+/datum/robot_sprite/science/zoomba
+ name = "ZOOM-BA"
+ sprite_icon_state = "zoomba"
+ has_dead_sprite = TRUE
+
+/datum/robot_sprite/science/spider
+ name = "XI-GUS"
+ sprite_icon_state = "spider"
+
+/datum/robot_sprite/science/worm
+ name = "W02M"
+ sprite_icon_state = "worm"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/science/uptall
+ name = "Feminine Humanoid"
+ sprite_icon_state = "uptall"
+
+// Wide sprites
+
+/datum/robot_sprite/dogborg/science
+ module_type = "Research"
+ sprite_icon = 'icons/mob/robot/science_wide.dmi'
+
+/datum/robot_sprite/dogborg/science/vale
+ name = "Research Hound"
+ sprite_icon_state = "vale"
+ has_eye_light_sprites = TRUE
+
+/datum/robot_sprite/dogborg/science/borgi
+ name = "Borgi"
+ sprite_icon_state = "borgi"
+ has_eye_sprites = FALSE
+ has_eye_light_sprites = TRUE
+ has_dead_sprite_overlay = FALSE
+
+/datum/robot_sprite/dogborg/science/hound
+ name = "SciHound"
+ sprite_icon_state = "hound"
+ has_eye_light_sprites = TRUE
+
+/datum/robot_sprite/dogborg/science/darkhound
+ name = "SciHoundDark"
+ sprite_icon_state = "darkhound"
+ has_eye_light_sprites = TRUE
+
+/datum/robot_sprite/dogborg/science/drake
+ name = "Drake"
+ sprite_icon_state = "drake"
+
+// Tall sprites
+
+/datum/robot_sprite/dogborg/tall/science
+ module_type = "Research"
+ sprite_icon = 'icons/mob/robot/science_large.dmi'
+
+/datum/robot_sprite/dogborg/tall/science/raptor
+ name = "Raptor V-4"
+ sprite_icon_state = "raptor"
+ rest_sprite_options = list("Default", "Bellyup")
+
+/datum/robot_sprite/dogborg/tall/science/meka
+ name = "MEKA"
+ sprite_icon_state = "meka"
+ has_eye_light_sprites = TRUE
+ has_custom_open_sprites = TRUE
+ has_vore_belly_sprites = FALSE
+ rest_sprite_options = list("Default", "Sit")
+
+/datum/robot_sprite/dogborg/tall/science/newmeka
+ name = "MEKA v2"
+ sprite_icon_state = "newmeka"
+ has_eye_light_sprites = TRUE
+ has_custom_open_sprites = TRUE
+ rest_sprite_options = list("Default", "Sit")
+
+/datum/robot_sprite/dogborg/tall/science/mmeka
+ name = "NIKO"
+ sprite_icon_state = "mmeka"
+ has_eye_light_sprites = TRUE
+ has_custom_open_sprites = TRUE
+ rest_sprite_options = list("Default", "Sit")
+
+/datum/robot_sprite/dogborg/tall/science/fmeka
+ name = "NIKA"
+ sprite_icon_state = "fmeka"
+ has_eye_light_sprites = TRUE
+ has_custom_open_sprites = TRUE
+ rest_sprite_options = list("Default", "Sit")
+
+/datum/robot_sprite/dogborg/tall/science/k4t
+ name = "K4T"
+ sprite_icon_state = "k4t"
+ has_eye_light_sprites = TRUE
+ has_custom_open_sprites = TRUE
+ has_vore_belly_sprites = FALSE
+ rest_sprite_options = list("Default", "Bellyup")
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/sprites/standard.dm b/code/modules/mob/living/silicon/robot/sprites/standard.dm
new file mode 100644
index 00000000000..d37ff1dd861
--- /dev/null
+++ b/code/modules/mob/living/silicon/robot/sprites/standard.dm
@@ -0,0 +1,112 @@
+/datum/robot_sprite/standard
+ module_type = "Standard"
+ sprite_icon = 'icons/mob/robot/standard.dmi'
+
+/datum/robot_sprite/standard/default
+ name = DEFAULT_ROBOT_SPRITE_NAME
+ default_sprite = TRUE
+ sprite_icon_state = "default"
+
+/datum/robot_sprite/standard/eyebot
+ name = "Cabeiri"
+ sprite_icon_state = "eyebot"
+
+/datum/robot_sprite/standard/marina
+ name = "Haruka"
+ sprite_icon_state = "marina"
+
+/datum/robot_sprite/standard/tallflower
+ name = "Usagi"
+ sprite_icon_state = "tallflower"
+
+/datum/robot_sprite/standard/toiletbot
+ name = "Telemachus"
+ sprite_icon_state = "toiletbot"
+
+/datum/robot_sprite/standard/sleek
+ name = "WTOperator"
+ sprite_icon_state = "sleek"
+
+/datum/robot_sprite/standard/omoikane
+ name = "WTOmni"
+ sprite_icon_state = "omoikane"
+
+/datum/robot_sprite/standard/spider //There's like 4 different spider borg types, but this one has seniority
+ name = "XI-GUS"
+ sprite_icon_state = "spider"
+
+/datum/robot_sprite/standard/heavy
+ name = "XI-ALP"
+ sprite_icon_state = "heavy"
+
+/datum/robot_sprite/standard/old
+ name = "Basic"
+ sprite_icon_state = "old"
+
+/datum/robot_sprite/standard/droid
+ name = "Android"
+ sprite_icon_state = "droid"
+
+/datum/robot_sprite/standard/drone
+ name = "Drone"
+ sprite_icon_state = "drone"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/standard/insekt
+ name = "Insekt"
+ sprite_icon_state = "insekt"
+
+/datum/robot_sprite/standard/tall2
+ name = "Usagi-II"
+ sprite_icon_state = "tall2"
+
+/datum/robot_sprite/standard/glitterfly
+ name = "Pyralis"
+ sprite_icon_state = "glitterfly"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/standard/decapod
+ name = "Decapod"
+ sprite_icon_state = "decapod"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/standard/pneuma
+ name = "Pneuma"
+ sprite_icon_state = "pneuma"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/standard/drider
+ name = "Tower"
+ sprite_icon_state = "drider"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/standard/handy
+ name = "Handy"
+ sprite_icon_state = "handy"
+
+/datum/robot_sprite/standard/mechoid
+ name = "Acheron"
+ sprite_icon_state = "mechoid"
+
+/datum/robot_sprite/standard/noble
+ name = "Shellguard Noble"
+ sprite_icon_state = "noble"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/standard/zoomba
+ name = "ZOOM-BA"
+ sprite_icon_state = "zoomba"
+ has_dead_sprite = TRUE
+
+/datum/robot_sprite/standard/worm
+ name = "W02M"
+ sprite_icon_state = "worm"
+ has_custom_open_sprites = TRUE
+
+/datum/robot_sprite/standard/uptall
+ name = "Feminine Humanoid"
+ sprite_icon_state = "uptall"
+
+/datum/robot_sprite/standard/uptall2
+ name = "Feminine Humanoid, Variant 2"
+ sprite_icon_state = "uptall2"
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/_thinktank.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/_thinktank.dm
index d9d38faae22..cf0a9c778f7 100644
--- a/code/modules/mob/living/silicon/robot/subtypes/thinktank/_thinktank.dm
+++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/_thinktank.dm
@@ -69,7 +69,7 @@
if(!mmi)
mmi = new /obj/item/device/mmi/digital/robot(src)
SetName("inactive [initial(name)]")
- updateicon()
+ update_icon()
// Copypasting from root proc to avoid calling ..() and accidentally creating duplicate armour etc.
/mob/living/silicon/robot/platform/initialize_components()
diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_icon.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_icon.dm
index 3a9882ff089..a8056885df0 100644
--- a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_icon.dm
+++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_icon.dm
@@ -1,7 +1,7 @@
/mob/living/silicon/robot/platform/update_icon()
- updateicon()
+ update_icon()
-/mob/living/silicon/robot/platform/updateicon()
+/mob/living/silicon/robot/platform/update_icon()
cut_overlays()
underlays.Cut()
@@ -106,4 +106,4 @@
else
. = FALSE
if(.)
- updateicon()
+ update_icon()
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/possum.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/possum.dm
index b9297da8527..14774781090 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/possum.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/possum.dm
@@ -168,7 +168,7 @@
poss_ai.play_dead_until = world.time + rand(1 MINUTE, 2 MINUTES)
update_icon()
-/mob/living/simple_mob/animal/passive/opossum/updateicon()
+/mob/living/simple_mob/animal/passive/opossum/update_icon()
update_icon()
/mob/living/simple_mob/animal/passive/opossum/update_icon()
diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm
index 83910850e3d..f8e2ce6220b 100644
--- a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm
@@ -103,7 +103,7 @@
real_name = name
for(var/spell in construct_spells)
src.add_spell(new spell, "const_spell_ready")
- updateicon()
+ update_icon()
/*
/mob/living/simple_mob/construct/update_icon()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index f8e44c02c1c..219a11db305 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1003,9 +1003,6 @@
return 0
-/mob/proc/updateicon()
- return
-
// Please always use this proc, never just set the var directly.
/mob/proc/set_stat(var/new_stat)
. = (stat != new_stat)
diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index f748baf6e86..20241cdc2c5 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -68,7 +68,7 @@ GLOBAL_LIST_EMPTY(all_turbines)
circ1 = null
circ2 = null
-/obj/machinery/power/generator/proc/updateicon()
+/obj/machinery/power/generator/update_icon()
icon_state = anchored ? "teg-assembled" : "teg-unassembled"
cut_overlays()
if (circ1)
@@ -163,7 +163,7 @@ GLOBAL_LIST_EMPTY(all_turbines)
genlev = 1
if(genlev != lastgenlev)
lastgenlev = genlev
- updateicon()
+ update_icon()
add_avail(effective_gen)
/obj/machinery/power/generator/attack_ai(mob/user)
@@ -184,7 +184,7 @@ GLOBAL_LIST_EMPTY(all_turbines)
reconnect()
lastgenlev = 0
effective_gen = 0
- updateicon()
+ update_icon()
else
..()
@@ -238,7 +238,7 @@ GLOBAL_LIST_EMPTY(all_turbines)
/obj/machinery/power/generator/power_change()
..()
- updateicon()
+ update_icon()
/obj/machinery/power/generator/verb/rotate_clockwise()
diff --git a/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m_cells.dm b/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m_cells.dm
index b7bc0f1597f..e66908daef7 100644
--- a/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m_cells.dm
+++ b/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m_cells.dm
@@ -323,7 +323,7 @@
if(istype(target, /mob/living/carbon/human))
target.resize(0.5)
target.show_message("The beam fires into your body, changing your size!")
- target.updateicon()
+ target.update_icon()
else
return 1
@@ -337,7 +337,7 @@
if(istype(target, /mob/living/carbon/human))
target.resize(2.0)
target.show_message("The beam fires into your body, changing your size!")
- target.updateicon()
+ target.update_icon()
else
return 1
@@ -351,6 +351,6 @@
if(istype(target, /mob/living/carbon/human))
target.resize(1)
target.show_message("The beam fires into your body, changing your size!")
- target.updateicon()
+ target.update_icon()
else
return 1
diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm
index 86d298d0542..551a251a50b 100644
--- a/code/modules/recycling/disposal-construction.dm
+++ b/code/modules/recycling/disposal-construction.dm
@@ -303,7 +303,7 @@
P.base_icon_state = base_state
P.set_dir(dir)
P.dpdir = dpdir
- P.updateicon()
+ P.update_icon()
//Needs some special treatment ;)
if(ptype==DISPOSAL_PIPE_SORTER || ptype==DISPOSAL_PIPE_SORTER_FLIPPED)
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 51666ab3c00..d900a3fc0a4 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -839,13 +839,13 @@
// change visibility status and force update of icon
/obj/structure/disposalpipe/hide(var/intact)
invisibility = intact ? 101: 0 // hide if floor is intact
- updateicon()
+ update_icon()
// update actual icon_state depending on visibility
// if invisible, append "f" to icon_state to show faded version
// this will be revealed if a T-scanner is used
// if visible, use regular icon_state
-/obj/structure/disposalpipe/proc/updateicon()
+/obj/structure/disposalpipe/update_icon()
/* if(invisibility) //we hide things with alpha now, no need for transparent icons
icon_state = "[base_icon_state]f"
else
diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm
index eba4bb12a73..9660d976913 100644
--- a/code/modules/vore/eating/belly_obj_vr.dm
+++ b/code/modules/vore/eating/belly_obj_vr.dm
@@ -1180,7 +1180,7 @@
owner.update_icon()
for(var/mob/living/M in contents)
M.updateVRPanel()
- owner.updateicon()
+ owner.update_icon()
//Autotransfer callback
/obj/belly/proc/check_autotransfer(var/prey, var/autotransferlocation)
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index b39e87ddd97..ecfb0cfaad3 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -661,7 +661,7 @@
else
belly.nom_mob(prey, user)
- user.updateicon()
+ user.update_icon()
// Inform Admins
if(pred == user)
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index 61938990944..7a621d31ca8 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -1147,7 +1147,7 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
if(belly_choice == null)
return FALSE
host.vore_selected.silicon_belly_overlay_preference = belly_choice
- host.updateicon()
+ host.update_icon()
. = TRUE
if("b_min_belly_number_flat")
var/new_min_belly = tgui_input_number(user, "Choose the amount of prey your belly must contain \
@@ -1157,7 +1157,7 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
return FALSE
var/new_new_min_belly = CLAMP(new_min_belly, 1, 100) //Clamping at 100 rather than infinity. Should be close to infinity tho.
host.vore_selected.visible_belly_minimum_prey = new_new_min_belly
- host.updateicon()
+ host.update_icon()
. = TRUE
if("b_min_belly_prey_size")
var/new_belly_size = tgui_input_number(user, "Choose the required size prey must be to trigger belly overlay, \
@@ -1169,11 +1169,11 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
else
var/new_new_belly_size = CLAMP(new_belly_size, 25, 200)
host.vore_selected.overlay_min_prey_size = (new_new_belly_size/100)
- host.updateicon()
+ host.update_icon()
. = TRUE
if("b_override_min_belly_prey_size")
host.vore_selected.override_min_prey_size = !host.vore_selected.override_min_prey_size
- host.updateicon()
+ host.update_icon()
. = TRUE
if("b_min_belly_number_override")
var/new_min_prey = tgui_input_number(user, "Choose the amount of prey your belly must contain to override min prey size \
@@ -1183,7 +1183,7 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
return FALSE
var/new_new_min_prey = CLAMP(new_min_prey, 1, 100) //Clamping at 100 rather than infinity. Should be close to infinity tho.
host.vore_selected.override_min_prey_num = new_new_min_prey
- host.updateicon()
+ host.update_icon()
. = TRUE
if("b_fancy_sound")
host.vore_selected.fancy_vore = !host.vore_selected.fancy_vore
diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/code/modules/vore/resizing/sizegun_vr.dm
index 4088c22aed8..f75ecaeed02 100644
--- a/code/modules/vore/resizing/sizegun_vr.dm
+++ b/code/modules/vore/resizing/sizegun_vr.dm
@@ -156,7 +156,7 @@
return
if(!M.resize(set_size, uncapped = M.has_large_resize_bounds(), ignore_prefs = ignoring_prefs))
to_chat(M, "The beam fires into your body, changing your size!")
- M.updateicon()
+ M.update_icon()
return
return 1
@@ -176,7 +176,7 @@
M.resize(set_size, uncapped = TRUE, ignore_prefs = TRUE) // Always ignores prefs, caution is advisable
to_chat(M, "The beam fires into your body, changing your size!")
- M.updateicon()
+ M.update_icon()
return
return 1
diff --git a/icons/mob/robot/janitor.dmi b/icons/mob/robot/janitor.dmi
new file mode 100644
index 00000000000..52cdca4b26b
Binary files /dev/null and b/icons/mob/robot/janitor.dmi differ
diff --git a/icons/mob/robot/janitor_large.dmi b/icons/mob/robot/janitor_large.dmi
new file mode 100644
index 00000000000..092c221d48a
Binary files /dev/null and b/icons/mob/robot/janitor_large.dmi differ
diff --git a/icons/mob/robot/janitor_wide.dmi b/icons/mob/robot/janitor_wide.dmi
new file mode 100644
index 00000000000..0e878aa8a4b
Binary files /dev/null and b/icons/mob/robot/janitor_wide.dmi differ
diff --git a/icons/mob/robot/mining.dmi b/icons/mob/robot/mining.dmi
new file mode 100644
index 00000000000..1454a4471ec
Binary files /dev/null and b/icons/mob/robot/mining.dmi differ
diff --git a/icons/mob/robot/mining_large.dmi b/icons/mob/robot/mining_large.dmi
new file mode 100644
index 00000000000..be011eeb854
Binary files /dev/null and b/icons/mob/robot/mining_large.dmi differ
diff --git a/icons/mob/robot/mining_wide.dmi b/icons/mob/robot/mining_wide.dmi
new file mode 100644
index 00000000000..a8055a0d842
Binary files /dev/null and b/icons/mob/robot/mining_wide.dmi differ
diff --git a/icons/mob/robot/science.dmi b/icons/mob/robot/science.dmi
new file mode 100644
index 00000000000..ac1ff9dc16d
Binary files /dev/null and b/icons/mob/robot/science.dmi differ
diff --git a/icons/mob/robot/science_large.dmi b/icons/mob/robot/science_large.dmi
new file mode 100644
index 00000000000..1434d63f441
Binary files /dev/null and b/icons/mob/robot/science_large.dmi differ
diff --git a/icons/mob/robot/science_wide.dmi b/icons/mob/robot/science_wide.dmi
new file mode 100644
index 00000000000..6a37be0edd6
Binary files /dev/null and b/icons/mob/robot/science_wide.dmi differ
diff --git a/icons/mob/robot/standard.dmi b/icons/mob/robot/standard.dmi
new file mode 100644
index 00000000000..bbcb4ef1628
Binary files /dev/null and b/icons/mob/robot/standard.dmi differ
diff --git a/icons/mob/robots_vr.dmi b/icons/mob/robots_vr.dmi
index e5efcc435d7..2c5cb7b3ee5 100644
Binary files a/icons/mob/robots_vr.dmi and b/icons/mob/robots_vr.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index 4ba0ccfaf0c..991f57a8bf8 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -285,6 +285,7 @@
#include "code\controllers\subsystems\plants.dm"
#include "code\controllers\subsystems\player_tips.dm"
#include "code\controllers\subsystems\radiation.dm"
+#include "code\controllers\subsystems\robot_sprites.dm"
#include "code\controllers\subsystems\shuttles.dm"
#include "code\controllers\subsystems\skybox.dm"
#include "code\controllers\subsystems\sounds.dm"
@@ -3028,6 +3029,11 @@
#include "code\modules\mob\living\silicon\robot\robot_modules\station_vr.dm"
#include "code\modules\mob\living\silicon\robot\robot_modules\swarm.dm"
#include "code\modules\mob\living\silicon\robot\robot_modules\syndicate.dm"
+#include "code\modules\mob\living\silicon\robot\sprites\_sprite_datum.dm"
+#include "code\modules\mob\living\silicon\robot\sprites\janitor.dm"
+#include "code\modules\mob\living\silicon\robot\sprites\mining.dm"
+#include "code\modules\mob\living\silicon\robot\sprites\science.dm"
+#include "code\modules\mob\living\silicon\robot\sprites\standard.dm"
#include "code\modules\mob\living\silicon\robot\subtypes\gravekeeper.dm"
#include "code\modules\mob\living\silicon\robot\subtypes\lost_drone.dm"
#include "code\modules\mob\living\silicon\robot\subtypes\lost_drone_vr.dm"
@@ -4230,13 +4236,13 @@
#include "maps\expedition_vr\beach\submaps\mountains.dm"
#include "maps\expedition_vr\beach\submaps\mountains_areas.dm"
#include "maps\gateway_archive_vr\blackmarketpackers.dm"
-#include "maps\groundbase\groundbase.dm"
#include "maps\southern_cross\items\clothing\sc_accessory.dm"
#include "maps\southern_cross\items\clothing\sc_suit.dm"
#include "maps\southern_cross\items\clothing\sc_under.dm"
#include "maps\southern_cross\loadout\loadout_suit.dm"
#include "maps\southern_cross\loadout\loadout_uniform.dm"
#include "maps\southern_cross\loadout\loadout_vr.dm"
+#include "maps\stellar_delight\stellar_delight.dm"
#include "maps\submaps\_helpers.dm"
#include "maps\submaps\_readme.dm"
#include "maps\submaps\engine_submaps\engine.dm"