diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 9847556b37..a39ebf36ba 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -30,31 +30,32 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
//Human Overlays Indexes/////////
//LOTS OF CIT CHANGES HERE. BE CAREFUL WHEN UPSTREAM ADDS MORE LAYERS
-#define MUTATIONS_LAYER 32 //mutations. Tk headglows, cold resistance glow, etc
-#define GENITALS_BEHIND_LAYER 31 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer
-#define BODY_BEHIND_LAYER 30 //certain mutantrace features (tail when looking south) that must appear behind the body parts
-#define BODYPARTS_LAYER 29 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag
-#define MARKING_LAYER 28 //Matrixed body markings because clashing with snouts?
-#define BODY_ADJ_LAYER 27 //certain mutantrace features (snout, body markings) that must appear above the body parts
-#define GENITALS_FRONT_LAYER 26 //Draws some genitalia above clothes and the TAUR body if need be.
-#define BODY_LAYER 25 //underwear, undershirts, socks, eyes, lips(makeup)
-#define BODY_ADJ_UPPER_LAYER 24
-#define FRONT_MUTATIONS_LAYER 23 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes)
-#define DAMAGE_LAYER 22 //damage indicators (cuts and burns)
-#define UNIFORM_LAYER 21
-#define ID_LAYER 20
-#define HANDS_PART_LAYER 19
-#define SHOES_LAYER 18
-#define GLOVES_LAYER 17
-#define EARS_LAYER 16
-#define SUIT_LAYER 15
-#define GENITALS_EXPOSED_LAYER 14
-#define GLASSES_LAYER 13
-#define BELT_LAYER 12 //Possible make this an overlay of somethign required to wear a belt?
-#define SUIT_STORE_LAYER 11
-#define NECK_LAYER 10
-#define BACK_LAYER 9
-#define HAIR_LAYER 8 //TODO: make part of head layer?
+#define MUTATIONS_LAYER 33 //mutations. Tk headglows, cold resistance glow, etc
+#define GENITALS_BEHIND_LAYER 32 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer
+#define BODY_BEHIND_LAYER 31 //certain mutantrace features (tail when looking south) that must appear behind the body parts
+#define BODYPARTS_LAYER 30 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag
+#define MARKING_LAYER 29 //Matrixed body markings because clashing with snouts?
+#define BODY_ADJ_LAYER 28 //certain mutantrace features (snout, body markings) that must appear above the body parts
+#define GENITALS_FRONT_LAYER 27 //Draws some genitalia above clothes and the TAUR body if need be.
+#define BODY_LAYER 26 //underwear, undershirts, socks, eyes, lips(makeup)
+#define BODY_ADJ_UPPER_LAYER 25
+#define FRONT_MUTATIONS_LAYER 24 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes)
+#define DAMAGE_LAYER 23 //damage indicators (cuts and burns)
+#define UNIFORM_LAYER 22
+#define ID_LAYER 21
+#define HANDS_PART_LAYER 20
+#define SHOES_LAYER 19
+#define GLOVES_LAYER 18
+#define EARS_LAYER 17
+#define SUIT_LAYER 16
+#define GENITALS_EXPOSED_LAYER 15
+#define GLASSES_LAYER 14
+#define BELT_LAYER 13 //Possible make this an overlay of somethign required to wear a belt?
+#define SUIT_STORE_LAYER 12
+#define NECK_LAYER 11
+#define BACK_LAYER 10
+#define HAIR_LAYER 9 //TODO: make part of head layer?
+#define HORNS_LAYER 8
#define FACEMASK_LAYER 7
#define HEAD_LAYER 6
#define HANDCUFF_LAYER 5
@@ -62,7 +63,7 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
#define HANDS_LAYER 3
#define BODY_FRONT_LAYER 2
#define FIRE_LAYER 1 //If you're on fire
-#define TOTAL_LAYERS 32 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_;
+#define TOTAL_LAYERS 33 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_;
//Human Overlay Index Shortcuts for alternate_worn_layer, layers
//Because I *KNOW* somebody will think layer+1 means "above"
diff --git a/code/datums/components/decal.dm b/code/datums/components/decal.dm
deleted file mode 100644
index 60317797a7..0000000000
--- a/code/datums/components/decal.dm
+++ /dev/null
@@ -1,77 +0,0 @@
-/datum/component/decal
- dupe_mode = COMPONENT_DUPE_ALLOWED
- can_transfer = TRUE
- var/cleanable
- var/description
- var/mutable_appearance/pic
-
- var/first_dir // This only stores the dir arg from init
-
-/datum/component/decal/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_GOD, _color, _layer=TURF_LAYER, _description, _alpha=255)
- if(!isatom(parent) || !generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha))
- return COMPONENT_INCOMPATIBLE
- first_dir = _dir
- description = _description
- cleanable = _cleanable
-
- apply()
-
-/datum/component/decal/RegisterWithParent()
- . = ..()
- if(first_dir)
- RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, .proc/rotate_react)
- if(cleanable)
- RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react)
- if(description)
- RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine)
-
-/datum/component/decal/UnregisterFromParent()
- . = ..()
- UnregisterSignal(parent, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE))
-
-/datum/component/decal/Destroy()
- remove()
- return ..()
-
-/datum/component/decal/PreTransfer()
- remove()
-
-/datum/component/decal/PostTransfer()
- remove()
- apply()
-
-/datum/component/decal/proc/generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha)
- if(!_icon || !_icon_state)
- return FALSE
- // It has to be made from an image or dir breaks because of a byond bug
- var/temp_image = image(_icon, null, _icon_state, _layer, _dir)
- pic = new(temp_image)
- pic.color = _color
- pic.alpha = _alpha
- return TRUE
-
-/datum/component/decal/proc/apply(atom/thing)
- var/atom/master = thing || parent
- master.add_overlay(pic, TRUE)
- if(isitem(master))
- addtimer(CALLBACK(master, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE)
-
-/datum/component/decal/proc/remove(atom/thing)
- var/atom/master = thing || parent
- master.cut_overlay(pic, TRUE)
- if(isitem(master))
- addtimer(CALLBACK(master, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE)
-
-/datum/component/decal/proc/rotate_react(datum/source, old_dir, new_dir)
- if(old_dir == new_dir)
- return
- remove()
- pic.dir = turn(pic.dir, dir2angle(old_dir) - dir2angle(new_dir))
- apply()
-
-/datum/component/decal/proc/clean_react(datum/source, strength)
- if(strength >= cleanable)
- qdel(src)
-
-/datum/component/decal/proc/examine(datum/source, mob/user, list/examine_list)
- examine_list += description
\ No newline at end of file
diff --git a/code/datums/components/decals/blood.dm b/code/datums/components/decals/blood.dm
deleted file mode 100644
index c8be6251b5..0000000000
--- a/code/datums/components/decals/blood.dm
+++ /dev/null
@@ -1,13 +0,0 @@
-/datum/component/decal/blood
- dupe_mode = COMPONENT_DUPE_UNIQUE
-
-/datum/component/decal/blood/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_STRENGTH_BLOOD, _color, _layer=ABOVE_OBJ_LAYER)
- if(!isitem(parent))
- return COMPONENT_INCOMPATIBLE
- . = ..()
- RegisterSignal(parent, COMSIG_ATOM_GET_EXAMINE_NAME, .proc/get_examine_name)
-
-/datum/component/decal/blood/proc/get_examine_name(datum/source, mob/user, list/override)
- var/atom/A = parent
-
- return COMPONENT_EXNAME_CHANGED
diff --git a/code/datums/components/orbiter.dm b/code/datums/components/orbiter.dm
index 49e6b91c6d..53373de6d7 100644
--- a/code/datums/components/orbiter.dm
+++ b/code/datums/components/orbiter.dm
@@ -62,7 +62,9 @@
orbiters[orbiter] = TRUE
orbiter.orbiting = src
RegisterSignal(orbiter, COMSIG_MOVABLE_MOVED, .proc/orbiter_move_react)
+
var/matrix/initial_transform = matrix(orbiter.transform)
+ orbiters[orbiter] = initial_transform
// Head first!
if(pre_rotation)
@@ -79,8 +81,6 @@
orbiter.SpinAnimation(rotation_speed, -1, clockwise, rotation_segments, parallel = FALSE)
- //we stack the orbits up client side, so we can assign this back to normal server side without it breaking the orbit
- orbiter.transform = initial_transform
orbiter.forceMove(get_turf(parent))
to_chat(orbiter, "Now orbiting [parent].")
@@ -89,6 +89,8 @@
return
UnregisterSignal(orbiter, COMSIG_MOVABLE_MOVED)
orbiter.SpinAnimation(0, 0)
+ if(istype(orbiters[orbiter],/matrix)) //This is ugly.
+ orbiter.transform = orbiters[orbiter]
orbiters -= orbiter
orbiter.stop_orbit(src)
orbiter.orbiting = null
diff --git a/code/datums/elements/decal.dm b/code/datums/elements/decal.dm
new file mode 100644
index 0000000000..4bd482915a
--- /dev/null
+++ b/code/datums/elements/decal.dm
@@ -0,0 +1,75 @@
+/datum/element/decal
+ element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
+ id_arg_index = 2
+ var/cleanable
+ var/description
+ var/mutable_appearance/pic
+ var/list/num_decals_per_atom
+
+ var/first_dir // This stores the direction of the decal compared to the parent facing NORTH
+
+/datum/element/decal/Attach(datum/target, _icon, _icon_state, _dir, _cleanable=CLEAN_GOD, _color, _layer=TURF_LAYER, _description, _alpha=255)
+ . = ..()
+ if(. == ELEMENT_INCOMPATIBLE || !_icon || !_icon_state || !isatom(target))
+ return ELEMENT_INCOMPATIBLE
+ var/atom/A = target
+ if(!pic)
+ // It has to be made from an image or dir breaks because of a byond bug
+ var/temp_image = image(_icon, null, _icon_state, _layer, _dir)
+ pic = new(temp_image)
+ pic.color = _color
+ pic.alpha = _alpha
+ first_dir = _dir
+ description = _description
+ cleanable = _cleanable
+
+ LAZYINITLIST(num_decals_per_atom)
+
+ if(!num_decals_per_atom[A])
+ if(first_dir)
+ RegisterSignal(A, COMSIG_ATOM_DIR_CHANGE, .proc/rotate_react)
+ if(cleanable)
+ RegisterSignal(A, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react)
+ if(description)
+ RegisterSignal(A, COMSIG_PARENT_EXAMINE, .proc/examine)
+
+ apply(A, TRUE)
+
+ num_decals_per_atom[A]++
+
+/datum/element/decal/Detach(datum/target)
+ var/atom/A = target
+ remove(A, A.dir)
+ UnregisterSignal(A, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE))
+ LAZYREMOVE(num_decals_per_atom, A)
+ return ..()
+
+/datum/element/decal/proc/remove(atom/target, old_dir)
+ pic.dir = first_dir == NORTH ? target.dir : turn(first_dir, dir2angle(old_dir))
+ for(var/i in 1 to num_decals_per_atom[target])
+ target.cut_overlay(pic, TRUE)
+ if(isitem(target))
+ addtimer(CALLBACK(target, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE)
+
+/datum/element/decal/proc/apply(atom/target, init = FALSE)
+ pic.dir = first_dir == NORTH ? target.dir : turn(first_dir, dir2angle(target.dir))
+ if(init)
+ target.add_overlay(pic, TRUE)
+ else
+ for(var/i in 1 to num_decals_per_atom[target])
+ target.add_overlay(pic, TRUE)
+ if(isitem(target))
+ addtimer(CALLBACK(target, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE)
+
+/datum/element/decal/proc/rotate_react(datum/source, old_dir, new_dir)
+ if(old_dir == new_dir)
+ return
+ remove(source, old_dir)
+ apply(source)
+
+/datum/element/decal/proc/clean_react(datum/source, strength)
+ if(strength >= cleanable)
+ Detach(source)
+
+/datum/element/decal/proc/examine(datum/source, mob/user, list/examine_list)
+ examine_list += description
diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm
index 2e5dae3e04..68a9c1ce07 100644
--- a/code/game/gamemodes/objective_items.dm
+++ b/code/game/gamemodes/objective_items.dm
@@ -36,6 +36,7 @@
targetitem = /obj/item/gun/energy/e_gun/hos
difficulty = 10
excludefromjob = list("Head Of Security")
+ altitems = list(/obj/item/gun/ballistic/revolver/mws)
/datum/objective_item/steal/handtele
name = "a hand teleporter."
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
old mode 100755
new mode 100644
index 8545e6f35c..2fff2011c1
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -17,6 +17,8 @@
/obj/item/melee/baton,
/obj/item/ammo_box/magazine/recharge,
/obj/item/modular_computer,
+ /obj/item/ammo_casing/mws_batt,
+ /obj/item/ammo_box/magazine/mws_mag,
/obj/item/twohanded/electrostaff,
/obj/item/gun/ballistic/automatic/magrifle))
@@ -143,6 +145,29 @@
using_power = TRUE
update_icon()
return
+
+ if(istype(charging, /obj/item/ammo_casing/mws_batt))
+ var/obj/item/ammo_casing/mws_batt/R = charging
+ if(R.cell.charge < R.cell.maxcharge)
+ R.cell.give(R.cell.chargerate * recharge_coeff)
+ use_power(250 * recharge_coeff)
+ using_power = 1
+ if(R.BB == null)
+ R.chargeshot()
+ update_icon(using_power)
+
+ if(istype(charging, /obj/item/ammo_box/magazine/mws_mag))
+ var/obj/item/ammo_box/magazine/mws_mag/R = charging
+ for(var/B in R.stored_ammo)
+ var/obj/item/ammo_casing/mws_batt/batt = B
+ if(batt.cell.charge < batt.cell.maxcharge)
+ batt.cell.give(batt.cell.chargerate * recharge_coeff)
+ use_power(250 * recharge_coeff)
+ using_power = 1
+ if(batt.BB == null)
+ batt.chargeshot()
+ update_icon(using_power)
+
else
return PROCESS_KILL
diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm
index 5dbd18aa0c..25b262a146 100644
--- a/code/game/objects/effects/decals/decal.dm
+++ b/code/game/objects/effects/decals/decal.dm
@@ -46,4 +46,4 @@
var/turf/T = loc
if(!istype(T)) //you know this will happen somehow
CRASH("Turf decal initialized in an object/nullspace")
- T.AddComponent(/datum/component/decal, icon, icon_state, dir, CLEAN_GOD, color, null, null, alpha)
+ T.AddElement(/datum/element/decal, icon, icon_state, turn(dir, -dir2angle(T.dir)), CLEAN_GOD, color, null, null, alpha)
diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm
index b6be778456..c9a31a48c2 100644
--- a/code/game/objects/items/airlock_painter.dm
+++ b/code/game/objects/items/airlock_painter.dm
@@ -157,7 +157,7 @@
to_chat(user, "You need to get closer!")
return
if(use_paint(user) && isturf(F))
- F.AddComponent(/datum/component/decal, 'icons/turf/decals.dmi', stored_decal_total, stored_dir, CLEAN_STRONG, color, null, null, alpha)
+ F.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', stored_decal_total, turn(stored_dir, -dir2angle(F.dir)), CLEAN_STRONG, color, null, null, alpha)
/obj/item/airlock_painter/decal/attack_self(mob/user)
if((ink) && (ink.charges >= 1))
diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm
index c4bb8c594c..ae9ea6985c 100644
--- a/code/game/objects/items/miscellaneous.dm
+++ b/code/game/objects/items/miscellaneous.dm
@@ -115,6 +115,20 @@
new /obj/item/toy/crayon/spraycan(src)
new /obj/item/clothing/shoes/sandal(src)
+/obj/item/choice_beacon/hosgun
+ name = "personal weapon beacon"
+ desc = "Use this to summon your personal Head of Security issued firearm!"
+
+/obj/item/choice_beacon/hosgun/generate_display_names()
+ var/static/list/hos_gun_list
+ if(!hos_gun_list)
+ hos_gun_list = list()
+ var/list/templist = subtypesof(/obj/item/storage/secure/briefcase/hos/) //we have to convert type = name to name = type, how lovely!
+ for(var/V in templist)
+ var/atom/A = V
+ hos_gun_list[initial(A.name)] = A
+ return hos_gun_list
+
/obj/item/skub
desc = "It's skub."
name = "skub"
diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm
index ef70bd201d..1caf13454b 100644
--- a/code/game/objects/items/storage/secure.dm
+++ b/code/game/objects/items/storage/secure.dm
@@ -147,6 +147,35 @@
for(var/i = 0, i < STR.max_items - 2, i++)
new /obj/item/stack/spacecash/c1000(src)
+/obj/item/storage/secure/briefcase/mws_pack
+ name = "\improper \'MWS\' gun kit"
+ desc = "A storage case for a multi-purpose handgun. Variety hour!"
+
+/obj/item/storage/secure/briefcase/mws_pack/PopulateContents()
+ new /obj/item/gun/ballistic/revolver/mws(src)
+ new /obj/item/ammo_box/magazine/mws_mag(src)
+ for(var/path in subtypesof(/obj/item/ammo_casing/mws_batt))
+ new path(src)
+
+/obj/item/storage/secure/briefcase/hos/mws_pack_hos
+ name = "\improper \'MWS\' gun kit"
+ desc = "A storage case for a multi-purpose handgun. Variety hour!"
+
+/obj/item/storage/secure/briefcase/hos/mws_pack_hos/PopulateContents()
+ new /obj/item/gun/ballistic/revolver/mws(src)
+ new /obj/item/ammo_box/magazine/mws_mag(src)
+ new /obj/item/ammo_casing/mws_batt/lethal(src)
+ new /obj/item/ammo_casing/mws_batt/lethal(src)
+ new /obj/item/ammo_casing/mws_batt/stun(src)
+ new /obj/item/ammo_casing/mws_batt/stun(src)
+ new /obj/item/ammo_casing/mws_batt/ion(src)
+
+/obj/item/storage/secure/briefcase/hos/multiphase_box
+ name = "\improper X-01 Multiphase energy gun box"
+ desc = "A storage case for a high-tech energy firearm."
+
+/obj/item/storage/secure/briefcase/mws_pack_hos/PopulateContents()
+ new /obj/item/gun/energy/e_gun/hos(src)
// -----------------------------
// Secure Safe
@@ -183,4 +212,4 @@
return attack_self(user)
/obj/item/storage/secure/safe/HoS
- name = "head of security's safe"
+ name = "head of security's safe"
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index e5c50af782..9f4da351fa 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -76,12 +76,13 @@
new /obj/item/storage/box/flashbangs(src)
new /obj/item/shield/riot/tele(src)
new /obj/item/storage/belt/security/full(src)
- new /obj/item/gun/energy/e_gun/hos(src)
+ new /obj/item/choice_beacon/hosgun(src)
new /obj/item/flashlight/seclite(src)
new /obj/item/pinpointer/nuke(src)
new /obj/item/circuitboard/machine/techfab/department/security(src)
new /obj/item/storage/photo_album/HoS(src)
new /obj/item/clothing/suit/hooded/wintercoat/hos(src)
+
/obj/structure/closet/secure_closet/warden
name = "\proper warden's locker"
req_access = list(ACCESS_ARMORY)
diff --git a/code/game/turfs/simulated/floor/plasteel_floor.dm b/code/game/turfs/simulated/floor/plasteel_floor.dm
index 0f366fae03..af48160ef1 100644
--- a/code/game/turfs/simulated/floor/plasteel_floor.dm
+++ b/code/game/turfs/simulated/floor/plasteel_floor.dm
@@ -146,95 +146,3 @@
/turf/open/floor/plasteel/sepia
icon_state = "sepia"
-
-///////////////////////////////
-// Pre-Applied Decal Floors //
-//////////////////////////////
-
-// Neutral
-/turf/open/floor/plasteel/neutral
- icon_state = "neutral_full"
-/turf/open/floor/plasteel/neutral/side
- icon_state = "neutral"
-/turf/open/floor/plasteel/neutral/corner
- icon_state = "neutral_corner"
-
-// Dark Neutral
-/turf/open/floor/plasteel/dark/neutral
- icon_state = "dark_neutral_full"
-/turf/open/floor/plasteel/dark/neutral/checker
- icon_state = "dark_neutral_checker"
-/turf/open/floor/plasteel/dark/neutral/side
- icon_state = "dark_neutral"
-/turf/open/floor/plasteel/dark/neutral/corner
- icon_state = "dark_neutral_corner"
-
-// Dark Security
-/turf/open/floor/plasteel/dark/security
- icon_state = "dark_red_full"
-/turf/open/floor/plasteel/dark/security/checker
- icon_state = "dark_red_checker"
-/turf/open/floor/plasteel/dark/security/side
- icon_state = "dark_red"
-/turf/open/floor/plasteel/dark/security/corner
- icon_state = "dark_red_corner"
-
-// Engineering
-/turf/open/floor/plasteel/engineering
- icon_state = "engineering_full"
-/turf/open/floor/plasteel/engineering/side
- icon_state = "engineering"
-/turf/open/floor/plasteel/engineering/corner
- icon_state = "engineering_corner"
-
-// Atmospherics
-/turf/open/floor/plasteel/atmospherics
- icon_state = "atmospherics_full"
-/turf/open/floor/plasteel/atmospherics/side
- icon_state = "atmospherics"
-/turf/open/floor/plasteel/atmospherics/corner
- icon_state = "atmospherics_corner"
-
-// Command
-/turf/open/floor/plasteel/command
- icon_state = "command_full"
-/turf/open/floor/plasteel/command/side
- icon_state = "command"
-/turf/open/floor/plasteel/command/corner
- icon_state = "command_corner"
-
-// Medical
-/turf/open/floor/plasteel/medical
- icon_state = "medical_full"
-/turf/open/floor/plasteel/medical/alt
- icon_state = "medical_alt"
-/turf/open/floor/plasteel/medical/side
- icon_state = "medical"
-/turf/open/floor/plasteel/medical/corner
- icon_state = "medical_corner"
-
-// Security
-/turf/open/floor/plasteel/security
- icon_state = "security_full"
-/turf/open/floor/plasteel/security/side
- icon_state = "security"
-/turf/open/floor/plasteel/security/corner
- icon_state = "security_corner"
-
-// Cargo
-/turf/open/floor/plasteel/cargo
- icon_state = "cargo_full"
-/turf/open/floor/plasteel/cargo/side
- icon_state = "cargo"
-/turf/open/floor/plasteel/cargo/corner
- icon_state = "cargo_corner"
-
-// Misc
-/turf/open/floor/plasteel/showroomfloor/shower
- icon_state = "shower"
-/turf/open/floor/plasteel/goonplaque/alien
- icon_state = "plaque1"
- desc = "\"This is a plaque is a collaboration of iconography celebrating the peaceful collaboration between the people of Earth and distant alien species."
-/turf/open/floor/plasteel/goonplaque/charter
- icon_state = "plaque2"
- desc = "\"A golden plaque. Etched into it is the introductory article for a cross-species interplanetary constitution, guaranteeing equal rights between species that Nanotrasen relunctantly agreed to."
diff --git a/code/modules/admin/view_variables/debug_variables.dm b/code/modules/admin/view_variables/debug_variables.dm
index 23f85cba15..5116cd5cd6 100644
--- a/code/modules/admin/view_variables/debug_variables.dm
+++ b/code/modules/admin/view_variables/debug_variables.dm
@@ -1,4 +1,5 @@
#define VV_HTML_ENCODE(thing) ( sanitize ? html_encode(thing) : thing )
+/// Get displayed variable in VV variable list
/proc/debug_variable(name, value, level, datum/D, sanitize = TRUE) //if D is a list, name will be index, and value will be assoc value.
var/header
if(D)
@@ -35,6 +36,19 @@
else if (isfile(value))
item = "[VV_HTML_ENCODE(name)] = '[value]'"
+ else if(istype(value, /matrix)) // Needs to be before datum
+ var/matrix/M = value
+ item = {"[VV_HTML_ENCODE(name)] =
+
+
+
+
[M.a]
[M.d]
0
+
[M.b]
[M.e]
0
+
[M.c]
[M.f]
1
+
+
+
"} //TODO link to modify_transform wrapper for all matrices
+
else if (istype(value, /datum))
var/datum/DV = value
if ("[DV]" != "[DV.type]") //if the thing as a name var, lets use it.
diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm
index a85b4ff1a3..abe445589f 100644
--- a/code/modules/admin/view_variables/view_variables.dm
+++ b/code/modules/admin/view_variables/view_variables.dm
@@ -96,16 +96,7 @@