diff --git a/code/__defines/span_vr.dm b/code/__defines/span_vr.dm
index 85e9672dae..618fd52b3d 100644
--- a/code/__defines/span_vr.dm
+++ b/code/__defines/span_vr.dm
@@ -1,121 +1,89 @@
-// Sorted alphabetically
-// Shamelessly yoinked from TGCode, luv u folks
-#define span_abductor(str) ("" + str + "")
-#define span_admin(str) ("" + str + "")
-#define span_adminhelp(str) ("" + str + "")
-#define span_adminnotice(str) ("" + str + "")
-#define span_adminobserverooc(str) ("" + str + "")
-#define span_adminooc(str) ("" + str + "")
-#define span_adminsay(str) ("" + str + "")
-#define span_aiprivradio(str) ("" + str + "")
-#define span_alert(str) ("" + str + "")
-#define span_alertalien(str) ("" + str + "")
-#define span_alertsyndie(str) ("" + str + "")
-#define span_alertwarning(str) ("" + str + "")
-#define span_alien(str) ("" + str + "")
-#define span_announce(str) ("" + str + "")
-#define span_big(str) ("" + str + "")
-#define span_bigicon(str) ("" + str + "")
-#define span_binarysay(str) ("" + str + "")
-#define span_blue(str) ("" + str + "")
-#define span_blueteamradio(str) ("" + str + "")
-#define span_bold(str) ("" + str + "")
-#define span_boldannounce(str) ("" + str + "")
-#define span_boldnotice(str) ("" + str + "")
-#define span_boldwarning(str) ("" + str + "")
-#define span_centcomradio(str) ("" + str + "")
-#define span_changeling(str) ("" + str + "")
-#define span_clown(str) ("" + str + "")
-#define span_colossus(str) ("" + str + "")
-#define span_command_headset(str) ("" + str + "")
-#define span_comradio(str) ("" + str + "")
-#define span_cult(str) ("" + str + "")
-#define span_cultbold(str) ("" + str + "")
-#define span_cultboldtalic(str) ("" + str + "")
-#define span_cultitalic(str) ("" + str + "")
-#define span_cultlarge(str) ("" + str + "")
-#define span_danger(str) ("" + str + "")
-#define span_deadsay(str) ("" + str + "")
-#define span_deconversion_message(str) ("" + str + "")
-#define span_drone(str) ("" + str + "")
-#define span_engradio(str) ("" + str + "")
-#define span_extremelybig(str) ("" + str + "")
-#define span_ghostalert(str) ("" + str + "")
-#define span_green(str) ("" + str + "")
-#define span_greenannounce(str) ("" + str + "")
-#define span_greenteamradio(str) ("" + str + "")
-#define span_greentext(str) ("" + str + "")
-#define span_hear(str) ("" + str + "")
-#define span_hidden(str) ("" + str + "")
-#define span_hierophant(str) ("" + str + "")
-#define span_hierophant_warning(str) ("" + str + "")
-#define span_highlight(str) ("" + str + "")
-#define span_his_grace(str) ("" + str + "")
-#define span_holoparasite(str) ("" + str + "")
-#define span_hypnophrase(str) ("" + str + "")
-#define span_icon(str) ("" + str + "")
-#define span_info(str) ("" + str + "")
-#define span_interface(str) ("" + str + "")
-#define span_looc(str) ("" + str + "")
-#define span_medal(str) ("" + str + "")
-#define span_medradio(str) ("" + str + "")
-#define span_memo(str) ("" + str + "")
-#define span_memoedit(str) ("" + str + "")
-#define span_mind_control(str) ("" + str + "")
-#define span_minorannounce(str) ("" + str + "")
-#define span_monkey(str) ("" + str + "")
-#define span_monkeyhive(str) ("" + str + "")
-#define span_monkeylead(str) ("" + str + "")
-#define span_name(str) ("" + str + "")
-#define span_narsie(str) ("" + str + "")
-#define span_narsiesmall(str) ("" + str + "")
-#define span_nicegreen(str) ("" + str + "")
-#define span_notice(str) ("" + str + "")
-#define span_noticealien(str) ("" + str + "")
-#define span_ooc(str) ("" + str + "")
-#define span_papyrus(str) ("" + str + "")
-#define span_phobia(str) ("" + str + "")
-#define span_prefix(str) ("" + str + "")
-#define span_purple(str) ("" + str + "")
-#define span_radio(str) ("" + str + "")
-#define span_reallybig(str) ("" + str + "")
-#define span_red(str) ("" + str + "")
-#define span_redteamradio(str) ("" + str + "")
-#define span_redtext(str) ("" + str + "")
-#define span_resonate(str) ("" + str + "")
-#define span_revenbignotice(str) ("" + str + "")
-#define span_revenboldnotice(str) ("" + str + "")
-#define span_revendanger(str) ("" + str + "")
-#define span_revenminor(str) ("" + str + "")
-#define span_revennotice(str) ("" + str + "")
-#define span_revenwarning(str) ("" + str + "")
-#define span_robot(str) ("" + str + "")
-#define span_rose(str) ("" + str + "")
-#define span_sans(str) ("" + str + "")
-#define span_sciradio(str) ("" + str + "")
-#define span_secradio(str) ("" + str + "")
-#define span_servradio(str) ("" + str + "")
-#define span_singing(str) ("" + str + "")
-#define span_slime(str) ("" + str + "")
-#define span_small(str) ("" + str + "")
-#define span_smallnotice(str) ("" + str + "")
-#define span_smallnoticeital(str) ("" + str + "")
-#define span_spider(str) ("" + str + "")
-#define span_suicide(str) ("" + str + "")
-#define span_suppradio(str) ("" + str + "")
-#define span_swarmer(str) ("" + str + "")
-#define span_syndradio(str) ("" + str + "")
-#define span_tape_recorder(str) ("" + str + "")
-#define span_tinynotice(str) ("" + str + "")
-#define span_tinynoticeital(str) ("" + str + "")
-#define span_unconscious(str) ("" + str + "")
-#define span_userdanger(str) ("" + str + "")
-#define span_warning(str) ("" + str + "")
-#define span_yell(str) ("" + str + "")
-#define span_yellowteamradio(str) ("" + str + ""
-
-// VORE Specific stuff after this point
// Sorted by however I felt like it
-#define span_game_say(str) ("" + str + ""
-#define span_emote_subtle(str) ("" + str + ""
-#define span_emote(str) ("" + str + ""
\ No newline at end of file
+// We have two other ways of doing this, so why not a third. This one atleast has more span options.
+#define span_ooc(str) ("" + str + "")
+#define span_looc(str) ("" + str + "")
+
+#define span_deadsay(str) ("" + str + "")
+#define span_radio(str) ("" + str + "")
+#define span_deptradio(str) ("" + str + "")
+#define span_newscaster(str) ("" + str + "")
+
+#define span_comradio(str) ("" + str + "")
+#define span_syndradio(str) ("" + str + "")
+#define span_centradio(str) ("" + str + ""
+#define span_airadio(str) ("" + str + "")
+#define span_entradio(str) ("" + str + "")
+
+#define span_secradio(str) ("" + str + "")
+#define span_engradio(str) ("" + str + "")
+#define span_medradio(str) ("" + str + "")
+#define span_sciradio(str) ("" + str + "")
+#define span_supradio(str) ("" + str + ""
+#define span_srvradio(str) ("" + str + "")
+#define span_expradio(str) ("" + str + "")
+
+#define span_name(str) ("" + str + "")
+#define span_say(str) ("" + str + "")
+#define span_alert(str) ("" + str + "")
+#define span_ghostalert(str) ("" + str + "")
+
+
+#define span_emote(str) ("" + str + "")
+#define span_emote_subtle(str) ("" + str + "")
+
+#define span_attack(str) ("" + str + "")
+#define span_moderate(str) ("" + str + "")
+#define span_disarm(str) ("" + str + "")
+#define span_passive(str) ("" + str + "")
+
+#define span_critical(str) ("" + str + "")
+#define span_danger(str) ("" + str + "")
+#define span_warning(str) ("" + str + "")
+#define span_rose(str) ("" + str + "")
+#define span_info(str) ("" + str + ""
+#define span_notice(str) ("" + str + "")
+#define span_alium(str) ("" + str + "")
+#define span_cult(str) ("" + str + "")
+
+#define span_reflex_shoot(str) ("" + str + "")
+
+/* Languages */
+
+#define span_alien(str) ("" + str + "")
+#define span_tajaran(str) ("" + str + "")
+#define span_tajaran_signlang(str) ("" + str + "")
+#define span_akhani(str) ("" + str + "")
+#define span_skrell(str) ("" + str + "")
+#define span_skrellfar(str) ("" + str + "")
+#define span_soghun(str) ("" + str + "")
+#define span_solcom(str) ("" + str + "")
+#define span_changeling(str) ("" + str + "")
+#define span_sergal(str) ("" + str + "")
+#define span_birdsongc(str) ("" + str + "")
+#define span_vulpkanin(str) ("" + str + "")
+#define span_enochian(str) ("" + str + "")
+#define span_daemon(str) ("" + str + "")
+#define span_bug(str) ("" + str + "")
+#define span_vox(str) ("" + str + "")
+#define span_zaddat(str) ("" + str + "")
+#define span_promethean(str) ("" + str + "")
+#define span_rough(str) ("" + str + "")
+#define span_say_quote(str) ("" + str + "")
+#define span_terminus(str) ("" + str + "")
+#define span_interface(str) ("" + str + "")
+#define span_spacer(str) ("" + str + "")
+#define span_blob(str) ("" + str + "")
+
+#define span_debug_error(str) ("" + str + "")
+#define span_debug_warning(str) ("" + str + "")
+#define span_debug_info(str) ("" + str + "")
+#define span_debug_debug(str) ("" + str + "")
+#define span_debug_trace(str) ("" + str + "")
+
+#define span_black(str) ("" + str + "")
+#define span_darkgray(str) ("" + str + "")
+#define span_gray(str) ("" + str + "")
+#define span_red(str) ("" + str + "")
+#define span_orange(str) ("" + str + "")
+#define span_blue(str) ("" + str + "")
+#define span_green(str) ("" + str + "")
\ No newline at end of file
diff --git a/code/datums/managed_browsers/changelingevolution.dm b/code/datums/managed_browsers/changelingevolution.dm
new file mode 100644
index 0000000000..4458604b9b
--- /dev/null
+++ b/code/datums/managed_browsers/changelingevolution.dm
@@ -0,0 +1,167 @@
+/client
+ var/datum/managed_browser/changelingevolution/changelingevolution = null
+
+/datum/managed_browser/changelingevolution
+ base_browser_id = "evolution_tree"
+ title = "Evolution Tree"
+ size_x = 480
+ size_y = 600
+ var/textbody = null
+
+/datum/managed_browser/changelingevolution/New(client/new_client)
+ if(!new_client.mob || !new_client.mob.mind || !new_client.mob.mind.changeling)
+ message_admins("[new_client] tried to access changeling evolutions while not changeling.")
+ qdel(src)
+
+ ..()
+
+/datum/managed_browser/changelingevolution/Destroy()
+ if(my_client)
+ my_client.changelingevolution = null
+ return ..()
+
+/datum/managed_browser/changelingevolution/get_html()
+ var/list/dat = list("
")
+ var/geneticpoints_current = my_client.mob.mind.changeling.geneticpoints
+ var/geneticpoints_max = my_client.mob.mind.changeling.max_geneticpoints
+
+ dat += "Genetic Points Available: [geneticpoints_current] / [geneticpoints_max]
"
+ dat += "Obtain more by feeding on your own kind.
"
+ dat += "What am I?
"
+ dat += "Inherent"
+ dat += "Armor"
+ dat += "Weapons"
+ dat += "Stings"
+ dat += "Shrieks"
+ dat += "Health"
+ dat += "Enhancements"
+ if(textbody)
+ dat += ""
+ dat += "[textbody]"
+ dat += "
"
+ dat += ""
+
+ return dat.Join()
+
+/datum/managed_browser/changelingevolution/Topic(href, href_list[])
+ if(!my_client)
+ return FALSE
+
+ if(href_list["close"])
+ return
+
+ if(href_list["inherent"])
+ generate_abilitylist(CHANGELING_POWER_INHERENT)
+
+ if(href_list["armor"])
+ generate_abilitylist(CHANGELING_POWER_ARMOR)
+
+ if(href_list["weapons"])
+ generate_abilitylist(CHANGELING_POWER_WEAPONS)
+
+ if(href_list["stings"])
+ generate_abilitylist(CHANGELING_POWER_STINGS)
+
+ if(href_list["shrieks"])
+ generate_abilitylist(CHANGELING_POWER_SHRIEKS)
+
+ if(href_list["health"])
+ generate_abilitylist(CHANGELING_POWER_HEALTH)
+
+ if(href_list["enhancements"])
+ generate_abilitylist(CHANGELING_POWER_ENHANCEMENTS)
+
+ if(href_list["evolve"])
+ var/datum/mind/M = my_client.mob.mind
+ var/datum/changeling/C = my_client.mob.mind.changeling
+ var/datum/power/changeling/Thepower = href_list["evolve"]
+
+ for (var/datum/power/changeling/P in powerinstances)
+ if(P.name == Thepower)
+ Thepower = P
+ break
+
+ if(!istype(M))
+ return
+
+ if(Thepower == null)
+ to_chat(M.current, "Purchase failed. Inform a dev of this error.")
+ return
+
+ if(Thepower in C.purchased_powers)
+ to_chat(M.current, "You already have this ability! Inform a dev of this error.") /// Should not be possible
+ return
+
+ if(C.geneticpoints < Thepower.genomecost)
+ to_chat(M.current, "We cannot evolve this... yet. We must acquire more DNA.")
+ return
+
+ C.purchased_powers += Thepower /// Set it to purchased
+ C.geneticpoints -= Thepower.genomecost
+ generate_abilitylist(Thepower.power_category) /// Refresh the UI
+
+ my_client.mob.mind.changeling.purchasePower(M, Thepower)
+
+ if(href_list["tutorial"])
+ textbody = "What am I?
|
"
+ textbody += ""
+ textbody += "You are a changeling, a creature empowered with genetic-based abilities that change your body in bizarre ways."
+ textbody += " It's probably best the crew doesn't know about your power -- at least not right away.
"
+ textbody += "What a changeling is, however, is up to you. Are you a strange alien impersonating crew? Are you a"
+ textbody += " normal crewmember infected with a parasite? An experiment gone wrong? It's up to you to make the story.
"
+ textbody += "Of course, you need to know how it works to begin with.
"
+ textbody += "Your abilities cost chemicals that your body will slowly regenerate with varying speeds based on enhancements obtained."
+ textbody += " There are a set of inherent abilities you will always have while the rest may be purchased through genomes.
"
+ textbody += "You may obtain more genomes if you find another changeling and absorb them, but this is not required. If you've found "
+ textbody += "your abilities aren't to your liking, you have up to two re-adapts available, and these may be refilled by absorbing anyone -- including monkeys.
"
+ textbody += "Good luck and remember, killing isn't always the end goal."
+ display()
+
+/datum/managed_browser/changelingevolution/proc/generate_abilitylist(cat)
+ var/list/ability_list = list()
+ var/info = ""
+ var/catname = ""
+ for(var/datum/power/changeling/P in powerinstances)
+ if(P.power_category == cat)
+ ability_list[++ability_list.len] = P
+ switch(cat)
+ if(CHANGELING_POWER_INHERENT)
+ catname = "Inherent"
+ info = "These powers are inherent to your kind and will always be accessible, provided you have the chemicals to use them."
+ if(CHANGELING_POWER_ARMOR)
+ catname = "Armor"
+ info = "These abilities will provide you with space protection -- and potentially armor."
+ if(CHANGELING_POWER_WEAPONS)
+ catname = "Weapons"
+ info = "These abilities will provide you the means to fight back."
+ if(CHANGELING_POWER_STINGS)
+ catname = "Stings"
+ info = "These abilities provide the means to sting organic beings for various effects -- though you must be close enough, and they must have exposed flesh."
+ if(CHANGELING_POWER_SHRIEKS)
+ catname = "Shrieks"
+ info = "These abilities enhance your vocal chords, empowering your screams."
+ if(CHANGELING_POWER_HEALTH)
+ catname = "Health"
+ info = "These abilities will enhance your health or aid you in mending your wounds."
+ if(CHANGELING_POWER_ENHANCEMENTS)
+ catname = "Enhancements"
+ info = "These abilities enhance you in various ways."
+ create_textbody(ability_list, catname, info)
+
+/datum/managed_browser/changelingevolution/proc/create_textbody(ability_list, cat, catinfo)
+ textbody = " |
[cat] Skills
|
"
+ textbody += "[catinfo]
|
"
+ for(var/A in ability_list)
+ var/datum/power/changeling/powerdata = A
+ textbody += "[initial(powerdata.name)] "
+ textbody += "[initial(powerdata.desc)]
"
+ textbody += "[powerdata.helptext] "
+ if(powerdata.enhancedtext != "")
+ textbody += "WHEN EHANCED: [powerdata.enhancedtext] "
+ if(powerdata in my_client.mob.mind.changeling.purchased_powers)
+ textbody += "This ability is already evolved!"
+ else if(cat != "Inherent")
+ textbody += "Cost: [powerdata.genomecost]"
+ textbody += "Evolve"
+ textbody += " |
"
+ display()
diff --git a/code/game/objects/random/misc_vr.dm b/code/game/objects/random/misc_vr.dm
index 3044ac31d6..21ca60771a 100644
--- a/code/game/objects/random/misc_vr.dm
+++ b/code/game/objects/random/misc_vr.dm
@@ -191,3 +191,27 @@
prob(1);/obj/item/weapon/flame/lighter/random,
prob(1);/obj/item/weapon/storage/wallet/random,
prob(1);/obj/random/cutout)
+
+/obj/random/instrument
+ name = "random instrument"
+ desc = "This is a random instrument."
+ icon = 'icons/obj/musician.dmi'
+ icon_state = "violin"
+ spawn_nothing_percentage = 0
+
+/obj/random/instrument/item_to_spawn()
+ return pick(prob(5);/obj/item/instrument/violin,
+ prob(5);/obj/item/instrument/banjo,
+ prob(5);/obj/item/instrument/guitar,
+ prob(5);/obj/item/instrument/eguitar,
+ prob(5);/obj/item/instrument/accordion,
+ prob(5);/obj/item/instrument/trumpet,
+ prob(5);/obj/item/instrument/saxophone,
+ prob(5);/obj/item/instrument/trombone,
+ prob(5);/obj/item/instrument/recorder,
+ prob(5);/obj/item/instrument/harmonica,
+ prob(1);/obj/item/instrument/bikehorn,
+ prob(5);/obj/item/instrument/piano_synth,
+ prob(5);/obj/item/instrument/glockenspiel,
+ prob(1);/obj/item/instrument/musicalmoth
+ )
diff --git a/code/modules/emotes/definitions/human.dm b/code/modules/emotes/definitions/human.dm
index a35d4f1d67..b8571fa164 100644
--- a/code/modules/emotes/definitions/human.dm
+++ b/code/modules/emotes/definitions/human.dm
@@ -11,7 +11,7 @@
. = ..()
/decl/emote/human/deathgasp/get_emote_message_3p(var/mob/living/carbon/human/user)
- return "USER [user.species.get_death_message(user)]"
+ return "[user.species.get_death_message(user)]"
/decl/emote/human/swish
key = "swish"
diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm
index 0f102110e8..c213161a3b 100644
--- a/code/modules/vehicles/cargo_train.dm
+++ b/code/modules/vehicles/cargo_train.dm
@@ -129,6 +129,8 @@
/obj/vehicle/train/engine/turn_on()
if(!key)
return
+ if(!cell)
+ return
else
..()
update_stats()
@@ -230,7 +232,9 @@
if (on)
to_chat(usr, "You start [src]'s engine.")
else
- if(cell.charge < charge_use)
+ if(!cell)
+ to_chat(usr, "[src] doesn't appear to have a power cell!")
+ else if(cell.charge < charge_use)
to_chat(usr, "[src] is out of power.")
else
to_chat(usr, "[src]'s engine won't start.")
diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm
index dcb909a2f5..b9eada1d12 100644
--- a/code/modules/vehicles/vehicle.dm
+++ b/code/modules/vehicles/vehicle.dm
@@ -193,6 +193,8 @@
/obj/vehicle/proc/turn_on()
if(!mechanical || stat)
return FALSE
+ if(!cell)
+ return FALSE
if(powered && cell.charge < charge_use)
return FALSE
on = 1
diff --git a/code/modules/xenoarcheaology/effects/poltergeist.dm b/code/modules/xenoarcheaology/effects/poltergeist.dm
index 5b270fd38c..c0cc034938 100644
--- a/code/modules/xenoarcheaology/effects/poltergeist.dm
+++ b/code/modules/xenoarcheaology/effects/poltergeist.dm
@@ -15,7 +15,7 @@
if(valid_targets.len)
var/obj/obj_to_throw = pick(valid_targets)
- obj_to_throw.visible_message("\The [obj_to_throw] levitates, befure hurtling toward [target]!")
+ obj_to_throw.visible_message("\The [obj_to_throw] levitates, before hurtling toward [target]!")
obj_to_throw.throw_at(target, world.view, min(40, damage * GetAnomalySusceptibility(target)))
/datum/artifact_effect/poltergeist/DoEffectTouch(var/mob/user)
diff --git a/maps/groundbase/gb-z1.dmm b/maps/groundbase/gb-z1.dmm
index d3715c2ee1..00ee0c63c3 100644
--- a/maps/groundbase/gb-z1.dmm
+++ b/maps/groundbase/gb-z1.dmm
@@ -48,6 +48,9 @@
/obj/machinery/computer/arcade/battle{
dir = 8
},
+/obj/structure/sign/painting/library_secure{
+ pixel_x = 30
+ },
/turf/simulated/floor/tiled/dark,
/area/groundbase/civilian/bar)
"ah" = (
@@ -1137,6 +1140,12 @@
/obj/effect/landmark/start/medical,
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/office)
+"cT" = (
+/obj/structure/sign/painting/library_secure{
+ pixel_y = 30
+ },
+/turf/simulated/floor/tiled/dark,
+/area/groundbase/civilian/bar)
"cU" = (
/obj/item/weapon/stock_parts/manipulator,
/obj/item/weapon/stock_parts/matter_bin,
@@ -2067,6 +2076,9 @@
/obj/machinery/firealarm{
dir = 4
},
+/obj/structure/sign/painting/library_secure{
+ pixel_y = -30
+ },
/turf/simulated/floor/lino,
/area/groundbase/civilian/cafe)
"fk" = (
@@ -2797,6 +2809,13 @@
"gW" = (
/turf/simulated/floor/lino,
/area/groundbase/civilian/cafe)
+"gX" = (
+/obj/structure/table/bench/padded,
+/obj/structure/sign/painting/library_secure{
+ pixel_x = -30
+ },
+/turf/simulated/floor/tiled/dark,
+/area/groundbase/civilian/bar)
"gY" = (
/obj/machinery/telecomms/hub/preset/groundbase,
/turf/simulated/floor/tiled/dark{
@@ -3067,6 +3086,9 @@
/turf/simulated/wall,
/area/groundbase/medical/resleeving)
"hM" = (
+/obj/structure/sign/painting/library_secure{
+ pixel_y = -30
+ },
/turf/simulated/floor/tiled/dark,
/area/groundbase/medical/autoresleeving)
"hN" = (
@@ -3447,6 +3469,12 @@
"iH" = (
/turf/simulated/wall/r_wall,
/area/maintenance/groundbase/level1/netunnel)
+"iI" = (
+/obj/structure/sign/painting/library_secure{
+ pixel_y = 30
+ },
+/turf/simulated/floor/tiled/dark,
+/area/groundbase/security/briefing)
"iJ" = (
/obj/structure/table/rack{
dir = 8;
@@ -3484,6 +3512,15 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/engineering/engine)
+"iO" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 8
+ },
+/obj/structure/sign/painting/library_secure{
+ pixel_y = -30
+ },
+/turf/simulated/floor/tiled/white,
+/area/groundbase/medical/equipment)
"iP" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
@@ -6106,6 +6143,10 @@
dir = 4
},
/obj/machinery/light,
+/obj/structure/table/reinforced,
+/obj/machinery/photocopier/faxmachine{
+ department = "Engineering"
+ },
/turf/simulated/floor/tiled,
/area/groundbase/engineering/lobby)
"pf" = (
@@ -6829,6 +6870,9 @@
/obj/structure/bed/chair/wood{
dir = 4
},
+/obj/structure/sign/painting/library_secure{
+ pixel_y = 30
+ },
/turf/simulated/floor/wood,
/area/groundbase/civilian/cafe)
"qY" = (
@@ -7258,6 +7302,15 @@
/obj/machinery/portable_atmospherics/powered/pump/filled,
/turf/simulated/floor/tiled/techmaint,
/area/groundbase/engineering/atmos)
+"rS" = (
+/obj/structure/closet/walllocker_double{
+ pixel_y = 28
+ },
+/obj/random/instrument,
+/obj/random/instrument,
+/obj/item/instrument/guitar,
+/turf/simulated/floor/wood,
+/area/groundbase/civilian/gameroom)
"rT" = (
/turf/simulated/floor/outdoors/newdirt_nograss/virgo3c{
outdoors = 0
@@ -7666,6 +7719,7 @@
/obj/machinery/light{
dir = 4
},
+/obj/item/weapon/hand_labeler,
/turf/simulated/floor/tiled,
/area/groundbase/civilian/toolstorage)
"sQ" = (
@@ -8657,6 +8711,9 @@
/obj/machinery/alarm{
dir = 8
},
+/obj/structure/sign/painting/library_secure{
+ pixel_y = 30
+ },
/turf/simulated/floor/lino,
/area/groundbase/civilian/cafe)
"vp" = (
@@ -8973,6 +9030,9 @@
/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
dir = 1
},
+/obj/structure/sign/painting/library_secure{
+ pixel_y = 30
+ },
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/halle)
"vY" = (
@@ -13563,6 +13623,12 @@
/obj/machinery/chemical_dispenser/bar_alc/full,
/turf/simulated/floor/lino,
/area/groundbase/civilian/bar)
+"GS" = (
+/obj/structure/sign/painting/library_secure{
+ pixel_x = -30
+ },
+/turf/simulated/floor/tiled/dark,
+/area/groundbase/security/warden)
"GT" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -13590,6 +13656,12 @@
},
/turf/simulated/floor/carpet/sblucarpet,
/area/groundbase/security/iaa2)
+"GW" = (
+/obj/structure/sign/painting/public{
+ pixel_x = -30
+ },
+/turf/simulated/floor/wood,
+/area/groundbase/civilian/gameroom)
"GX" = (
/obj/machinery/light{
dir = 8
@@ -13715,6 +13787,9 @@
},
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,
+/obj/structure/sign/painting/library_secure{
+ pixel_x = -30
+ },
/turf/simulated/floor/tiled/dark,
/area/groundbase/medical/resleeving)
"Hl" = (
@@ -14530,8 +14605,17 @@
/obj/item/device/suit_cooling_unit,
/obj/item/device/suit_cooling_unit,
/obj/structure/table/reinforced,
+/obj/structure/sign/painting/library_secure{
+ pixel_y = -30
+ },
/turf/simulated/floor/tiled,
/area/groundbase/engineering/eva)
+"Jl" = (
+/obj/structure/sign/painting/public{
+ pixel_y = -30
+ },
+/turf/simulated/floor/wood,
+/area/groundbase/civilian/gameroom)
"Jm" = (
/obj/machinery/camera/network/civilian{
dir = 1
@@ -15331,6 +15415,7 @@
dir = 1
},
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,
+/obj/item/weapon/hand_labeler,
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/briefing)
"Le" = (
@@ -15473,6 +15558,9 @@
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
dir = 1
},
+/obj/structure/sign/painting/library_secure{
+ pixel_y = 30
+ },
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/halle)
"Lv" = (
@@ -17501,6 +17589,15 @@
},
/turf/simulated/floor/bmarble,
/area/groundbase/engineering/engine)
+"QF" = (
+/obj/structure/bed/chair/backed_red{
+ dir = 4
+ },
+/obj/structure/sign/painting/public{
+ pixel_x = -30
+ },
+/turf/simulated/floor/wood,
+/area/groundbase/civilian/gameroom)
"QG" = (
/obj/machinery/atmospherics/pipe/simple/hidden/black{
dir = 4
@@ -17516,6 +17613,8 @@
/obj/structure/table/reinforced,
/obj/item/device/sleevemate,
/obj/item/device/denecrotizer/medical,
+/obj/item/bodybag/cryobag,
+/obj/item/bodybag/cryobag,
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/equipment)
"QI" = (
@@ -18090,6 +18189,12 @@
outdoors = 0
},
/area/groundbase/command/ai/foyer)
+"Sd" = (
+/obj/structure/sign/painting/library_secure{
+ pixel_y = -30
+ },
+/turf/simulated/floor/tiled/white,
+/area/groundbase/medical/lhallway)
"Se" = (
/obj/effect/floor_decal/industrial/danger{
dir = 8
@@ -18417,6 +18522,9 @@
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 1
},
+/obj/structure/sign/painting/library_secure{
+ pixel_y = -30
+ },
/turf/simulated/floor/wood,
/area/groundbase/civilian/cafe)
"SP" = (
@@ -20382,6 +20490,9 @@
/area/groundbase/command/tcomms/foyer)
"XJ" = (
/obj/structure/closet/secure_closet/engineering_personal,
+/obj/structure/sign/painting/library_secure{
+ pixel_x = 30
+ },
/turf/simulated/floor/tiled,
/area/groundbase/engineering/workshop)
"XK" = (
@@ -25130,7 +25241,7 @@ AE
Hq
tu
vV
-ut
+gX
ut
yA
pj
@@ -25263,7 +25374,7 @@ Fi
FF
MO
pj
-ht
+cT
vV
AA
ut
@@ -26031,7 +26142,7 @@ eR
eR
AZ
cv
-AN
+iI
kh
jx
az
@@ -26612,7 +26723,7 @@ JA
Ea
TC
iw
-Pl
+GS
HW
uZ
tw
@@ -26967,7 +27078,7 @@ ce
ce
ce
pj
-ht
+cT
vV
AA
ut
@@ -29387,13 +29498,13 @@ MO
MO
MO
hq
-Yl
+GW
Me
Hl
AH
Yl
Yl
-cr
+QF
hq
lE
lE
@@ -29819,7 +29930,7 @@ tb
Fn
kC
Yl
-Yl
+Jl
hq
lE
vw
@@ -29955,7 +30066,7 @@ Ym
oS
vL
hq
-Yl
+rS
uJ
oI
kr
@@ -33939,7 +34050,7 @@ Tn
QC
Dx
QC
-qA
+iO
DQ
oi
ze
@@ -34501,7 +34612,7 @@ Ni
jz
qC
ox
-wA
+Sd
DQ
KY
jw
diff --git a/maps/groundbase/gb-z2.dmm b/maps/groundbase/gb-z2.dmm
index ca598de8c3..a84a1b5dbc 100644
--- a/maps/groundbase/gb-z2.dmm
+++ b/maps/groundbase/gb-z2.dmm
@@ -670,6 +670,9 @@
/obj/item/weapon/disk/nuclear{
name = "authentication disk"
},
+/obj/machinery/light/small{
+ dir = 8
+ },
/turf/simulated/floor/wood,
/area/groundbase/command/captainq)
"bQ" = (
@@ -4252,7 +4255,7 @@
"mo" = (
/obj/structure/table/woodentable,
/obj/machinery/photocopier/faxmachine{
- department = "Library Conference Room"
+ department = "Library"
},
/turf/simulated/floor/wood,
/area/groundbase/civilian/library)
@@ -4467,6 +4470,12 @@
/obj/item/weapon/material/minihoe,
/turf/simulated/floor/tiled,
/area/groundbase/science/xenobot)
+"mX" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/simulated/floor/wood,
+/area/groundbase/command/captainq)
"mY" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
@@ -10729,6 +10738,13 @@
/obj/item/weapon/storage/box/monkeycubes/wolpincubes,
/turf/simulated/floor/tiled/white,
/area/medical/virology)
+"FC" = (
+/obj/machinery/chem_master,
+/obj/structure/sign/painting/library_secure{
+ pixel_y = -30
+ },
+/turf/simulated/floor/tiled/white,
+/area/groundbase/medical/Chemistry)
"FD" = (
/obj/structure/disposalpipe/segment{
dir = 1;
@@ -12799,6 +12815,11 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 9
},
+/obj/structure/table/standard,
+/obj/machinery/photocopier/faxmachine{
+ department = "Research";
+ pixel_y = 6
+ },
/turf/simulated/floor/tiled,
/area/groundbase/science/rnd)
"Lt" = (
@@ -14144,6 +14165,10 @@
sortType = "Trash"
},
/obj/structure/table/standard,
+/obj/machinery/photocopier/faxmachine{
+ department = "Cargo";
+ pixel_y = 6
+ },
/turf/simulated/floor/tiled,
/area/groundbase/cargo/office)
"Pc" = (
@@ -14825,7 +14850,7 @@
/turf/simulated/floor/tiled/dark,
/area/groundbase/command/hall)
"QY" = (
-/obj/machinery/vending/fitness,
+/obj/random/vendorall,
/obj/machinery/light/small{
dir = 1
},
@@ -17624,6 +17649,7 @@
/obj/machinery/recharger{
pixel_y = 5
},
+/obj/item/weapon/hand_labeler,
/turf/simulated/floor/wood,
/area/groundbase/civilian/library)
"Zw" = (
@@ -31226,7 +31252,7 @@ tt
bx
Yu
Ur
-nS
+FC
sW
TU
RJ
@@ -32396,7 +32422,7 @@ Bo
ia
nz
no
-XW
+mX
ow
ia
kr
diff --git a/maps/groundbase/gb-z3.dmm b/maps/groundbase/gb-z3.dmm
index fbd9550b5f..d2eb7dbd37 100644
--- a/maps/groundbase/gb-z3.dmm
+++ b/maps/groundbase/gb-z3.dmm
@@ -2015,13 +2015,6 @@
"IS" = (
/turf/simulated/open/virgo3c,
/area/groundbase/level3/ne/open)
-"IV" = (
-/obj/effect/floor_decal/industrial/warning{
- dir = 1
- },
-/obj/machinery/vending/fitness,
-/turf/simulated/floor/tiled/virgo3c,
-/area/groundbase/medical/patio)
"Jf" = (
/obj/machinery/hologram/holopad,
/turf/simulated/floor/tiled/virgo3c,
@@ -14626,7 +14619,7 @@ IS
IS
IS
Hx
-IV
+yZ
OD
Hn
ky
diff --git a/maps/groundbase/groundbase_areas.dm b/maps/groundbase/groundbase_areas.dm
index 3b8d2b607a..e5eac280c4 100644
--- a/maps/groundbase/groundbase_areas.dm
+++ b/maps/groundbase/groundbase_areas.dm
@@ -443,33 +443,42 @@
limit_mob_size = FALSE
block_suit_sensors = TRUE
forbid_events = TRUE
+
/area/groundbase/dorms/bathroom
name = "Dormitory Bathroom"
sound_env = SOUND_ENVIRONMENT_BATHROOM
/area/groundbase/dorms/room1
name = "Dorm Room 1"
lightswitch = 0
+ sound_env = SMALL_SOFTFLOOR
/area/groundbase/dorms/room2
name = "Dorm Room 2"
lightswitch = 0
+ sound_env = SMALL_SOFTFLOOR
/area/groundbase/dorms/room3
name = "Dorm Room 3"
lightswitch = 0
+ sound_env = SMALL_SOFTFLOOR
/area/groundbase/dorms/room4
name = "Dorm Room 4"
lightswitch = 0
+ sound_env = SMALL_SOFTFLOOR
/area/groundbase/dorms/room5
name = "Dorm Room 5"
lightswitch = 0
+ sound_env = SMALL_SOFTFLOOR
/area/groundbase/dorms/room6
name = "Dorm Room 6"
lightswitch = 0
+ sound_env = SMALL_SOFTFLOOR
/area/groundbase/dorms/room7
name = "Dorm Room 7"
lightswitch = 0
+ sound_env = SMALL_SOFTFLOOR
/area/groundbase/dorms/room8
name = "Dorm Room 8"
lightswitch = 0
+ sound_env = SMALL_SOFTFLOOR
/area/maintenance/groundbase/substation
name = "Substation"
diff --git a/vorestation.dme b/vorestation.dme
index 7abbcab90a..34254871d9 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -86,6 +86,7 @@
#include "code\__defines\shuttle.dm"
#include "code\__defines\sound.dm"
#include "code\__defines\spaceman_dmm.dm"
+#include "code\__defines\span_vr.dm"
#include "code\__defines\species_languages.dm"
#include "code\__defines\species_languages_vr.dm"
#include "code\__defines\species_languages_YW.dm"
@@ -3843,6 +3844,7 @@
#include "code\modules\research\designs\weapons_yw.dm"
#include "code\modules\research\designs\xenoarch_toys.dm"
#include "code\modules\research\designs\xenobio_toys.dm"
+#include "code\modules\research\designs\xenobio_toys_vr.dm"
#include "code\modules\research\designs\circuits\ai_modules.dm"
#include "code\modules\research\designs\circuits\ai_modules_vr.dm"
#include "code\modules\research\designs\circuits\circuits.dm"
@@ -4098,6 +4100,7 @@
#include "code\modules\vore\eating\silicon_vr.dm"
#include "code\modules\vore\eating\simple_animal_vr.dm"
#include "code\modules\vore\eating\slipvore_vr.dm"
+#include "code\modules\vore\eating\stumblevore_vr.dm"
#include "code\modules\vore\eating\transforming_vr.dm"
#include "code\modules\vore\eating\vore_vr.dm"
#include "code\modules\vore\eating\vorehooks_vr.dm"
@@ -4204,6 +4207,7 @@
#include "code\modules\xenobio\items\slimepotions.dm"
#include "code\modules\xenobio\items\slimepotions_vr.dm"
#include "code\modules\xenobio\items\weapons.dm"
+#include "code\modules\xenobio\items\weapons_vr.dm"
#include "code\modules\xenobio\machinery\processor.dm"
#include "code\modules\xgm\xgm_gas_data.dm"
#include "code\modules\xgm\xgm_gas_mixture.dm"