diff --git a/aurorastation.dme b/aurorastation.dme
index f2d45634685..aed35498254 100644
--- a/aurorastation.dme
+++ b/aurorastation.dme
@@ -1247,6 +1247,7 @@
#include "code\modules\background\accent\accent.dm"
#include "code\modules\background\accent\diona.dm"
#include "code\modules\background\accent\human.dm"
+#include "code\modules\background\accent\misc.dm"
#include "code\modules\background\accent\silicon.dm"
#include "code\modules\background\accent\skrell.dm"
#include "code\modules\background\accent\tajara.dm"
diff --git a/code/__defines/radio.dm b/code/__defines/radio.dm
index 903d4df8115..a11d478698d 100644
--- a/code/__defines/radio.dm
+++ b/code/__defines/radio.dm
@@ -9,6 +9,7 @@
#define AI_FREQ 1343
#define DTH_FREQ 1341
#define SYND_FREQ 1213
+#define BLSP_FREQ 1253
#define NINJ_FREQ 1255
#define BURG_FREQ 1257
#define RAID_FREQ 1277
@@ -40,6 +41,7 @@ var/list/radiochannels = list(
"Special Ops" = DTH_FREQ,
"Mercenary" = SYND_FREQ,
"Ninja" = NINJ_FREQ,
+ "Bluespace" = BLSP_FREQ,
"Burglar" = BURG_FREQ,
"Raider" = RAID_FREQ,
"Supply" = SUP_FREQ,
@@ -68,6 +70,7 @@ var/list/ANTAG_FREQS = list(
SYND_FREQ,
RAID_FREQ,
NINJ_FREQ,
+ BLSP_FREQ,
BURG_FREQ
)
diff --git a/code/controllers/subsystems/radio.dm b/code/controllers/subsystems/radio.dm
index ad94bedff30..3418e6a6f07 100644
--- a/code/controllers/subsystems/radio.dm
+++ b/code/controllers/subsystems/radio.dm
@@ -187,6 +187,8 @@ var/datum/controller/subsystem/radio/SSradio
. = "srvradio"
if (ENT_FREQ) //entertainment
. = "entradio"
+ if (BLSP_FREQ)
+ . = "bluespaceradio"
else
if(DEPT_FREQS_ASSOC[fstr])
. = "deptradio"
diff --git a/code/controllers/subsystems/statistics.dm b/code/controllers/subsystems/statistics.dm
index 7a372a17955..a7e16d228ec 100644
--- a/code/controllers/subsystems/statistics.dm
+++ b/code/controllers/subsystems/statistics.dm
@@ -22,6 +22,7 @@
var/list/msg_raider = list()
var/list/msg_burglar = list()
var/list/msg_ninja = list()
+ var/list/msg_bluespace = list()
var/list/msg_cargo = list()
var/list/msg_service = list()
diff --git a/code/datums/outfits/outfit_antag.dm b/code/datums/outfits/outfit_antag.dm
index d98549c2fb1..2035fbe8476 100644
--- a/code/datums/outfits/outfit_antag.dm
+++ b/code/datums/outfits/outfit_antag.dm
@@ -508,14 +508,24 @@
suit = /obj/item/clothing/suit/chameleon/wizard
head = /obj/item/clothing/head/softcap/chameleon/wizard
shoes = /obj/item/clothing/shoes/chameleon/wizard
- l_ear = /obj/item/device/radio/headset
+ l_ear = /obj/item/device/radio/headset/bluespace
r_pocket = /obj/item/teleportation_scroll
l_hand = /obj/item/spellbook
+ id = /obj/item/card/id/bluespace
backpack_contents = list(
/obj/item/storage/box = 1
)
+/datum/outfit/admin/wizard/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/card/id/W = H.wear_id
+ if(W)
+ W.registered_name = H.real_name
+
/datum/outfit/admin/wizard/apprentice
name = "Space Wizard Apprentice"
l_hand = null
@@ -576,7 +586,7 @@
back = /obj/item/gun/energy/staff/focus
belt = /obj/item/storage/belt/fannypack/component
gloves = null
- l_ear = /obj/item/device/radio/headset/raider
+ l_ear = /obj/item/device/radio/headset/bluespace
l_pocket = null
r_pocket = null
id = /obj/item/storage/wallet/random
@@ -640,3 +650,9 @@
passport.name = "[H.real_name]'s Passport"
if(W)
W.handle_item_insertion(passport)
+
+/datum/outfit/admin/golem
+ name = "Bluespace Golem"
+ allow_backbag_choice = FALSE
+
+ l_ear = /obj/item/device/radio/headset/bluespace
diff --git a/code/defines/procs/radio.dm b/code/defines/procs/radio.dm
index 90638792079..2aeaf2eed45 100644
--- a/code/defines/procs/radio.dm
+++ b/code/defines/procs/radio.dm
@@ -16,14 +16,18 @@
/proc/get_frequency_name(var/display_freq)
var/freq_text
- // the name of the channel
- if(display_freq in ANTAG_FREQS)
- freq_text = "#unkn"
- else
- for(var/channel in radiochannels)
- if(radiochannels[channel] == display_freq)
- freq_text = channel
- break
+ if(display_freq == BLSP_FREQ)
+ freq_text = "Bluespace"
+
+ if(!freq_text)
+ // the name of the channel
+ if(display_freq in ANTAG_FREQS)
+ freq_text = "#unkn"
+ else
+ for(var/channel in radiochannels)
+ if(radiochannels[channel] == display_freq)
+ freq_text = channel
+ break
// --- If the frequency has not been assigned a name, just use the frequency as the name ---
if(!freq_text)
diff --git a/code/game/antagonist/antagonist.dm b/code/game/antagonist/antagonist.dm
index 2251e980f90..f18e30d4997 100644
--- a/code/game/antagonist/antagonist.dm
+++ b/code/game/antagonist/antagonist.dm
@@ -72,6 +72,7 @@
// ID card stuff.
var/default_access = list()
var/id_type = /obj/item/card/id
+ var/id_card // a reference to the id_card we spawned with
/datum/antagonist/New()
diff --git a/code/game/antagonist/antagonist_create.dm b/code/game/antagonist/antagonist_create.dm
index 34930a03265..f2ec00e5d2f 100644
--- a/code/game/antagonist/antagonist_create.dm
+++ b/code/game/antagonist/antagonist_create.dm
@@ -47,15 +47,17 @@
switch(freq)
if(NINJ_FREQ)
- R = new/obj/item/device/radio/headset/ninja(player)
+ R = new /obj/item/device/radio/headset/ninja(player)
+ if(BLSP_FREQ)
+ R = new /obj/item/device/radio/headset/bluespace(player)
if(BURG_FREQ)
R = new /obj/item/device/radio/headset/burglar(player)
if(SYND_FREQ)
- R = new/obj/item/device/radio/headset/syndicate(player)
+ R = new /obj/item/device/radio/headset/syndicate(player)
if(RAID_FREQ)
- R = new/obj/item/device/radio/headset/raider(player)
+ R = new /obj/item/device/radio/headset/raider(player)
else
- R = new/obj/item/device/radio/headset(player)
+ R = new /obj/item/device/radio/headset(player)
R.set_frequency(freq)
R.set_frequency(freq)
@@ -136,4 +138,4 @@
player.dna.real_name = newname
if(player.mind) player.mind.name = player.name
// Update any ID cards.
- update_access(player)
+ update_access(player)
\ No newline at end of file
diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm
index a666184f0e3..37a6be3ce80 100644
--- a/code/game/antagonist/outsider/wizard.dm
+++ b/code/game/antagonist/outsider/wizard.dm
@@ -96,10 +96,17 @@ var/datum/antagonist/wizard/wizards
player.preEquipOutfit(/datum/outfit/admin/wizard, FALSE)
player.equipOutfit(/datum/outfit/admin/wizard, FALSE)
+ if(player.wear_id)
+ id_card = player.wear_id
player.force_update_limbs()
player.update_eyes()
player.regenerate_icons()
+/datum/antagonist/wizard/set_antag_name(var/mob/living/player)
+ ..()
+ if(id_card)
+ addtimer(CALLBACK(player, /mob/.proc/set_id_info, id_card), 1 SECOND)
+
/datum/antagonist/wizard/check_victory()
var/survivor
for(var/datum/mind/player in current_antagonists)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 7f351489c2b..081e4ec18ee 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -959,7 +959,7 @@ About the new airlock wires panel:
if(!src.density)
return
- H.visible_message("\The [H] begins to pry open \the [src]!", "You begin to pry open \the [src]!", "You hear the sound of an airlock being forced open.")
+ H.visible_message("[H] begins to pry open \the [src]!", SPAN_NOTICE("You begin to pry open \the [src]!"), SPAN_WARNING("You hear the sound of an airlock being forced open."))
if(!do_after(H, 120, 1, act_target = src))
return
@@ -967,7 +967,7 @@ About the new airlock wires panel:
src.do_animate("spark")
src.stat |= BROKEN
var/check = src.open(1)
- H.visible_message("\The [H] slices \the [src]'s controls[check ? ", ripping it open!" : ", breaking it!"]", "You slice \the [src]'s controls[check ? ", ripping it open!" : ", breaking it!"]", "You hear something sparking.")
+ H.visible_message("[H] slices \the [src]'s controls, [check ? "ripping it open" : "breaking it"]!", SPAN_NOTICE("You slice \the [src]'s controls, [check ? "ripping it open" : "breaking it"]!"), SPAN_WARNING("You hear something sparking."))
return
if(src.p_open)
user.set_machine(src)
@@ -1416,7 +1416,7 @@ About the new airlock wires panel:
use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people
//if the door is unpowered then it doesn't make sense to hear the woosh of a pneumatic actuator
- if(arePowerSystemsOn())
+ if(!forced && arePowerSystemsOn())
playsound(src.loc, open_sound_powered, 60, 1)
else
playsound(src.loc, open_sound_unpowered, 60, 1)
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index 09ef9b57b18..0115aa13d72 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -393,6 +393,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
SSfeedback.msg_raider += blackbox_msg
if(NINJ_FREQ)
SSfeedback.msg_ninja += blackbox_msg
+ if(BLSP_FREQ)
+ SSfeedback.msg_bluespace += blackbox_msg
if(BURG_FREQ)
SSfeedback.msg_burglar += blackbox_msg
if(SUP_FREQ)
@@ -583,6 +585,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
SSfeedback.msg_raider += blackbox_msg
if(NINJ_FREQ)
SSfeedback.msg_ninja += blackbox_msg
+ if(BLSP_FREQ)
+ SSfeedback.msg_bluespace += blackbox_msg
if(BURG_FREQ)
SSfeedback.msg_burglar += blackbox_msg
if(SUP_FREQ)
diff --git a/code/game/objects/items/devices/radio/_radio_defines.dm b/code/game/objects/items/devices/radio/_radio_defines.dm
index bd656e8a4fc..c277e4b8746 100644
--- a/code/game/objects/items/devices/radio/_radio_defines.dm
+++ b/code/game/objects/items/devices/radio/_radio_defines.dm
@@ -15,4 +15,5 @@
#define CHANNEL_RAIDER "Raider"
#define CHANNEL_MERCENARY "Mercenary"
#define CHANNEL_NINJA "Ninja"
+#define CHANNEL_BLUESPACE "Bluespace"
#define CHANNEL_BURGLAR "Burglar"
\ No newline at end of file
diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm
index b6799a50684..822bcf5af5a 100644
--- a/code/game/objects/items/devices/radio/encryptionkey.dm
+++ b/code/game/objects/items/devices/radio/encryptionkey.dm
@@ -40,6 +40,14 @@
origin_tech = list(TECH_ILLEGAL = 3)
syndie = TRUE
+/obj/item/device/encryptionkey/bluespace
+ name = "bluespace encryption key"
+ desc = "A non-sensical mimickry of a standard encryption key, in the form of an elongated bluespace crystal. It seems to function."
+ icon_state = "bs_cyperkey"
+ additional_channels = list(CHANNEL_BLUESPACE = TRUE)
+ origin_tech = list(TECH_BLUESPACE = 3)
+ syndie = TRUE
+
/obj/item/device/encryptionkey/binary
icon_state = "cypherkey"
translate_binary = TRUE
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index c338d9d7a97..a7e683c33b2 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -425,7 +425,7 @@
/obj/item/device/radio/headset/raider
icon_state = "syn_headset"
origin_tech = list(TECH_ILLEGAL = 2)
- syndie = 1
+ syndie = TRUE
ks1type = /obj/item/device/encryptionkey/raider
/obj/item/device/radio/headset/burglar
@@ -437,9 +437,17 @@
/obj/item/device/radio/headset/ninja
icon_state = "syn_headset"
origin_tech = list(TECH_ILLEGAL = 3)
- syndie = 1
+ syndie = TRUE
ks1type = /obj/item/device/encryptionkey/ninja
+/obj/item/device/radio/headset/bluespace
+ name = "bluespace headset"
+ desc = "A bluespace mockery of a standard Nanotrasen headset. It seems to function. Takes encryption keys."
+ icon_state = "bs_headset"
+ item_state = "com_headset" // laziness or genius, you decide
+ syndie = TRUE
+ ks1type = /obj/item/device/encryptionkey/bluespace
+
/obj/item/device/radio/headset/binary
origin_tech = list(TECH_ILLEGAL = 3)
ks2type = /obj/item/device/encryptionkey/binary
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index 139814a8907..09b3cebdc51 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -109,6 +109,9 @@ var/const/NO_EMAG_ACT = -50
var/icon/side
var/mining_points //miners gotta eat
+ var/can_copy_access = FALSE
+ var/access_copy_msg
+
var/flipped = 0
var/wear_over_suit = 0
@@ -267,10 +270,21 @@ var/const/NO_EMAG_ACT = -50
religion = H.religion
age = H.age
src.add_fingerprint(H)
- to_chat(user, "Biometric Imprinting Successful!.")
+ to_chat(user, SPAN_NOTICE("Biometric Imprinting Successful!"))
return 1
return ..()
+/obj/item/card/id/attackby(obj/item/W, mob/user)
+ if(istype(W, /obj/item/card/id))
+ var/obj/item/card/id/ID = W
+ if(ID.can_copy_access)
+ ID.access |= src.access
+ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
+ if(player_is_antag(user.mind) || isgolem(user))
+ to_chat(user, SPAN_NOTICE(ID.access_copy_msg))
+ return
+ . = ..()
+
/obj/item/card/id/GetAccess()
return access
@@ -572,3 +586,24 @@ var/const/NO_EMAG_ACT = -50
desc = "A stylized plastic card, belonging to one of the many specialists at Einstein Engines."
icon_state = "einstein_card"
overlay_state = "einstein_card"
+
+/obj/item/card/id/bluespace
+ name = "bluespace identification card"
+ desc = "A bizarre imitation of Nanotrasen identification cards. It seems to function normally as well."
+ desc_antag = "Access can be copied from other ID cards by clicking on them."
+ icon_state = "crystalid"
+
+/obj/item/card/id/bluespace/update_name()
+ return
+
+/obj/item/card/id/bluespace/attack_self(mob/user)
+ if(registered_name == user.real_name)
+ switch(alert("Would you like edit the ID label, or show it?", "Show or Edit?", "Edit", "Show"))
+ if("Edit")
+ var/new_label = sanitize(input(user, "Enter the new label.", "Set Label") as text|null, 12)
+ if(new_label)
+ name = "[initial(name)] ([new_label])"
+ if("Show")
+ ..()
+ else
+ ..()
diff --git a/code/game/objects/items/weapons/cards_ids_syndicate.dm b/code/game/objects/items/weapons/cards_ids_syndicate.dm
index 820b812557e..ed753eb6974 100644
--- a/code/game/objects/items/weapons/cards_ids_syndicate.dm
+++ b/code/game/objects/items/weapons/cards_ids_syndicate.dm
@@ -2,6 +2,8 @@
name = "agent card"
assignment = "Agent"
origin_tech = list(TECH_ILLEGAL = 3)
+ can_copy_access = TRUE
+ access_copy_msg = "The microscanner activates as you pass it over the ID, copying its access."
var/charge = 10000
var/electronic_warfare = FALSE
var/image/obfuscation_image
@@ -37,14 +39,6 @@
/obj/item/card/id/syndicate/prevent_tracking()
return electronic_warfare
-/obj/item/card/id/syndicate/afterattack(var/obj/item/O as obj, mob/user as mob, proximity)
- if(!proximity) return
- if(istype(O, /obj/item/card/id))
- var/obj/item/card/id/I = O
- src.access |= I.access
- if(player_is_antag(user.mind))
- to_chat(user, "The microscanner activates as you pass it over the ID, copying its access.")
-
/obj/item/card/id/syndicate/attack_self(mob/user as mob)
// We use the fact that registered_name is not unset should the owner be vaporized, to ensure the id doesn't magically become unlocked.
if(!registered_user && register_user(user))
diff --git a/code/modules/background/accent/misc.dm b/code/modules/background/accent/misc.dm
new file mode 100644
index 00000000000..d566a906be5
--- /dev/null
+++ b/code/modules/background/accent/misc.dm
@@ -0,0 +1,4 @@
+/datum/accent/bluespace
+ name = ACCENT_BLUESPACE
+ description = "A peculiar accent. It seems familiar and unknown at the same time. It provokes the same feeling as having a word at the tip of your tongue."
+ tag_icon = "bluespace"
\ No newline at end of file
diff --git a/code/modules/background/defines.dm b/code/modules/background/defines.dm
index 584143a8903..5a255a53c69 100644
--- a/code/modules/background/defines.dm
+++ b/code/modules/background/defines.dm
@@ -103,6 +103,8 @@
#define ACCENT_TTS "Text-to-Speech"
+#define ACCENT_BLUESPACE "Bluespace"
+
#define ACCENT_ZORA "Zo'rane"
#define ACCENT_KLAX "K'laxane"
#define ACCENT_CTHUR "C'thuric"
diff --git a/code/modules/mob/living/carbon/human/species/station/golem.dm b/code/modules/mob/living/carbon/human/species/station/golem.dm
index d14517f14ba..43c2c974a39 100644
--- a/code/modules/mob/living/carbon/human/species/station/golem.dm
+++ b/code/modules/mob/living/carbon/human/species/station/golem.dm
@@ -25,6 +25,7 @@ var/global/list/golem_types = list(SPECIES_GOLEM_COAL,
eyes = "blank_eyes"
bodytype = BODYTYPE_GOLEM
+ default_accent = ACCENT_BLUESPACE
language = "Ceti Basic"
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch)
@@ -168,6 +169,8 @@ var/global/list/golem_types = list(SPECIES_GOLEM_COAL,
icobase = 'icons/mob/human_races/golem/r_bronze.dmi'
deform = 'icons/mob/human_races/golem/r_bronze.dmi'
+ bodytype = "Human"
+
meat_type = /obj/item/stack/material/bronze
siemens_coefficient = 1.5
@@ -313,6 +316,8 @@ var/global/list/golem_types = list(SPECIES_GOLEM_COAL,
icobase = 'icons/mob/human_races/golem/r_cloth.dmi'
deform = 'icons/mob/human_races/golem/r_cloth.dmi'
+ bodytype = "Human"
+
slowdown = -2
brute_mod = 1.5
diff --git a/code/modules/mob/living/carbon/slime/items.dm b/code/modules/mob/living/carbon/slime/items.dm
index f9b7f2ecc02..3c554a22cef 100644
--- a/code/modules/mob/living/carbon/slime/items.dm
+++ b/code/modules/mob/living/carbon/slime/items.dm
@@ -269,6 +269,9 @@
G.set_species(golem_type)
G.name = G.species.get_random_name()
G.real_name = G.name
+ G.accent = G.species.default_accent
+ G.preEquipOutfit(/datum/outfit/admin/golem, FALSE)
+ G.equipOutfit(/datum/outfit/admin/golem, FALSE)
if(wizardy)
wizard_golems.add_antagonist(G.mind, TRUE, TRUE, FALSE, TRUE, TRUE)
else
diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm
index 940ed7ee136..40e7b609329 100644
--- a/code/modules/mob/living/carbon/slime/slime.dm
+++ b/code/modules/mob/living/carbon/slime/slime.dm
@@ -11,6 +11,7 @@
maxHealth = 150
health = 150
gender = NEUTER
+ accent = ACCENT_BLUESPACE
update_icon = 0
nutrition = 700
@@ -76,6 +77,9 @@
verbs += /mob/living/proc/ventcrawl
+ add_language(LANGUAGE_TCB)
+ set_default_language(LANGUAGE_TCB)
+
src.colour = colour
number = rand(1, 1000)
name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])"
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index c34a0a6c3e0..0db22628f19 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -15,6 +15,7 @@ var/list/department_radio_keys = list(
":t" = "Mercenary", ".t" = "Mercenary",
":x" = "Raider", ".x" = "Raider",
":b" = "Burglar", ".b" = "Burglar",
+ ":j" = "Bluespace", ".j" = "Bluespace",
":q" = "Ninja", ".q" = "Ninja",
":u" = "Supply", ".u" = "Supply",
":v" = "Service", ".v" = "Service",
@@ -36,6 +37,7 @@ var/list/department_radio_keys = list(
":T" = "Mercenary", ".T" = "Mercenary",
":X" = "Raider", ".X" = "Raider",
":B" = "Burglar", ".B" = "Burglar",
+ ":J" = "Bluespace", ".J" = "Bluespace",
":Q" = "Ninja", ".Q" = "Ninja",
":U" = "Supply", ".U" = "Supply",
":V" = "Service", ".V" = "Service",
diff --git a/code/modules/mob/living/simple_animal/friendly/slime.dm b/code/modules/mob/living/simple_animal/friendly/slime.dm
index 25539dbf626..8982ca53017 100644
--- a/code/modules/mob/living/simple_animal/friendly/slime.dm
+++ b/code/modules/mob/living/simple_animal/friendly/slime.dm
@@ -8,6 +8,7 @@
speak_emote = list("chirps")
health = 100
maxHealth = 100
+ accent = ACCENT_BLUESPACE
response_help = "pets"
response_disarm = "shoos"
response_harm = "stomps on"
@@ -16,6 +17,11 @@
mob_size = 3
composition_reagent = /decl/reagent/slimejelly
+/mob/living/simple_animal/slime/Initialize()
+ . = ..()
+ add_language(LANGUAGE_TCB)
+ set_default_language(LANGUAGE_TCB)
+
/mob/living/simple_animal/slime/can_force_feed(var/feeder, var/food, var/feedback)
if(feedback)
to_chat(feeder, "Where do you intend to put \the [food]? \The [src] doesn't have a mouth!")
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 0e0ea9854f4..90347741f23 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -45,6 +45,13 @@
return 1
return 0
+/proc/isgolem(A)
+ if(ishuman(A))
+ var/mob/living/carbon/human/H = A
+ if(istype(H.species, /datum/species/golem))
+ return TRUE
+ return FALSE
+
/proc/isunathi(A)
if(ishuman(A))
var/mob/living/carbon/human/H = A
diff --git a/code/stylesheet.dm b/code/stylesheet.dm
index d126917ea4d..27ece95b6a0 100644
--- a/code/stylesheet.dm
+++ b/code/stylesheet.dm
@@ -47,6 +47,7 @@ em {font-style: normal;font-weight: bold;}
/* Radio Channels */
.comradio {color: #193A7A;}
.syndradio {color: #6D3F40;}
+.bluespaceradio {color: #1883A3;}
.centradio {color: #5C5C8A;}
.airadio {color: #FF00FF;}
.entradio {color: #bd893c;}
diff --git a/html/changelogs/geeves-golem_stuff.yml b/html/changelogs/geeves-golem_stuff.yml
new file mode 100644
index 00000000000..65e93bb3a8b
--- /dev/null
+++ b/html/changelogs/geeves-golem_stuff.yml
@@ -0,0 +1,9 @@
+author: Geeves, Stryker
+
+delete-after: True
+
+changes:
+ - rscadd: "Added bluespace headsets, IDs, and accents."
+ - rscadd: "Wizards now spawn with bluespace headsets and IDs. The headset can intercept communications."
+ - rscadd: "Slimes and bluespace golems have the bluespace accent."
+ - tweak: "Forced open airlocks now play the unpowered opening sound."
\ No newline at end of file
diff --git a/icons/accent_tags.dmi b/icons/accent_tags.dmi
index 6f1a38ea6bf..ab5dfe42c32 100644
Binary files a/icons/accent_tags.dmi and b/icons/accent_tags.dmi differ
diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi
index 32bd7322e52..16a61ca69b1 100644
Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ
diff --git a/icons/obj/radio.dmi b/icons/obj/radio.dmi
index 102a9159fe1..73e2583bb7b 100644
Binary files a/icons/obj/radio.dmi and b/icons/obj/radio.dmi differ
diff --git a/nano/templates/radio_basic.tmpl b/nano/templates/radio_basic.tmpl
index 27be9b27bf9..8502be49cb3 100644
--- a/nano/templates/radio_basic.tmpl
+++ b/nano/templates/radio_basic.tmpl
@@ -8,6 +8,7 @@ Used In File(s): /code/game/objects/item/devices/radio/radio.dm
.deptradio {color: #993399;}
.comradio {color: #395A9A;}
.syndradio {color: #6D3F40;}
+ .bluespaceradio {color: #1883A3;}
.centradio {color: #5C5C8A;}
.airadio {color: #FF00FF;}
.secradio {color: #A30000;}