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 @@ [title] - +