diff --git a/code/__defines/mobs_vr.dm b/code/__defines/mobs_vr.dm
index 99ff177e52..8121e7b2bd 100644
--- a/code/__defines/mobs_vr.dm
+++ b/code/__defines/mobs_vr.dm
@@ -1,13 +1,13 @@
#undef VIS_COUNT
-#define VIS_CH_STATUS_R 22
-#define VIS_CH_HEALTH_VR 23
-#define VIS_CH_BACKUP 24
-#define VIS_CH_VANTAG 25
+#define VIS_CH_STATUS_R 23
+#define VIS_CH_HEALTH_VR 24
+#define VIS_CH_BACKUP 25
+#define VIS_CH_VANTAG 26
-#define VIS_AUGMENTED 26
+#define VIS_AUGMENTED 27
-#define VIS_COUNT 26
+#define VIS_COUNT 27
//Protean organs
#define O_ORCH "orchestrator"
diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm
index 6776555348..67844cf4a2 100644
--- a/code/_helpers/text.dm
+++ b/code/_helpers/text.dm
@@ -301,12 +301,15 @@ proc/TextPreview(var/string,var/len=40)
//For generating neat chat tag-images
//The icon var could be local in the proc, but it's a waste of resources
// to always create it and then throw it out.
-/var/icon/text_tag_icons = new('./icons/chattags.dmi')
+/var/icon/text_tag_icons = 'icons/chattags.dmi'
+/var/list/text_tag_cache = list()
/proc/create_text_tag(var/tagname, var/tagdesc = tagname, var/client/C = null)
if(!(C && C.is_preference_enabled(/datum/client_preference/chat_tags)))
return tagdesc
- var/icon/tag = icon(text_tag_icons.icon, tagname)
- return bicon(tag,TRUE,"text_tag") //""
+ if(!text_tag_cache[tagname])
+ var/icon/tag = icon(text_tag_icons, tagname)
+ text_tag_cache[tagname] = bicon(tag, TRUE, "text_tag")
+ return text_tag_cache[tagname]
/proc/contains_az09(var/input)
for(var/i=1, i<=length(input), i++)
diff --git a/code/controllers/subsystems/nanoui.dm b/code/controllers/subsystems/nanoui.dm
index 78f47e8c7b..c916eb2739 100644
--- a/code/controllers/subsystems/nanoui.dm
+++ b/code/controllers/subsystems/nanoui.dm
@@ -1,41 +1,17 @@
SUBSYSTEM_DEF(nanoui)
name = "NanoUI"
wait = 5
+ flags = SS_NO_INIT
// a list of current open /nanoui UIs, grouped by src_object and ui_key
var/list/open_uis = list()
// a list of current open /nanoui UIs, not grouped, for use in processing
var/list/processing_uis = list()
- // a list of asset filenames which are to be sent to the client on user logon
- var/list/asset_files = list()
-
-/datum/controller/subsystem/nanoui/Initialize()
- var/list/nano_asset_dirs = list(\
- "nano/css/",\
- "nano/images/",\
- "nano/images/status_icons/",\
- "nano/images/modular_computers/",\
- "nano/js/",\
- "nano/templates/"\
- )
-
- var/list/filenames = null
- for (var/path in nano_asset_dirs)
- filenames = flist(path)
- for(var/filename in filenames)
- if(copytext(filename, length(filename)) != "/") // filenames which end in "/" are actually directories, which we want to ignore
- if(fexists(path + filename))
- asset_files[filename] = fcopy_rsc(path + filename) // add this file to asset_files for sending to clients when they connect
- .=..()
- for(var/i in GLOB.clients)
- send_resources(i)
/datum/controller/subsystem/nanoui/Recover()
if(SSnanoui.open_uis)
open_uis |= SSnanoui.open_uis
if(SSnanoui.processing_uis)
processing_uis |= SSnanoui.processing_uis
- if(SSnanoui.asset_files)
- asset_files |= SSnanoui.asset_files
/datum/controller/subsystem/nanoui/stat_entry()
return ..("[processing_uis.len] UIs")
@@ -44,9 +20,3 @@ SUBSYSTEM_DEF(nanoui)
for(var/thing in processing_uis)
var/datum/nanoui/UI = thing
UI.process()
-
-//Sends asset files to a client, called on client/New()
-/datum/controller/subsystem/nanoui/proc/send_resources(client)
- if(!subsystem_initialized)
- return
- getFilesSlow(client, asset_files)
\ No newline at end of file
diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs_vr.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs_vr.dm
index 29860f248f..205ba2a750 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs_vr.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs_vr.dm
@@ -1,24 +1,3 @@
-/obj/structure/bed/chair/sofa
- name = "sofa"
- desc = "A padded, comfy sofa. Great for lazing on."
- base_icon = "sofamiddle"
-
-/obj/structure/bed/chair/sofa/left
- base_icon = "sofaend_left"
-
-/obj/structure/bed/chair/sofa/right
- base_icon = "sofaend_right"
-
-/obj/structure/bed/chair/sofa/corner
- base_icon = "sofacorner"
-
-/obj/structure/bed/chair/sofa/corner/update_layer()
- if(src.dir == NORTH || src.dir == WEST)
- plane = MOB_PLANE
- layer = MOB_LAYER + 0.1
- else
- reset_plane_and_layer()
-
/obj/structure/bed/chair/modern_chair
name = "modern chair"
desc = "It's like sitting in an egg."
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 6cdc49f0fb..66cb6aaccf 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -106,7 +106,9 @@
if (!holder)
return
- var/msg = sanitize(input("Message:", text("Enter the text you wish to appear to everyone:")) as text)
+ var/msg = input("Message:", text("Enter the text you wish to appear to everyone:")) as text
+ if(!(msg[1] == "<" && msg[length(msg)] == ">")) //You can use HTML but only if the whole thing is HTML. Tries to prevent admin 'accidents'.
+ msg = sanitize(msg)
if (!msg)
return
@@ -128,7 +130,9 @@
if(!M)
return
- var/msg = sanitize(input("Message:", text("Enter the text you wish to appear to your target:")) as text)
+ var/msg = input("Message:", text("Enter the text you wish to appear to your target:")) as text
+ if(!(msg[1] == "<" && msg[length(msg)] == ">")) //You can use HTML but only if the whole thing is HTML. Tries to prevent admin 'accidents'.
+ msg = sanitize(msg)
if( !msg )
return
diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm
index c2b7132494..20b1e24ae4 100644
--- a/code/modules/admin/view_variables/topic.dm
+++ b/code/modules/admin/view_variables/topic.dm
@@ -449,7 +449,7 @@
to_chat(usr, "This can only be done on mobs with clients")
return
- SSnanoui.send_resources(H.client)
+ H.client.send_resources()
to_chat(usr, "Resource files sent")
to_chat(H, "Your NanoUI Resource files have been refreshed")
diff --git a/code/modules/ai/aI_holder_subtypes/slime_xenobio_ai.dm b/code/modules/ai/aI_holder_subtypes/slime_xenobio_ai.dm
index 540a9e5397..019d806698 100644
--- a/code/modules/ai/aI_holder_subtypes/slime_xenobio_ai.dm
+++ b/code/modules/ai/aI_holder_subtypes/slime_xenobio_ai.dm
@@ -167,7 +167,7 @@
return 1 // Melee (eat) the target if dead/dying, don't shoot it.
return ..()
-/datum/ai_holder/simple_mob/xenobio_slime/can_attack(atom/movable/AM)
+/datum/ai_holder/simple_mob/xenobio_slime/can_attack(atom/movable/AM, var/vision_required = TRUE)
. = ..()
if(.) // Do some additional checks because we have Special Code(tm).
if(ishuman(AM))
diff --git a/code/modules/ai/ai_holder.dm b/code/modules/ai/ai_holder.dm
index e22abf8ee0..c1638d207a 100644
--- a/code/modules/ai/ai_holder.dm
+++ b/code/modules/ai/ai_holder.dm
@@ -224,6 +224,10 @@
/datum/ai_holder/proc/handle_stance_strategical()
ai_log("++++++++++ Slow Process Beginning ++++++++++", AI_LOG_TRACE)
ai_log("handle_stance_strategical() : Called.", AI_LOG_TRACE)
+
+ //We got left around for some reason. Goodbye cruel world.
+ if(!holder)
+ qdel(src)
ai_log("handle_stance_strategical() : LTT=[lose_target_time]", AI_LOG_TRACE)
if(lose_target_time && (lose_target_time + lose_target_timeout < world.time)) // We were tracking an enemy but they are gone.
diff --git a/code/modules/ai/ai_holder_targeting.dm b/code/modules/ai/ai_holder_targeting.dm
index 40f2c5752f..f1f5ff4a3a 100644
--- a/code/modules/ai/ai_holder_targeting.dm
+++ b/code/modules/ai/ai_holder_targeting.dm
@@ -115,7 +115,7 @@
sorted_targets += A
return sorted_targets
-/datum/ai_holder/proc/can_attack(atom/movable/the_target, vision_required = TRUE)
+/datum/ai_holder/proc/can_attack(atom/movable/the_target, var/vision_required = TRUE)
if(!can_see_target(the_target) && vision_required)
return FALSE
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 6ea0aa08d6..e6242a2165 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -169,7 +169,6 @@
log_client_to_db()
send_resources()
- SSnanoui.send_resources(src)
if(!void)
void = new()
diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm
index 5897712607..0849eb44d9 100644
--- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm
@@ -918,7 +918,7 @@
display_name = "Tempest's Medical Hud"
ckeywhitelist = list("wickedtemp")
character_name = list("Chakat Tempest Venosare")
- allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic", "Field Medic")
+ allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic", "Field Medic", "Off-duty Medic")
slot = slot_glasses
/datum/gear/fluff/tempest_hypospray
@@ -926,7 +926,7 @@
display_name = "Tempest's Hypospray"
ckeywhitelist = list("wickedtemp")
character_name = list("Chakat Tempest Venosare")
- allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic", "Field Medic")
+ allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic", "Field Medic", "Off-duty Medic")
slot = slot_belt
/datum/gear/fluff/tempest_backpack
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
index 34ff1ca8ec..5eec02f06e 100644
--- a/code/modules/materials/material_recipes.dm
+++ b/code/modules/materials/material_recipes.dm
@@ -84,7 +84,8 @@
new/datum/stack_recipe("emergency shutter", /obj/structure/firedoor_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("multi-tile airlock assembly", /obj/structure/door_assembly/multi_tile, 4, time = 50, one_per_turf = 1, on_floor = 1), \
))
- recipes += new/datum/stack_recipe("IV drip", /obj/machinery/iv_drip, 4, time = 20, one_per_turf = 1, on_floor = 1)
+ //recipes += new/datum/stack_recipe("IV drip", /obj/machinery/iv_drip, 4, time = 20, one_per_turf = 1, on_floor = 1)//VOREStation Removal
+ recipes += new/datum/stack_recipe("medical stand", /obj/structure/medical_stand, 4, time = 20, one_per_turf = 1, on_floor = 1)//VOREStation Replacement
recipes += new/datum/stack_recipe("conveyor switch", /obj/machinery/conveyor_switch, 2, time = 20, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade)
recipes += new/datum/stack_recipe("light fixture frame", /obj/item/frame/light, 2)
diff --git a/code/modules/mining/drilling/scanner.dm b/code/modules/mining/drilling/scanner.dm
index 3f94363681..79ae5f1573 100644
--- a/code/modules/mining/drilling/scanner.dm
+++ b/code/modules/mining/drilling/scanner.dm
@@ -9,13 +9,13 @@
var/scan_time = 5 SECONDS
/obj/item/weapon/mining_scanner/attack_self(mob/user as mob)
- to_chat(user, "You begin sweeping \the [src] about, scanning for metal deposits.")
+ to_chat(user, "You begin sweeping \the [src] about, scanning for metal deposits.")
playsound(loc, 'sound/items/goggles_charge.ogg', 50, 1, -6)
if(!do_after(user, scan_time))
return
- ScanTurf(user, get_turf(user))
+ ScanTurf(get_turf(user), user)
/obj/item/weapon/mining_scanner/proc/ScanTurf(var/atom/target, var/mob/user, var/exact = FALSE)
var/list/metals = list(
@@ -45,7 +45,7 @@
if(ore_type) metals[ore_type] += T.resources[metal]
- to_chat(user, "[bicon(src)] The scanner beeps and displays a readout.")
+ var/message = "[bicon(src)] The scanner beeps and displays a readout."
for(var/ore_type in metals)
var/result = "no sign"
@@ -59,4 +59,6 @@
else
result = metals[ore_type]
- to_chat(user, "- [result] of [ore_type].")
+ message += "
- [result] of [ore_type]."
+
+ to_chat(user, message)
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/nurse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/nurse.dm
index 84f3d533cf..51b07954a6 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/nurse.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/nurse.dm
@@ -255,7 +255,7 @@
return ..(targets)
-/datum/ai_holder/simple_mob/melee/nurse_spider/can_attack(atom/movable/the_target)
+/datum/ai_holder/simple_mob/melee/nurse_spider/can_attack(atom/movable/the_target, var/vision_required = TRUE)
. = ..()
if(!.) // Parent returned FALSE.
if(istype(the_target, /obj))
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm
index 42ce8a2897..156ad340bc 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm
@@ -223,7 +223,7 @@ var/global/list/grub_machine_overlays = list()
actual_targets += M
return actual_targets
-/datum/ai_holder/simple_mob/solargrub_larva/can_attack(atom/movable/the_target)
+/datum/ai_holder/simple_mob/solargrub_larva/can_attack(atom/movable/the_target, var/vision_required = TRUE)
.=..()
var/obj/machinery/M = the_target
if(!istype(M))
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 4eda5c89ca..d88bc257f0 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -35,6 +35,7 @@
/mob/living/bot/medbot,
/obj/item/weapon/storage/secure/safe,
/obj/machinery/iv_drip,
+ /obj/structure/medical_stand, //VOREStation Add,
/obj/machinery/disease2/incubator,
/obj/machinery/disposal,
/mob/living/simple_mob/animal/passive/cow,
diff --git a/code/modules/vchat/css/ss13styles.css b/code/modules/vchat/css/ss13styles.css
index 5ed999990d..c0ded02b14 100644
--- a/code/modules/vchat/css/ss13styles.css
+++ b/code/modules/vchat/css/ss13styles.css
@@ -1,6 +1,15 @@
/* VChat Styles */
+body.inverted {
+ background-color: #111111;
+}
+
+#topmenu {
+ overflow-x: auto;
+ overflow-y: hidden;
+}
+
#contentbox {
- margin-top: 3rem; /* Make room for the fixed top menu */
+ margin-top: 3.3rem; /* Make room for the fixed top menu */
overflow-wrap: break-word;
word-wrap: break-word; /* IE, blah */
}
@@ -18,11 +27,6 @@
font-size: 10px;
}
-#app > .menu {
- overflow-x: auto;
- overflow-y: hidden;
-}
-
.item {
cursor: pointer;
}
@@ -31,10 +35,6 @@
color: red;
}
-body.inverted {
- background-color: #111111;
-}
-
.blinkwarn {
color: #FF0000;
animation: blink-animation 1s steps(5, start) infinite;
@@ -56,6 +56,7 @@ body.inverted {
#messagebox.vc_info .vc_info { display: block; }
#messagebox.vc_deadchat .vc_deadchat { display: block; }
#messagebox.vc_globalooc .vc_globalooc { display: block; }
+#messagebox.vc_looc .vc_looc { display: block; }
#messagebox.vc_adminpm .vc_adminpm { display: block; }
#messagebox.vc_adminchat .vc_adminchat { display: block; }
#messagebox.vc_modchat .vc_modchat { display: block; }
@@ -70,6 +71,7 @@ body.inverted {
#messagebox h1, #messagebox h2, #messagebox h3, #messagebox h4, #messagebox h5, #messagebox h6 {color: #0000ff; font-family: Georgia, Verdana, sans-serif;}
#messagebox em {font-style: normal; font-weight: bold;}
+#messagebox a {text-decoration: underline;}
.motd {color: #638500;font-family: Verdana, sans-serif;}
.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6
@@ -87,7 +89,7 @@ body.inverted {
.ooc .everyone {color: #002eb8;}
.inverted .ooc .everyone {color: #004ed8;} /* Dark mode */
-.ooc .looc {color: #3A9696;}
+.looc {color: #3A9696;}
.ooc .elevated {color: #2e78d9;}
.ooc .moderator {color: #184880;}
.ooc .developer {color: #1b521f;}
@@ -169,7 +171,7 @@ h1.alert, h2.alert {color: #000000;}
.soghun {color: #228B22;}
.solcom {color: #22228B;}
.changeling {color: #800080;}
-.sergal {color: #0077FF; font-family: "Comic Sans MS";}
+.sergal {color: #0077FF;}
.birdsongc {color: #CC9900;}
.vulpkanin {color: #B97A57;}
.enochian {color: #848A33; letter-spacing:-1pt; word-spacing:4pt; font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;}
diff --git a/code/modules/vchat/html/vchat.html b/code/modules/vchat/html/vchat.html
index 6e254a3616..29cc115af8 100644
--- a/code/modules/vchat/html/vchat.html
+++ b/code/modules/vchat/html/vchat.html
@@ -24,7 +24,7 @@