diff --git a/.travis.yml b/.travis.yml
index fc1c93b83c6..5a3b08a14a6 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,7 +5,7 @@ sudo: false
env:
global:
- BYOND_MAJOR="512"
- - BYOND_MINOR="1403"
+ - BYOND_MINOR="1411"
- MACRO_COUNT=4
matrix:
- TEST_DEFINE="MAP_TEST" TEST_FILE="code/_map_tests.dm" RUN="0"
diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm
index 9f025138a18..86bfe96304b 100644
--- a/code/ATMOSPHERICS/pipes.dm
+++ b/code/ATMOSPHERICS/pipes.dm
@@ -1279,7 +1279,7 @@
universal_underlays(node2)
else
universal_underlays(,dir)
- universal_underlays(dir, -180)
+ universal_underlays(,turn(dir, -180))
/obj/machinery/atmospherics/pipe/simple/visible/universal/update_underlays()
..()
diff --git a/code/ZAS/Turf.dm b/code/ZAS/Turf.dm
index a309cd3a082..f61d1cf4fc4 100644
--- a/code/ZAS/Turf.dm
+++ b/code/ZAS/Turf.dm
@@ -6,9 +6,9 @@
/turf/simulated/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null)
if(LAZYLEN(graphic_add))
- overlays += graphic_add
+ add_overlay(graphic_add, priority = TRUE)
if(LAZYLEN(graphic_remove))
- overlays -= graphic_remove
+ cut_overlay(graphic_remove, priority = TRUE)
/turf/proc/update_air_properties()
var/block = c_airblock(src)
diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm
index 724f5789d8e..92ad017cd21 100644
--- a/code/_helpers/unsorted.dm
+++ b/code/_helpers/unsorted.dm
@@ -800,7 +800,6 @@ proc/GaussRandRound(var/sigma,var/roundto)
var/old_dir1 = T.dir
var/old_icon_state1 = T.icon_state
var/old_icon1 = T.icon
- var/old_overlays = T.overlays.Copy()
var/old_underlays = T.underlays.Copy()
var/old_decals = T.decals ? T.decals.Copy() : null
@@ -808,11 +807,9 @@ proc/GaussRandRound(var/sigma,var/roundto)
X.set_dir(old_dir1)
X.icon_state = old_icon_state1
X.icon = old_icon1
- X.overlays = old_overlays
+ X.copy_overlays(T, TRUE)
X.underlays = old_underlays
X.decals = old_decals
- if(old_decals)
- X.apply_decals()
//Move the air from source to dest
var/turf/simulated/ST = T
@@ -838,14 +835,10 @@ proc/GaussRandRound(var/sigma,var/roundto)
if(shuttlework)
var/turf/simulated/shuttle/SS = T
SS.landed_holder.leave_turf()
-
else if(turftoleave)
T.ChangeTurf(turftoleave)
- T.apply_decals()
-
else
T.ChangeTurf(get_base_turf_by_area(T))
- T.apply_decals()
refined_src -= T
refined_trg -= B
diff --git a/code/controllers/subsystems/floor_decals.dm b/code/controllers/subsystems/floor_decals.dm
deleted file mode 100644
index 39e4515d0d7..00000000000
--- a/code/controllers/subsystems/floor_decals.dm
+++ /dev/null
@@ -1,28 +0,0 @@
-//
-// Floor Decals Initialization Subsystem
-// This is part of the giant decal hack that works around a BYOND bug where DreamDaemon will crash if you
-// update overlays on turfs too much.
-// The master_controller on Polaris used to init decals prior to initializing areas (which initilized turfs)
-// Now that we switched to subsystems we still want to do the same thing, so this takes care of it.
-//
-SUBSYSTEM_DEF(floor_decals)
- name = "Floor Decals"
- init_order = INIT_ORDER_DECALS
- flags = SS_NO_FIRE
-
-/datum/controller/subsystem/floor_decals/Initialize(timeofday)
- if(floor_decals_initialized)
- return ..()
- to_world_log("Initializing Floor Decals")
- admin_notice("Initializing Floor Decals", R_DEBUG)
- var/list/turfs_with_decals = list()
- for(var/obj/effect/floor_decal/D in world)
- var/T = D.add_to_turf_decals()
- if(T) turfs_with_decals |= T
- CHECK_TICK
- for(var/item in turfs_with_decals)
- var/turf/T = item
- if(T.decals) T.apply_decals()
- CHECK_TICK
- floor_decals_initialized = TRUE
- return ..()
diff --git a/code/controllers/subsystems/overlays.dm b/code/controllers/subsystems/overlays.dm
index 6d7581e1268..352102e1755 100644
--- a/code/controllers/subsystems/overlays.dm
+++ b/code/controllers/subsystems/overlays.dm
@@ -11,6 +11,8 @@ SUBSYSTEM_DEF(overlays)
var/list/overlay_icon_state_caches // Cache thing
var/list/overlay_icon_cache // Cache thing
+var/global/image/appearance_bro = new() // Temporarily super-global because of BYOND init order dumbness.
+
/datum/controller/subsystem/overlays/PreInit()
overlay_icon_state_caches = list()
overlay_icon_cache = list()
@@ -90,7 +92,7 @@ SUBSYSTEM_DEF(overlays)
icon_cache[icon] = .
/atom/proc/build_appearance_list(old_overlays)
- var/static/image/appearance_bro = new()
+ // var/static/image/appearance_bro = new() // Moved to be superglobal due to BYOND insane init order stupidness.
var/list/new_overlays = list()
if (!islist(old_overlays))
old_overlays = list(old_overlays)
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 76eafc2a05e..6a435ef3889 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -824,7 +824,7 @@ FIRE ALARM
alarms_hidden = TRUE
/obj/machinery/firealarm/update_icon()
- overlays.Cut()
+ cut_overlays()
if(panel_open)
set_light(0)
@@ -847,8 +847,7 @@ FIRE ALARM
if("blue") set_light(l_range = 2, l_power = 0.5, l_color = "#1024A9")
if("red") set_light(l_range = 4, l_power = 2, l_color = "#ff0000")
if("delta") set_light(l_range = 4, l_power = 2, l_color = "#FF6633")
-
- overlays += image('icons/obj/monitors.dmi', "overlay_[seclevel]")
+ add_overlay("overlay_[seclevel]")
/obj/machinery/firealarm/fire_act(datum/gas_mixture/air, temperature, volume)
if(detecting)
diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm
index 84a243e35f9..ea9a7f77fbc 100644
--- a/code/game/turfs/flooring/flooring_decals.dm
+++ b/code/game/turfs/flooring/flooring_decals.dm
@@ -14,17 +14,29 @@ var/list/floor_decals = list()
if(newcolour) color = newcolour
..(newloc)
-// Hack to workaround byond crash bug
/obj/effect/floor_decal/initialize()
- if(!floor_decals_initialized || !loc || QDELETED(src))
- return
add_to_turf_decals()
- var/turf/T = get_turf(src)
- if(T) //VOREStation Edit
- T.apply_decals()
initialized = TRUE
return INITIALIZE_HINT_QDEL
+// This is a separate proc from initialize() to facilitiate its caching and other stuff. Look into it someday.
+/obj/effect/floor_decal/proc/add_to_turf_decals()
+ if(supplied_dir)
+ set_dir(supplied_dir) // TODO - Why can't this line be done in initialize/New()?
+ var/turf/T = get_turf(src)
+ if(istype(T, /turf/simulated/floor) || istype(T, /turf/unsimulated/floor) || istype(T, /turf/simulated/shuttle/floor))
+ var/cache_key = "[alpha]-[color]-[dir]-[icon_state]-[T.layer]"
+ var/image/I = floor_decals[cache_key]
+ if(!I)
+ I = image(icon = icon, icon_state = icon_state, dir = dir)
+ I.layer = T.layer
+ I.color = color
+ I.alpha = alpha
+ floor_decals[cache_key] = I
+ LAZYADD(T.decals, I) // Add to its decals list (so it remembers to re-apply after it cuts overlays)
+ T.add_overlay(I) // Add to its current overlays too.
+ return T
+
/obj/effect/floor_decal/reset
name = "reset marker"
diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm
index abb5d7a1ba0..0cdcc8b1756 100644
--- a/code/game/turfs/flooring/flooring_premade.dm
+++ b/code/game/turfs/flooring/flooring_premade.dm
@@ -230,9 +230,8 @@
oxygen = 0
nitrogen = 0
-/turf/simulated/floor/reinforced/n20/New()
- ..()
- sleep(-1)
+/turf/simulated/floor/reinforced/n20/initialize()
+ . = ..()
if(!air) make_air()
air.adjust_gas("sleeping_agent", ATMOSTANK_NITROUSOXIDE)
@@ -411,11 +410,11 @@
. = ..()
/turf/snow/update_icon()
- overlays.Cut()
+ cut_overlays()
for(var/d in crossed_dirs)
var/amt = crossed_dirs[d]
for(var/i in 1 to amt)
- overlays += icon(icon, "footprint[i]", text2num(d))
+ add_overlay(image(icon, "footprint[i]", text2num(d)))
//**** Here ends snow ****
\ No newline at end of file
diff --git a/code/game/turfs/flooring/turf_overlay_holder.dm b/code/game/turfs/flooring/turf_overlay_holder.dm
deleted file mode 100644
index c12f727a0b8..00000000000
--- a/code/game/turfs/flooring/turf_overlay_holder.dm
+++ /dev/null
@@ -1,95 +0,0 @@
-//
-// Initialize floor decals! Woo! This is crazy.
-//
-
-var/global/floor_decals_initialized = FALSE
-
-// The Turf Decal Holder
-// Since it is unsafe to add overlays to turfs, we hold them here for now.
-// Since I want this object to basically not exist, I am modeling it in part after lighting_overlay
-/atom/movable/turf_overlay_holder
- name = "turf overlay holder"
- density = 0
- simulated = 0
- anchored = 1
- layer = TURF_LAYER
- icon = null
- icon_state = null
- mouse_opacity = 0
- // auto_init = 0
-
-/atom/movable/turf_overlay_holder/initialize()
- // doesn't need special init
- initialized = TRUE
- return INITIALIZE_HINT_NORMAL
-
-/atom/movable/turf_overlay_holder/New(var/atom/newloc)
- ..()
- verbs.Cut()
- var/turf/T = loc
- T.overlay_holder = src
-
-/atom/movable/turf_overlay_holder/Destroy()
- if(loc)
- var/turf/T = loc
- if(T.overlay_holder == src)
- T.overlay_holder = null
- . = ..()
-
-// Variety of overrides so the overlays don't get affected by weird things.
-/atom/movable/turf_overlay_holder/ex_act()
- return
-
-/atom/movable/turf_overlay_holder/singularity_act()
- return
-
-/atom/movable/turf_overlay_holder/singularity_pull()
- return
-
-/atom/movable/turf_overlay_holder/forceMove()
- return 0 //should never move
-
-/atom/movable/turf_overlay_holder/Move()
- return 0
-
-/atom/movable/turf_overlay_holder/throw_at()
- return 0
-
-/obj/effect/floor_decal/proc/add_to_turf_decals()
- if(src.supplied_dir) src.set_dir(src.supplied_dir)
- var/turf/T = get_turf(src)
- if(istype(T, /turf/simulated/floor) || istype(T, /turf/unsimulated/floor) || istype(T, /turf/simulated/shuttle/floor))
- var/cache_key = "[src.alpha]-[src.color]-[src.dir]-[src.icon_state]-[T.layer]"
- var/image/I = floor_decals[cache_key]
- if(!I)
- I = image(icon = src.icon, icon_state = src.icon_state, dir = src.dir)
- I.layer = T.layer
- I.color = src.color
- I.alpha = src.alpha
- floor_decals[cache_key] = I
- if(!T.decals) T.decals = list()
- //world.log << "About to add img:\ref[I] onto decals at turf:\ref[T] ([T.x],[T.y],[T.z]) which has appearance:\ref[T.appearance] and decals.len=[T.decals.len]"
- T.decals += I
- return T
- // qdel(D)
- src.loc = null
- src.tag = null
-
-// Changes to turf to let us do this
-/turf
- var/atom/movable/turf_overlay_holder/overlay_holder = null
-
-// After a turf change, destroy the old overlay holder since we will have lost access to it.
-/turf/post_change()
- var/atom/movable/turf_overlay_holder/TOH = locate(/atom/movable/turf_overlay_holder, src)
- if(TOH)
- qdel(TOH)
- ..()
-
-/turf/proc/apply_decals()
- if(decals)
- if(!overlay_holder)
- overlay_holder = new(src)
- overlay_holder.overlays = src.decals
- else if(overlay_holder)
- overlay_holder.overlays.Cut()
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index 789ec20a178..e1565889378 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -21,16 +21,15 @@
spawn(0)
wet = wet_val
if(wet_overlay)
- overlays -= wet_overlay
- wet_overlay = null
- wet_overlay = image('icons/effects/water.dmi',src,"wet_floor")
- overlays += wet_overlay
+ cut_overlay(wet_overlay)
+ wet_overlay = image('icons/effects/water.dmi', icon_state = "wet_floor")
+ add_overlay(wet_overlay)
sleep(800)
if(wet == 2)
sleep(3200)
wet = 0
if(wet_overlay)
- overlays -= wet_overlay
+ cut_overlay(wet_overlay)
wet_overlay = null
/turf/simulated/proc/freeze_floor()
@@ -38,14 +37,14 @@
return
wet = 3 // icy
if(wet_overlay)
- overlays -= wet_overlay
+ cut_overlay(wet_overlay)
wet_overlay = null
wet_overlay = image('icons/turf/overlays.dmi',src,"snowfloor")
- overlays += wet_overlay
+ add_overlay(wet_overlay)
spawn(5 MINUTES)
wet = 0
if(wet_overlay)
- overlays -= wet_overlay
+ cut_overlay(wet_overlay)
wet_overlay = null
/turf/simulated/clean_blood()
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index f9063358193..9f3a8e67b08 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -60,7 +60,7 @@
//This proc auto corrects the grass tiles' siding.
/turf/simulated/floor/proc/make_plating(var/place_product, var/defer_icon_update)
- overlays.Cut()
+ cut_overlays()
// VOREStation Edit - We are flooring switching to plating, swap out old_decals for decals.
if(flooring)
var/tmp/list/underfloor_decals = old_decals
diff --git a/code/game/turfs/simulated/floor_icon.dm b/code/game/turfs/simulated/floor_icon.dm
index 940a170cdb3..1faf198cedb 100644
--- a/code/game/turfs/simulated/floor_icon.dm
+++ b/code/game/turfs/simulated/floor_icon.dm
@@ -15,7 +15,7 @@ var/image/no_ceiling_image = null
if(lava)
return
- overlays.Cut()
+ cut_overlays()
if(flooring)
// Set initial icon and strings.
@@ -38,17 +38,17 @@ var/image/no_ceiling_image = null
var/turf/simulated/floor/T = get_step(src, step_dir)
if(!istype(T) || !T.flooring || T.flooring.name != flooring.name)
has_border |= step_dir
- overlays |= get_flooring_overlay("[flooring.icon_base]-edge-[step_dir]", "[flooring.icon_base]_edges", step_dir)
+ add_overlay(get_flooring_overlay("[flooring.icon_base]-edge-[step_dir]", "[flooring.icon_base]_edges", step_dir))
// There has to be a concise numerical way to do this but I am too noob.
if((has_border & NORTH) && (has_border & EAST))
- overlays |= get_flooring_overlay("[flooring.icon_base]-edge-[NORTHEAST]", "[flooring.icon_base]_edges", NORTHEAST)
+ add_overlay(get_flooring_overlay("[flooring.icon_base]-edge-[NORTHEAST]", "[flooring.icon_base]_edges", NORTHEAST))
if((has_border & NORTH) && (has_border & WEST))
- overlays |= get_flooring_overlay("[flooring.icon_base]-edge-[NORTHWEST]", "[flooring.icon_base]_edges", NORTHWEST)
+ add_overlay(get_flooring_overlay("[flooring.icon_base]-edge-[NORTHWEST]", "[flooring.icon_base]_edges", NORTHWEST))
if((has_border & SOUTH) && (has_border & EAST))
- overlays |= get_flooring_overlay("[flooring.icon_base]-edge-[SOUTHEAST]", "[flooring.icon_base]_edges", SOUTHEAST)
+ add_overlay(get_flooring_overlay("[flooring.icon_base]-edge-[SOUTHEAST]", "[flooring.icon_base]_edges", SOUTHEAST))
if((has_border & SOUTH) && (has_border & WEST))
- overlays |= get_flooring_overlay("[flooring.icon_base]-edge-[SOUTHWEST]", "[flooring.icon_base]_edges", SOUTHWEST)
+ add_overlay(get_flooring_overlay("[flooring.icon_base]-edge-[SOUTHWEST]", "[flooring.icon_base]_edges", SOUTHWEST))
if(flooring.flags & TURF_HAS_CORNERS)
// As above re: concise numerical way to do this.
@@ -56,37 +56,36 @@ var/image/no_ceiling_image = null
if(!(has_border & EAST))
var/turf/simulated/floor/T = get_step(src, NORTHEAST)
if(!(istype(T) && T.flooring && T.flooring.name == flooring.name))
- overlays |= get_flooring_overlay("[flooring.icon_base]-corner-[NORTHEAST]", "[flooring.icon_base]_corners", NORTHEAST)
+ add_overlay(get_flooring_overlay("[flooring.icon_base]-corner-[NORTHEAST]", "[flooring.icon_base]_corners", NORTHEAST))
if(!(has_border & WEST))
var/turf/simulated/floor/T = get_step(src, NORTHWEST)
if(!(istype(T) && T.flooring && T.flooring.name == flooring.name))
- overlays |= get_flooring_overlay("[flooring.icon_base]-corner-[NORTHWEST]", "[flooring.icon_base]_corners", NORTHWEST)
+ add_overlay(get_flooring_overlay("[flooring.icon_base]-corner-[NORTHWEST]", "[flooring.icon_base]_corners", NORTHWEST))
if(!(has_border & SOUTH))
if(!(has_border & EAST))
var/turf/simulated/floor/T = get_step(src, SOUTHEAST)
if(!(istype(T) && T.flooring && T.flooring.name == flooring.name))
- overlays |= get_flooring_overlay("[flooring.icon_base]-corner-[SOUTHEAST]", "[flooring.icon_base]_corners", SOUTHEAST)
+ add_overlay(get_flooring_overlay("[flooring.icon_base]-corner-[SOUTHEAST]", "[flooring.icon_base]_corners", SOUTHEAST))
if(!(has_border & WEST))
var/turf/simulated/floor/T = get_step(src, SOUTHWEST)
if(!(istype(T) && T.flooring && T.flooring.name == flooring.name))
- overlays |= get_flooring_overlay("[flooring.icon_base]-corner-[SOUTHWEST]", "[flooring.icon_base]_corners", SOUTHWEST)
+ add_overlay(get_flooring_overlay("[flooring.icon_base]-corner-[SOUTHWEST]", "[flooring.icon_base]_corners", SOUTHWEST))
- // Hack workaround to byond crash bug
- //if(decals && decals.len)
- //overlays |= decals
- apply_decals()
+ // Re-apply floor decals
+ if(LAZYLEN(decals))
+ add_overlay(decals)
if(is_plating() && !(isnull(broken) && isnull(burnt))) //temp, todo
icon = 'icons/turf/flooring/plating.dmi'
icon_state = "dmg[rand(1,4)]"
else if(flooring)
if(!isnull(broken) && (flooring.flags & TURF_CAN_BREAK))
- overlays |= get_flooring_overlay("[flooring.icon_base]-broken-[broken]","broken[broken]") // VOREStation Edit - Eris overlays
+ add_overlay(get_flooring_overlay("[flooring.icon_base]-broken-[broken]","broken[broken]")) // VOREStation Edit - Eris overlays
if(!isnull(burnt) && (flooring.flags & TURF_CAN_BURN))
- overlays |= get_flooring_overlay("[flooring.icon_base]-burned-[burnt]","burned[burnt]") // VOREStation Edit - Eris overlays
+ add_overlay(get_flooring_overlay("[flooring.icon_base]-burned-[burnt]","burned[burnt]")) // VOREStation Edit - Eris overlays
if(weather_overlay)
- overlays += weather_overlay
+ add_overlay(weather_overlay)
if(update_neighbors)
for(var/turf/simulated/floor/F in range(src, 1))
@@ -97,7 +96,7 @@ var/image/no_ceiling_image = null
// Show 'ceilingless' overlay.
var/turf/above = GetAbove(src)
if(above && isopenspace(above) && !istype(src, /turf/simulated/floor/outdoors)) // This won't apply to outdoor turfs since its assumed they don't have a ceiling anyways.
- overlays |= no_ceiling_image
+ add_overlay(no_ceiling_image)
/turf/simulated/floor/proc/get_flooring_overlay(var/cache_key, var/icon_base, var/icon_dir = 0)
if(!flooring_cache[cache_key])
diff --git a/code/game/turfs/simulated/floor_types.dm b/code/game/turfs/simulated/floor_types.dm
index 07c686df993..3c4856cf004 100644
--- a/code/game/turfs/simulated/floor_types.dm
+++ b/code/game/turfs/simulated/floor_types.dm
@@ -15,17 +15,19 @@
var/list/decals
New(var/location = null, var/turf/simulated/shuttle/turf)
+ ..(null)
my_turf = turf
/obj/landed_holder/proc/land_on(var/turf/T)
//Gather destination information
- var/old_dest_type = T.type
- var/old_dest_dir = T.dir
- var/old_dest_icon_state = T.icon_state
- var/old_dest_icon = T.icon
- var/list/old_dest_overlays = T.overlays.Copy()
- var/list/old_dest_underlays = T.underlays.Copy()
- var/list/old_dest_decals = T.decals ? T.decals.Copy() : null
+ var/obj/landed_holder/new_holder = new(null)
+ new_holder.turf_type = T.type
+ new_holder.dir = T.dir
+ new_holder.icon = T.icon
+ new_holder.icon_state = T.icon_state
+ new_holder.copy_overlays(T, TRUE)
+ new_holder.underlays = T.underlays.Copy()
+ new_holder.decals = T.decals ? T.decals.Copy() : null
//Set the destination to be like us
T.Destroy()
@@ -33,7 +35,7 @@
new_dest.set_dir(my_turf.dir)
new_dest.icon_state = my_turf.icon_state
new_dest.icon = my_turf.icon
- new_dest.overlays = my_turf.overlays
+ new_dest.copy_overlays(my_turf, TRUE)
new_dest.underlays = my_turf.underlays
new_dest.decals = my_turf.decals
//Shuttle specific stuff
@@ -43,18 +45,9 @@
new_dest.join_flags = my_turf.join_flags
new_dest.join_group = my_turf.join_group
- if(new_dest.decals)
- new_dest.apply_decals()
-
- //Tell the new turf about what was there before
- new_dest.landed_holder = new(turf = new_dest)
- new_dest.landed_holder.turf_type = old_dest_type
- new_dest.landed_holder.dir = old_dest_dir
- new_dest.landed_holder.icon = old_dest_icon
- new_dest.landed_holder.icon_state = old_dest_icon_state
- new_dest.landed_holder.overlays = old_dest_overlays
- new_dest.landed_holder.underlays = old_dest_underlays
- new_dest.landed_holder.decals = old_dest_decals
+ // Associate the holder with the new turf.
+ new_holder.my_turf = new_dest
+ new_dest.landed_holder = new_holder
//Update underlays if necessary (interior corners won't have changed).
if(new_dest.takes_underlays && !new_dest.interior_corner)
@@ -70,11 +63,9 @@
new_source.set_dir(dir)
new_source.icon_state = icon_state
new_source.icon = icon
- new_source.overlays = overlays
+ new_source.copy_overlays(src, TRUE)
new_source.underlays = underlays
new_source.decals = decals
- if(new_source.decals)
- new_source.apply_decals()
else
new_source = my_turf.ChangeTurf(get_base_turf_by_area(my_turf),,1)
diff --git a/code/game/turfs/simulated/outdoors/outdoors.dm b/code/game/turfs/simulated/outdoors/outdoors.dm
index 13d983a9e1b..cd358b7d5ef 100644
--- a/code/game/turfs/simulated/outdoors/outdoors.dm
+++ b/code/game/turfs/simulated/outdoors/outdoors.dm
@@ -44,7 +44,9 @@ var/list/outdoor_turfs = list()
planet_controller.unallocateTurf(src)
else // This is happening during map gen, if there's no planet_controller (hopefully).
outdoor_turfs -= src
- qdel(weather_overlay)
+ if(weather_overlay)
+ cut_overlay(weather_overlay)
+ qdel_null(weather_overlay)
update_icon()
/turf/simulated/post_change()
@@ -67,15 +69,14 @@ var/list/outdoor_turfs = list()
var/image/I = image(icon = 'icons/turf/outdoors_edge.dmi', icon_state = "[T.get_edge_icon_state()]-edge", dir = checkdir)
I.plane = 0
turf_edge_cache[cache_key] = I
- overlays += turf_edge_cache[cache_key]
+ add_overlay(turf_edge_cache[cache_key])
/turf/simulated/proc/get_edge_icon_state()
return icon_state
/turf/simulated/floor/outdoors/update_icon()
- overlays.Cut()
- update_icon_edge()
..()
+ update_icon_edge()
/turf/simulated/floor/outdoors/mud
name = "mud"
diff --git a/code/game/turfs/simulated/outdoors/snow.dm b/code/game/turfs/simulated/outdoors/snow.dm
index 8e60c925e54..9926c4704ad 100644
--- a/code/game/turfs/simulated/outdoors/snow.dm
+++ b/code/game/turfs/simulated/outdoors/snow.dm
@@ -17,10 +17,9 @@
. = ..()
/turf/simulated/floor/outdoors/snow/update_icon()
- overlays.Cut()
..()
for(var/d in crossed_dirs)
- overlays += image(icon = 'icons/turf/outdoors.dmi', icon_state = "snow_footprints", dir = text2num(d))
+ add_overlay(image(icon = 'icons/turf/outdoors.dmi', icon_state = "snow_footprints", dir = text2num(d)))
/turf/simulated/floor/outdoors/snow/attackby(var/obj/item/W, var/mob/user)
if(istype(W, /obj/item/weapon/shovel))
diff --git a/code/game/turfs/simulated/wall_icon.dm b/code/game/turfs/simulated/wall_icon.dm
index 2dac063723b..b8a0980de41 100644
--- a/code/game/turfs/simulated/wall_icon.dm
+++ b/code/game/turfs/simulated/wall_icon.dm
@@ -47,36 +47,36 @@
if(!damage_overlays[1]) //list hasn't been populated
generate_overlays()
- overlays.Cut()
+ cut_overlays()
var/image/I
if(!density)
I = image('icons/turf/wall_masks.dmi', "[material.icon_base]fwall_open")
I.color = material.icon_colour
- overlays += I
+ add_overlay(I)
return
for(var/i = 1 to 4)
I = image('icons/turf/wall_masks.dmi', "[material.icon_base][wall_connections[i]]", dir = 1<<(i-1))
I.color = material.icon_colour
- overlays += I
+ add_overlay(I)
if(reinf_material)
if(construction_stage != null && construction_stage < 6)
I = image('icons/turf/wall_masks.dmi', "reinf_construct-[construction_stage]")
I.color = reinf_material.icon_colour
- overlays += I
+ add_overlay(I)
else
if("[reinf_material.icon_reinf]0" in icon_states('icons/turf/wall_masks.dmi'))
// Directional icon
for(var/i = 1 to 4)
I = image('icons/turf/wall_masks.dmi', "[reinf_material.icon_reinf][wall_connections[i]]", dir = 1<<(i-1))
I.color = reinf_material.icon_colour
- overlays += I
+ add_overlay(I)
else
I = image('icons/turf/wall_masks.dmi', reinf_material.icon_reinf)
I.color = reinf_material.icon_colour
- overlays += I
+ add_overlay(I)
if(damage != 0)
var/integrity = material.integrity
@@ -87,7 +87,7 @@
if(overlay > damage_overlays.len)
overlay = damage_overlays.len
- overlays += damage_overlays[overlay]
+ add_overlay(damage_overlays[overlay])
return
/turf/simulated/wall/proc/generate_overlays()
diff --git a/code/game/turfs/simulated/wall_types.dm b/code/game/turfs/simulated/wall_types.dm
index d6eb1578b7f..eae30c6cb43 100644
--- a/code/game/turfs/simulated/wall_types.dm
+++ b/code/game/turfs/simulated/wall_types.dm
@@ -224,15 +224,7 @@
/turf/simulated/shuttle/wall/voidcraft/update_icon()
if(stripe_color)
- overlays = list() //VOREStation Edit - Another place with overlay nonsense.
+ cut_overlays()
var/image/I = image(icon = src.icon, icon_state = "o_[icon_state]")
I.color = stripe_color
- //VOREStation Add - Shenanigans around this because of the bullshit byond bug
- var/pre_overlays = overlays.len
- overlays.Add(I)
- var/post_overlays = overlays.len
- if(post_overlays != (pre_overlays + 1))
- world.log << "Corrupted overlays on [x],[y],[z] voidcraft wall"
- new type(src)
- return
- //VOREStation Add End
+ add_overlay(I)
diff --git a/code/game/turfs/simulated/wall_types_vr.dm b/code/game/turfs/simulated/wall_types_vr.dm
index 90d389bf53b..4d939c2004d 100644
--- a/code/game/turfs/simulated/wall_types_vr.dm
+++ b/code/game/turfs/simulated/wall_types_vr.dm
@@ -26,7 +26,7 @@
var/list/flesh_overlay_cache = list()
/turf/simulated/flesh/update_icon(var/update_neighbors)
- overlays.Cut()
+ cut_overlays()
if(density)
icon = 'icons/turf/stomach_vr.dmi'
@@ -37,7 +37,7 @@ var/list/flesh_overlay_cache = list()
var/place_dir = turn(direction, 180)
if(!flesh_overlay_cache["flesh_side_[place_dir]"])
flesh_overlay_cache["flesh_side_[place_dir]"] = image('icons/turf/stomach_vr.dmi', "flesh_side", dir = place_dir)
- T.overlays += flesh_overlay_cache["flesh_side_[place_dir]"]
+ add_overlay(flesh_overlay_cache["flesh_side_[place_dir]"])
if(update_neighbors)
for(var/direction in alldirs)
diff --git a/code/game/turfs/simulated/water.dm b/code/game/turfs/simulated/water.dm
index a47578f1029..e4b762d7333 100644
--- a/code/game/turfs/simulated/water.dm
+++ b/code/game/turfs/simulated/water.dm
@@ -16,7 +16,6 @@
update_icon()
/turf/simulated/floor/water/update_icon()
- overlays.Cut()
..() // To get the edges.
icon_state = water_state
var/image/floorbed_sprite = image(icon = 'icons/turf/outdoors.dmi', icon_state = under_state)
@@ -129,16 +128,16 @@ var/list/shoreline_icon_cache = list()
// Water sprites are really annoying, so let BYOND sort it out.
/turf/simulated/floor/water/shoreline/update_icon()
underlays.Cut()
- overlays.Cut()
+ cut_overlays()
..() // Get the underlay first.
var/cache_string = "[initial(icon_state)]_[water_state]_[dir]"
if(cache_string in shoreline_icon_cache) // Check to see if an icon already exists.
- overlays += shoreline_icon_cache[cache_string]
+ add_overlay(shoreline_icon_cache[cache_string])
else // If not, make one, but only once.
var/icon/shoreline_water = icon(src.icon, "shoreline_water", src.dir)
var/icon/shoreline_subtract = icon(src.icon, "[initial(icon_state)]_subtract", src.dir)
shoreline_water.Blend(shoreline_subtract,ICON_SUBTRACT)
shoreline_icon_cache[cache_string] = shoreline_water
- overlays += shoreline_icon_cache[cache_string]
+ add_overlay(shoreline_icon_cache[cache_string])
diff --git a/code/game/turfs/snow/snow.dm b/code/game/turfs/snow/snow.dm
index b09275ca410..a8ccd5b63be 100644
--- a/code/game/turfs/snow/snow.dm
+++ b/code/game/turfs/snow/snow.dm
@@ -26,12 +26,12 @@
. = ..()
/turf/snow/update_icon()
- overlays.Cut()
+ cut_overlays()
for(var/d in crossed_dirs)
var/amt = crossed_dirs[d]
for(var/i in 1 to amt)
- overlays += icon(icon, "footprint[i]", text2num(d))
+ add_overlay(image(icon, "footprint[i]", text2num(d)))
/turf/snow/snow2
name = "snow"
diff --git a/code/game/turfs/space/cracked_asteroid.dm b/code/game/turfs/space/cracked_asteroid.dm
index b9f43af82e2..dae0d5a1296 100644
--- a/code/game/turfs/space/cracked_asteroid.dm
+++ b/code/game/turfs/space/cracked_asteroid.dm
@@ -10,7 +10,8 @@
/turf/space/cracked_asteroid/is_space() // So people don't start floating when standing on it.
return FALSE
-/turf/space/cracked_asteroid/New()
- ..()
- spawn(2 SECONDS)
- overlays.Cut()
\ No newline at end of file
+// u wot m8? ~Leshana
+// /turf/space/cracked_asteroid/New()
+// ..()
+// spawn(2 SECONDS)
+// overlays.Cut()
diff --git a/code/game/turfs/unsimulated/beach.dm b/code/game/turfs/unsimulated/beach.dm
index 57dee24951e..28cebacb8ab 100644
--- a/code/game/turfs/unsimulated/beach.dm
+++ b/code/game/turfs/unsimulated/beach.dm
@@ -17,7 +17,7 @@
/turf/unsimulated/beach/water/New()
..()
- overlays += image("icon"='icons/misc/beach.dmi',"icon_state"="water2","layer"=MOB_LAYER+0.1)
+ add_overlay(image("icon"='icons/misc/beach.dmi',"icon_state"="water2","layer"=MOB_LAYER+0.1))
/turf/simulated/floor/beach
name = "Beach"
@@ -56,4 +56,4 @@
/turf/simulated/floor/beach/water/New()
..()
- overlays += image("icon"='icons/misc/beach.dmi',"icon_state"="water5","layer"=MOB_LAYER+0.1)
+ add_overlay(image("icon"='icons/misc/beach.dmi',"icon_state"="water5","layer"=MOB_LAYER+0.1))
diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm
index 09b525114b3..c7f8f275bfb 100644
--- a/code/modules/holodeck/HolodeckObjects.dm
+++ b/code/modules/holodeck/HolodeckObjects.dm
@@ -107,7 +107,7 @@
/turf/simulated/floor/holofloor/desert/New()
..()
if(prob(10))
- overlays += "asteroid[rand(0,9)]"
+ add_overlay("asteroid[rand(0,9)]")
/obj/structure/holostool
name = "stool"
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index bedb652f381..36e38532957 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -302,7 +302,7 @@
msg += attempt_vr(src,"examine_bellies",args) //VOREStation Code
msg += attempt_vr(src,"examine_pickup_size",args) //VOREStation Code
msg += attempt_vr(src,"examine_step_size",args) //VOREStation Code
- msg += attempt_vr(src,"nif_examine",args) //VOREStation Code
+ msg += attempt_vr(src,"examine_nif",args) //VOREStation Code
if(mSmallsize in mutations)
msg += "[T.He] [T.is] small halfling!\n"
diff --git a/code/modules/mob/living/carbon/human/examine_vr.dm b/code/modules/mob/living/carbon/human/examine_vr.dm
index 0d9dd889f57..d976dc50b1b 100644
--- a/code/modules/mob/living/carbon/human/examine_vr.dm
+++ b/code/modules/mob/living/carbon/human/examine_vr.dm
@@ -130,23 +130,18 @@
return FALSE
-/mob/living/carbon/human/proc/examine_pickup_size(mob/living/carbon/human/H)
+/mob/living/carbon/human/proc/examine_pickup_size(mob/living/H)
var/message = ""
- if(isliving(src) && (H.get_effective_size() - src.get_effective_size()) >= 0.50)
+ if(istype(H) && (H.get_effective_size() - src.get_effective_size()) >= 0.50)
message = "They are small enough that you could easily pick them up!\n"
return message
-
-/mob/living/carbon/human/proc/examine_step_size(mob/living/carbon/human/H)
+/mob/living/carbon/human/proc/examine_step_size(mob/living/H)
var/message = ""
- if(isliving(src) && (H.get_effective_size() - src.get_effective_size()) >= 0.75)
+ if(istype(H) && (H.get_effective_size() - src.get_effective_size()) >= 0.75)
message = "They are small enough that you could easily trample them!\n"
return message
-/mob/living/carbon/human/proc/nif_examine(mob/living/carbon/human/H)
- var/message = ""
- if(!src.nif || src.conceal_nif || !src.nif_examine) //Do they have a nif, do they have the NIF concealed, and do they have a NIF examine message?
- return "" //If so, no message.
- else
- message += "[src.nif_examine]\n"
- return message
+/mob/living/carbon/human/proc/examine_nif(mob/living/carbon/human/H)
+ if(nif && nif.examine_msg) //If you have one set, anyway.
+ return "[nif.examine_msg]\n"
diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm
index 8baa490800a..70ab7f577b5 100644
--- a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm
@@ -9,6 +9,7 @@
mob_size = MOB_MEDIUM
num_alternate_languages = 1 //Let's at least give them one
appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS | HAS_UNDERWEAR
+ trashcan = 1 //They have goopy bodies. They can just dissolve things within them.
inherent_verbs = list(
/mob/living/carbon/human/proc/shapeshifter_select_shape,
/mob/living/carbon/human/proc/shapeshifter_select_colour,
@@ -20,7 +21,8 @@
/mob/living/carbon/human/proc/succubus_drain,
/mob/living/carbon/human/proc/succubus_drain_finalize,
/mob/living/carbon/human/proc/succubus_drain_lethal,
- /mob/living/carbon/human/proc/slime_feed
+ /mob/living/carbon/human/proc/slime_feed,
+ /mob/living/proc/eat_trash
)
diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
index 3797899d96f..56a35acc968 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
@@ -279,8 +279,9 @@
//primitive_form = "Monkey" //I dunno. Replace this in the future.
+ flags = NO_MINOR_CUT
spawn_flags = SPECIES_CAN_JOIN
- appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR | NO_MINOR_CUT
+ appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
flesh_color = "#AFA59E" //Gray-ish. Not sure if this is really needed, but eh.
base_color = "#333333" //Blackish-gray
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 f77637aa05b..3d404de6b37 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm
@@ -51,6 +51,8 @@ var/global/list/robot_modules = list(
if(R.radio)
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)
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 63227dba64d..75517b86c78 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
@@ -14,6 +14,7 @@
LANGUAGE_DAEMON = 0,
LANGUAGE_ENOCHIAN = 0
)
+ var/vr_sprites = list()
/obj/item/weapon/robot_module/robot/clerical
languages = list(
@@ -47,6 +48,10 @@
/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
@@ -55,6 +60,42 @@
src.modules += new /obj/item/device/sleevemate(src) //Lets them scan people.
. = ..() //Any Global vore modules will come from here
+/obj/item/weapon/robot_module/robot/medical/crisis //Allows Crisis module to use Handy sprite
+ vr_sprites = list(
+ "Handy" = "handy-med"
+ )
+
+/obj/item/weapon/robot_module/robot/clerical/butler //VR Handy sprites
+ vr_sprites = list(
+ "Handy - Service" = "handy-service",
+ "Handy - Hydro" = "handy-hydro"
+ )
+
+/obj/item/weapon/robot_module/robot/clerical/general //VR Handy sprites
+ vr_sprites = list(
+ "Handy" = "handy-clerk"
+ )
+
+/obj/item/weapon/robot_module/robot/janitor //VR Handy sprites
+ vr_sprites = list(
+ "Handy" = "handy-janitor"
+ )
+
+/obj/item/weapon/robot_module/robot/security/general //VR Handy sprites
+ vr_sprites = list(
+ "Handy" = "handy-sec"
+ )
+
+/obj/item/weapon/robot_module/robot/miner //VR Handy sprites
+ vr_sprites = list(
+ "Handy" = "handy-miner"
+ )
+
+/obj/item/weapon/robot_module/robot/standard //VR Handy sprites
+ vr_sprites = list(
+ "Handy" = "handy-standard"
+ )
+
/obj/item/weapon/robot_module/robot/knine
name = "k9 robot module"
sprites = list(
diff --git a/code/modules/mob/living/silicon/robot/robot_vr.dm b/code/modules/mob/living/silicon/robot/robot_vr.dm
index 6bf2f77c0dd..2dd54a1e063 100644
--- a/code/modules/mob/living/silicon/robot/robot_vr.dm
+++ b/code/modules/mob/living/silicon/robot/robot_vr.dm
@@ -6,6 +6,17 @@
var/pounce_cooldown_time = 40
var/leap_at
var/dogborg = FALSE
+ var/original_icon = 'icons/mob/robots.dmi'
+ var/vr_icons = list(
+ "handy-hydro",
+ "handy-service",
+ "handy-clerk",
+ "handy-janitor",
+ "handy-miner",
+ "handy-standard",
+ "handy-sec"
+ ) //List of all used sprites that are in robots_vr.dmi
+
/mob/living/silicon/robot/verb/robot_nom(var/mob/living/T in living_mobs(1))
set name = "Robot Nom"
@@ -17,6 +28,7 @@
return feed_grabbed_to_self(src,T)
/mob/living/silicon/robot/updateicon()
+ vr_sprite_check()
..()
if(dogborg == TRUE && stat == CONSCIOUS)
if(sleeper_g == TRUE)
@@ -70,3 +82,10 @@
cleaned_human << "[src] cleans your face!"
return
return
+
+/mob/living/silicon/robot/proc/vr_sprite_check()
+ if((icon_state in vr_icons) && (icon == 'icons/mob/robots.dmi'))
+ original_icon = icon
+ icon = 'icons/mob/robots_vr.dmi'
+ else if(!(icon_state in vr_icons))
+ icon = original_icon
\ No newline at end of file
diff --git a/code/modules/mob/new_player/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_vr.dm
index 7a0503d13a8..e7b6968842c 100644
--- a/code/modules/mob/new_player/sprite_accessories_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_vr.dm
@@ -27,7 +27,7 @@
name = "Hairmaw (Liquidfirefly)"
icon = 'icons/mob/human_face_vr.dmi'
icon_state = "maw_hair"
- ckeys_allowed = list("Liquidfirefly")
+ ckeys_allowed = list("liquidfirefly")
do_colouration = 0
citheronia_colorable
diff --git a/code/modules/multiz/turf.dm b/code/modules/multiz/turf.dm
index d52f16706be..ae44c584121 100644
--- a/code/modules/multiz/turf.dm
+++ b/code/modules/multiz/turf.dm
@@ -73,7 +73,7 @@
* Update icon and overlays of open space to be that of the turf below, plus any visible objects on that turf.
*/
/turf/simulated/open/update_icon()
- overlays = list() // Edit - Overlays are being crashy when modified.
+ cut_overlays() // Edit - Overlays are being crashy when modified.
update_icon_edge()// Add - Get grass into open spaces and whatnot.
var/turf/below = GetBelow(src)
if(below)
@@ -86,12 +86,7 @@
bottom_turf.plane = src.plane
bottom_turf.color = below.color
underlays = list(bottom_turf)
- // Hack workaround to byond crash bug - Include the magic overlay holder object.
- overlays += below.overlays
- // if(below.overlay_holder)
- // overlays += (below.overlays + below.overlay_holder.overlays)
- // else
- // overlays += below.overlays
+ copy_overlays(below)
// get objects (not mobs, they are handled by /obj/zshadow)
var/list/o_img = list()
@@ -104,16 +99,10 @@
temp2.overlays += O.overlays
// TODO Is pixelx/y needed?
o_img += temp2
- var/overlays_pre = overlays.len
- overlays += o_img
- var/overlays_post = overlays.len
- if(overlays_post != (overlays_pre + o_img.len)) //Here we go!
- world.log << "Corrupted openspace turf at [x],[y],[z] being replaced. Pre: [overlays_pre], Post: [overlays_post]"
- new /turf/simulated/open(src)
- return //Let's get out of here.
+ add_overlay(o_img)
if(!below_is_open)
- overlays += over_OS_darkness
+ add_overlay(over_OS_darkness)
return 0
return PROCESS_KILL
diff --git a/code/modules/nifsoft/nif.dm b/code/modules/nifsoft/nif.dm
index 614ce79d4c8..da4594d5575 100644
--- a/code/modules/nifsoft/nif.dm
+++ b/code/modules/nifsoft/nif.dm
@@ -32,7 +32,8 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable
var/tmp/list/nifsofts[TOTAL_NIF_SOFTWARE] // All our nifsofts
var/tmp/list/nifsofts_life = list() // Ones that want to be talked to on life()
var/owner // Owner character name
-
+ var/examine_msg //Message shown on examine.
+
var/tmp/vision_flags = 0 // Flags implants set for faster lookups
var/tmp/health_flags = 0
var/tmp/combat_flags = 0
@@ -69,6 +70,12 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable
//Put loaded data here if we loaded any
save_data = islist(load_data) ? load_data.Copy() : list()
+ var/saved_examine_msg = save_data["examine_msg"]
+
+ //If it's an empty string, they want it blank. If null, it's never been saved, give default.
+ if(isnull(saved_examine_msg))
+ saved_examine_msg = "There's a certain spark to their eyes."
+ examine_msg = saved_examine_msg
//If given a human on spawn (probably from persistence)
if(ishuman(newloc))
@@ -110,6 +117,7 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable
human = H
human.nif = src
stat = NIF_INSTALLING
+ H.verbs |= /mob/living/carbon/human/proc/set_nif_examine
return TRUE
return FALSE
@@ -138,6 +146,7 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable
SC.brainmobs = list()
stat = NIF_PREINSTALL
vis_update()
+ H.verbs |= /mob/living/carbon/human/proc/set_nif_examine
H.nif = null
human = null
install_done = null
@@ -572,3 +581,25 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable
playsound(T,'sound/effects/slime_squish.ogg',50,1)
else
return ..()
+
+/mob/living/carbon/human/proc/set_nif_examine()
+ set name = "NIF Appearance"
+ set desc = "If your NIF alters your appearance in some way, describe it here."
+ set category = "OOC"
+
+ if(!nif)
+ verbs -= /mob/living/carbon/human/proc/set_nif_examine
+ to_chat(src,"You don't have a NIF, not sure why this was here.")
+ return
+
+ var/new_flavor = sanitize(input(src,"Describe how your NIF alters your appearance, like glowy eyes or metal plate on your head, etc. Be sensible. Clear this for no examine text. 128ch max.","Describe NIF", nif.examine_msg) as null|text, max_length = 128)
+ //They clicked cancel or meanwhile lost their NIF
+ if(!nif || isnull(new_flavor))
+ return //No changes
+ //Sanitize or user cleaned it entirely
+ if(!new_flavor)
+ nif.examine_msg = ""
+ nif.save_data["examine_msg"] = ""
+ else
+ nif.examine_msg = new_flavor
+ nif.save_data["examine_msg"] = new_flavor
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 4bdb4eec0ae..4b7fabc1d1a 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -15,8 +15,6 @@
var/vore_taste = null // What the character tastes like
var/no_vore = 0 // If the character/mob can vore.
var/openpanel = 0 // Is the vore panel open?
- var/conceal_nif = 0 // Do they wish to conceal their NIF from examine?
- var/nif_examine = "There's a certain spark to their eyes" //The examine text of their NIF. This is the default placeholder.
var/noisy = 0 // Toggle audible hunger.
var/absorbing_prey = 0 // Determines if the person is using the succubus drain or not. See station_special_abilities_vr.
var/drain_finalized = 0 // Determines if the succubus drain will be KO'd/absorbed. Can be toggled on at any time.
@@ -188,8 +186,6 @@
P.allowmobvore = src.allowmobvore
P.belly_prefs = src.vore_organs
P.vore_taste = src.vore_taste
- P.nif_examine = src.nif_examine
- P.conceal_nif = src.conceal_nif
P.can_be_drop_prey = src.can_be_drop_prey
P.can_be_drop_pred = src.can_be_drop_pred
@@ -209,8 +205,6 @@
digestable = P.digestable
allowmobvore = P.allowmobvore
vore_taste = P.vore_taste
- nif_examine = P.nif_examine
- conceal_nif = P.conceal_nif
can_be_drop_prey = P.can_be_drop_prey
can_be_drop_pred = P.can_be_drop_pred
diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm
index a04d920084f..dcef2a45777 100644
--- a/code/modules/vore/eating/vore_vr.dm
+++ b/code/modules/vore/eating/vore_vr.dm
@@ -45,8 +45,6 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
var/allowmobvore = 1
var/list/belly_prefs = list()
var/vore_taste
- var/conceal_nif
- var/nif_examine
var/can_be_drop_prey
var/can_be_drop_pred
@@ -103,8 +101,6 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
S["allowmobvore"] >> allowmobvore
S["belly_prefs"] >> belly_prefs
S["vore_taste"] >> vore_taste
- S["conceal_nif"] >> conceal_nif
- S["nif_examine"] >> nif_examine
S["can_be_drop_prey"] >> can_be_drop_prey
S["can_be_drop_pred"] >> can_be_drop_pred
@@ -128,8 +124,6 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
S["allowmobvore"] << allowmobvore
S["belly_prefs"] << belly_prefs
S["vore_taste"] << vore_taste
- S["conceal_nif"] << conceal_nif
- S["nif_examine"] << nif_examine
S["can_be_drop_prey"] << can_be_drop_prey
S["can_be_drop_pred"] << can_be_drop_pred
diff --git a/icons/mob/human_face_vr.dmi b/icons/mob/human_face_vr.dmi
index a99dc11c458..9ffa67f0d81 100644
Binary files a/icons/mob/human_face_vr.dmi and b/icons/mob/human_face_vr.dmi differ
diff --git a/icons/mob/robots_vr.dmi b/icons/mob/robots_vr.dmi
new file mode 100644
index 00000000000..1640981e46f
Binary files /dev/null and b/icons/mob/robots_vr.dmi differ
diff --git a/icons/obj/radio_vr.dmi b/icons/obj/radio_vr.dmi
index f26ff6c3f66..77d695cf23c 100644
Binary files a/icons/obj/radio_vr.dmi and b/icons/obj/radio_vr.dmi differ
diff --git a/maps/tether/submaps/beach/_beach.dm b/maps/tether/submaps/beach/_beach.dm
index 54f8e149f7e..e96c75641bc 100644
--- a/maps/tether/submaps/beach/_beach.dm
+++ b/maps/tether/submaps/beach/_beach.dm
@@ -147,7 +147,7 @@
/turf/simulated/floor/beach/coastwater/New()
..()
- overlays += image("icon"='icons/misc/beach.dmi',"icon_state"="water","layer"=MOB_LAYER+0.1)
+ add_overlay(image("icon"='icons/misc/beach.dmi',"icon_state"="water","layer"=MOB_LAYER+0.1))
// -- Areas -- //
diff --git a/maps/tether/tether-02-surface2.dmm b/maps/tether/tether-02-surface2.dmm
index 51329c8d0c5..d84b9b0036d 100644
--- a/maps/tether/tether-02-surface2.dmm
+++ b/maps/tether/tether-02-surface2.dmm
@@ -287,7 +287,7 @@
"aR" = (
/obj/machinery/door/blast/shutters{
dir = 2;
- id = "PubPrep";
+ id = "GateShut";
layer = 3.3;
name = "Gateway Shutter"
},
diff --git a/maps/tether/tether-06-station2.dmm b/maps/tether/tether-06-station2.dmm
index b2740b35217..8fee6963965 100644
--- a/maps/tether/tether-06-station2.dmm
+++ b/maps/tether/tether-06-station2.dmm
@@ -6988,11 +6988,6 @@
pixel_y = 3
},
/obj/item/weapon/circuitboard/autolathe,
-/obj/structure/cable/green{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
/obj/item/weapon/circuitboard/scan_consolenew{
pixel_x = 6;
pixel_y = -3
@@ -8725,10 +8720,6 @@
},
/obj/item/device/multitool,
/obj/item/clothing/glasses/meson,
-/obj/machinery/ai_status_display{
- pixel_x = 32;
- pixel_y = 0
- },
/obj/machinery/light/small,
/turf/simulated/floor/plating,
/area/storage/tech)
@@ -8745,6 +8736,10 @@
/obj/item/device/t_scanner,
/obj/item/clothing/glasses/meson,
/obj/item/device/multitool,
+/obj/machinery/ai_status_display{
+ pixel_x = 0;
+ pixel_y = -32
+ },
/turf/simulated/floor/plating,
/area/storage/tech)
"oI" = (
diff --git a/vorestation.dme b/vorestation.dme
index 8e67a77faaf..2ed7d60c9b4 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -199,7 +199,6 @@
#include "code\controllers\subsystems\airflow.dm"
#include "code\controllers\subsystems\atoms.dm"
#include "code\controllers\subsystems\bellies_vr.dm"
-#include "code\controllers\subsystems\floor_decals.dm"
#include "code\controllers\subsystems\garbage.dm"
#include "code\controllers\subsystems\lighting.dm"
#include "code\controllers\subsystems\machines.dm"
@@ -1214,7 +1213,6 @@
#include "code\game\turfs\flooring\flooring_premade.dm"
#include "code\game\turfs\flooring\flooring_vr.dm"
#include "code\game\turfs\flooring\shuttle_vr.dm"
-#include "code\game\turfs\flooring\turf_overlay_holder.dm"
#include "code\game\turfs\initialization\init.dm"
#include "code\game\turfs\initialization\maintenance.dm"
#include "code\game\turfs\simulated\floor.dm"
@@ -2808,6 +2806,9 @@
#include "maps\southern_cross\items\clothing\sc_suit.dm"
#include "maps\southern_cross\items\clothing\sc_under.dm"
#include "maps\southern_cross\job\outfits.dm"
+#include "maps\southern_cross\loadout\loadout_head.dm"
+#include "maps\southern_cross\loadout\loadout_suit.dm"
+#include "maps\southern_cross\loadout\loadout_uniform.dm"
#include "maps\southern_cross\structures\closets\misc.dm"
#include "maps\submaps\_readme.dm"
#include "maps\submaps\engine_submaps\engine.dm"