\"[pick("Send me some supplies!", "Transfer supplies.")]\" "
dat += temptext
- user << browse("[dat]", "window=syndbeacon")
- onclose(user, "syndbeacon")
+
+ var/datum/browser/popup = new(user, "syndbeacon", "Ominous Beacon")
+ popup.set_content(dat)
+ popup.open()
/obj/machinery/syndicate_beacon/virgo/Topic(href, href_list)
if(href_list["betraitor"])
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index 5b4536e87a8..45fb756b921 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -32,6 +32,7 @@
/obj/machinery/washing_machine/Initialize(mapload)
. = ..()
default_apply_parts()
+ AddElement(/datum/element/climbable)
/obj/machinery/washing_machine/AltClick()
start()
diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm
index 5a97dc4c0b3..0404e30235a 100644
--- a/code/game/objects/buckling.dm
+++ b/code/game/objects/buckling.dm
@@ -38,6 +38,9 @@
if(can_buckle && istype(M))
if(user_buckle_mob(M, user))
return TRUE
+ if(M == user && HAS_TRAIT(src,TRAIT_CLIMBABLE)) // Buckling takes priority
+ SEND_SIGNAL(src, COMSIG_CLIMBABLE_START_CLIMB, user)
+ return TRUE
/atom/movable/proc/has_buckled_mobs()
return LAZYLEN(buckled_mobs)
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 3d2e7e63b32..83d286937c2 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -269,7 +269,7 @@ var/global/list/image/splatter_cache=list()
//This version should be used for admin spawns and pre-mapped virus vectors (e.g. in PoIs), this version does not dry
/obj/effect/decal/cleanable/mucus/mapped/Initialize(mapload)
. = ..()
- viruses |= new /datum/disease/advance
+ viruses |= new /datum/disease/advance/random(rand(3, 6), 9, 4, infected = src)
/obj/effect/decal/cleanable/mucus/mapped/Destroy()
viruses.Cut()
diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm
index 5e2f58fdc1b..8021ef414b7 100644
--- a/code/game/objects/effects/gibs.dm
+++ b/code/game/objects/effects/gibs.dm
@@ -47,10 +47,8 @@
gib.update_icon()
gib.init_forensic_data()
- if(MobDNA)
- gib.add_blooddna(MobDNA,null)
- else if(istype(src, /obj/effect/gibspawner/human)) // Probably a monkey
- gib.add_blooddna(null,null)
+ gib.add_blooddna(MobDNA,null)
+
if(istype(location,/turf/))
var/list/directions = gibdirections[i]
if(directions.len)
diff --git a/code/game/objects/items/blueprints_vr.dm b/code/game/objects/items/blueprints_vr.dm
index 81bf755e807..52d7104ade5 100644
--- a/code/game/objects/items/blueprints_vr.dm
+++ b/code/game/objects/items/blueprints_vr.dm
@@ -8,7 +8,7 @@
// Now that I've scared away half the people looking at this file, here's the relevant info:
-// Banning areas: Go to global_lists_vr, jump to the BUILDABLE_AREA_TYPES and read the comments left there.
+// Banning areas: Go to global_lists_vr, jump to the GLOB.BUILDABLE_AREA_TYPES and read the comments left there.
@@ -339,11 +339,11 @@
if(A.outdoors)
return AREA_SPACE
- for (var/type in BUILDABLE_AREA_TYPES)
+ for (var/type in GLOB.BUILDABLE_AREA_TYPES)
if ( istype(A,type) )
return AREA_SPACE
- for (var/type in SPECIALS)
+ for (var/type in GLOB.SPECIALS)
if ( istype(A,type) )
return AREA_SPECIAL
return AREA_STATION
@@ -471,7 +471,7 @@
to_chat(creator, span_warning("You need more paper before you can even think of editing this area!"))
return
- var/list/turfs = detect_room(get_turf(creator), area_or_turf_fail_types, BP_MAX_ROOM_SIZE*2)
+ var/list/turfs = detect_room(get_turf(creator), GLOB.area_or_turf_fail_types, BP_MAX_ROOM_SIZE*2)
if(!turfs)
to_chat(creator, span_warning("The new area must have a floor and not a part of a shuttle."))
return
@@ -483,7 +483,7 @@
for(var/i in 1 to length(turfs))
var/area/place = get_area(turfs[i])
- if(blacklisted_areas[place.type])
+ if(GLOB.blacklisted_areas[place.type])
continue
if(!place.requires_power || (place.flag_check(BLUE_SHIELDED)))
continue // No expanding powerless rooms etc
@@ -551,7 +551,7 @@
to_chat(creator, span_warning("You need more paper before you can even think of editing this area!"))
return
- var/res = detect_room_ex(get_turf(creator), can_create_areas_into, area_or_turf_fail_types)
+ var/res = detect_room_ex(get_turf(creator), can_create_areas_into, GLOB.area_or_turf_fail_types)
if(!res)
to_chat(creator, span_warning("There is an area forbidden from being edited here! Use the fine-tune area creator! (3x3)"))
return
@@ -578,7 +578,7 @@
var/str //What the new area is named.
var/can_make_new_area = 1 //If they can make a new area here or not.
- var/list/nearby_turfs_to_check = detect_room(get_turf(creator), area_or_turf_fail_types, BP_MAX_ROOM_SIZE*2) //Get the nearby areas.
+ var/list/nearby_turfs_to_check = detect_room(get_turf(creator), GLOB.area_or_turf_fail_types, BP_MAX_ROOM_SIZE*2) //Get the nearby areas.
if(!nearby_turfs_to_check)
to_chat(creator, span_warning("The new area must have a floor and not a part of a shuttle."))
@@ -589,10 +589,10 @@
for(var/i in 1 to length(nearby_turfs_to_check))
var/area/place = get_area(nearby_turfs_to_check[i])
- if(blacklisted_areas[place.type])
+ if(GLOB.blacklisted_areas[place.type])
if(!creator.lastarea != place) //Stops them from merging a blacklisted area to make it larger. Allows them to merge a blacklisted area into an allowed area. (Expansion!)
continue
- if(!BUILDABLE_AREA_TYPES[place.type]) //TODOTODOTODO
+ if(!GLOB.BUILDABLE_AREA_TYPES[place.type]) //TODOTODOTODO
can_make_new_area = 0
if(!place.requires_power || (place.flag_check(BLUE_SHIELDED)))
continue // No expanding powerless rooms etc
@@ -810,14 +810,14 @@
/proc/get_new_area_type(area/A) //1 = can build in. 0 = can not build in.
if (!A)
A = get_area(usr)
- if(A.outdoors) //ALWAYS able to build outdoors. This means if it's missed in BUILDABLE_AREA_TYPES it's fine.
+ if(A.outdoors) //ALWAYS able to build outdoors. This means if it's missed in GLOB.BUILDABLE_AREA_TYPES it's fine.
return 1
- for (var/type in BUILDABLE_AREA_TYPES) //This works well.
+ for (var/type in GLOB.BUILDABLE_AREA_TYPES) //This works well.
if ( istype(A,type) )
return 1
- for (var/type in SPECIALS)
+ for (var/type in GLOB.SPECIALS)
if ( istype(A,type) )
return 0
return 0 //If it's not a buildable area, don't let them build in it.
@@ -891,7 +891,7 @@
var/area/oldA = get_area(get_turf(creator)) //The old area (area currently standing in)
var/str //What the new area is named.
- var/list/nearby_turfs_to_check = detect_room(get_turf(creator), area_or_turf_fail_types, 70) //Get the nearby areas.
+ var/list/nearby_turfs_to_check = detect_room(get_turf(creator), GLOB.area_or_turf_fail_types, 70) //Get the nearby areas.
if(!nearby_turfs_to_check)
to_chat(creator, span_warning("The new area must have a floor and not a part of a shuttle."))
@@ -901,7 +901,7 @@
return
//They can select an area they want to turn their current area into.
- str = sanitizeSafe(tgui_input_text(usr, "What would you like to name the area?", "Area Name", null, MAX_NAME_LEN), MAX_NAME_LEN)
+ str = sanitizeSafe(tgui_input_text(creator, "What would you like to name the area?", "Area Name", null, MAX_NAME_LEN), MAX_NAME_LEN)
if(isnull(str)) //They pressed cancel.
to_chat(creator, span_warning("No new area made. Cancelling."))
return
diff --git a/code/game/objects/items/devices/denecrotizer_vr.dm b/code/game/objects/items/devices/denecrotizer_vr.dm
index b4af408bf7a..808222582c1 100644
--- a/code/game/objects/items/devices/denecrotizer_vr.dm
+++ b/code/game/objects/items/devices/denecrotizer_vr.dm
@@ -11,10 +11,10 @@
if(var_value)
ghostjoin = TRUE
- active_ghost_pods |= src
+ GLOB.active_ghost_pods |= src
else
ghostjoin = FALSE
- active_ghost_pods -= src
+ GLOB.active_ghost_pods -= src
ghostjoin_icon()
. = TRUE
@@ -63,7 +63,7 @@
/// Inject a ghost into this mob. Assumes you've done all sanity before this point.
/mob/living/simple_mob/proc/ghost_join(mob/observer/dead/D)
log_and_message_admins("joined [src] as a ghost [ADMIN_FLW(src)]", D)
- active_ghost_pods -= src
+ GLOB.active_ghost_pods -= src
// Move the ghost in
if(D.mind)
@@ -159,7 +159,7 @@
target.faction = user.faction
target.revivedby = user.name
target.ghostjoin = 1
- active_ghost_pods += target
+ GLOB.active_ghost_pods += target
target.ghostjoin_icon()
last_used = world.time
charges--
@@ -189,7 +189,7 @@
log_and_message_admins("used a denecrotizer to revive a simple mob: [target]. [ADMIN_FLW(src)]", user)
if(!target.mind) //if it doesn't have a mind then no one has been playing as it, and it is safe to offer to ghosts.
target.ghostjoin = 1
- active_ghost_pods |= target
+ GLOB.active_ghost_pods |= target
target.ghostjoin_icon()
last_used = world.time
charges--
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index 65640675b22..b26bb1e4b03 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -67,13 +67,6 @@
return
-/obj/item/multitool/cyborg
- name = "multitool"
- desc = "Optimised and stripped-down version of a regular multitool."
- toolspeed = 0.5
-
-
-
/datum/category_item/catalogue/anomalous/precursor_a/alien_multitool
name = "Precursor Alpha Object - Pulse Tool"
desc = "This ancient object appears to be an electrical tool. \
diff --git a/code/game/objects/items/poi_items.dm b/code/game/objects/items/poi_items.dm
index 43d5e89d58f..ec5afbb8889 100644
--- a/code/game/objects/items/poi_items.dm
+++ b/code/game/objects/items/poi_items.dm
@@ -64,11 +64,15 @@
icon = 'icons/obj/closets/poireactor.dmi'
closet_appearance = null
catalogue_data = list(/datum/category_item/catalogue/information/objects/oldreactor)
- climbable = FALSE
starts_with = list(
/obj/item/fuel_assembly/deuterium = 6)
+/obj/structure/closet/crate/oldreactor/Initialize(mapload)
+ . = ..()
+ // Not climbable!
+ RemoveElement(/datum/element/climbable)
+
/obj/item/poi/brokenoldreactor
icon_state = "poireactor_broken"
name = "ruptured fission reactor rack"
diff --git a/code/game/objects/items/stacks/matter_synth.dm b/code/game/objects/items/stacks/matter_synth.dm
index 32c657134ac..66a42ccb735 100644
--- a/code/game/objects/items/stacks/matter_synth.dm
+++ b/code/game/objects/items/stacks/matter_synth.dm
@@ -32,23 +32,23 @@
name = "Nanite Synthesizer"
/datum/matter_synth/metal
- name = "Metal Synthesizer"
+ name = METAL_SYNTH
/datum/matter_synth/plasteel
- name = "Plasteel Synthesizer"
+ name = PLASTEEL_SYNTH
max_energy = 10000
/datum/matter_synth/glass
- name = "Glass Synthesizer"
+ name = GLASS_SYNTH
/datum/matter_synth/wood
- name = "Wood Synthesizer"
+ name = WOOD_SYNTH
/datum/matter_synth/plastic
- name = "Plastic Synthesizer"
+ name = PLASTIC_SYNTH
/datum/matter_synth/wire
- name = "Wire Synthesizer"
+ name = WIRE_SYNTH
max_energy = 50
recharge_rate = 2
@@ -58,7 +58,7 @@
recharge_rate = 1
/datum/matter_synth/cloth
- name = "Cloth Synthesizer"
+ name = CLOTH_SYNTH
/datum/matter_synth/beacon
name = "Beacon Synthesizer"
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index 09d52831fac..2d7618e4544 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -50,6 +50,8 @@
return 1
if (src && usr && usr.machine == src)
usr << browse(null, "window=stack")
+ if(islist(synths))
+ synths.Cut()
return ..()
/obj/item/stack/update_icon()
diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm
index 0f5bf2fbc83..1fc0bbd0c25 100644
--- a/code/game/objects/items/weapons/implants/implantchair.dm
+++ b/code/game/objects/items/weapons/implants/implantchair.dm
@@ -42,9 +42,10 @@
if(src.occupant)
dat += "[src.ready ? "Implant" : "Recharging"] "
user.set_machine(src)
- user << browse("[dat]", "window=implant")
- onclose(user, "implant")
+ var/datum/browser/popup = new(user, "implant", "Implant")
+ popup.set_content(dat)
+ popup.open()
/obj/machinery/implantchair/Topic(href, href_list)
if((get_dist(src, usr) <= 1) || isAI(usr))
diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm
index f4d89526d90..309e66f503b 100644
--- a/code/game/objects/items/weapons/scrolls.dm
+++ b/code/game/objects/items/weapons/scrolls.dm
@@ -26,9 +26,10 @@
dat += span_bold("Four uses use them wisely:") + " "
dat += "Teleport "
dat += "Kind regards, Wizards Federation
P.S. Don't forget to bring your gear, you'll need it to cast most spells."
- user << browse("[dat]", "window=scroll")
- onclose(user, "scroll")
- return
+
+ var/datum/browser/popup = new(user, "scroll", "Scroll")
+ popup.set_content(dat)
+ popup.open()
/obj/item/teleportation_scroll/Topic(href, href_list)
..()
diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm
index 6b1e01e6e67..92681974207 100644
--- a/code/game/objects/items/weapons/surgery_tools.dm
+++ b/code/game/objects/items/weapons/surgery_tools.dm
@@ -225,46 +225,7 @@
throw_range = 5
attack_verb = list("attacked", "hit", "bludgeoned")
-/*
- * Cyborg Tools
- */
-/obj/item/surgical/retractor/cyborg
- icon_state = "cyborg_retractor"
- toolspeed = 0.5
-/obj/item/surgical/hemostat/cyborg
- icon_state = "cyborg_hemostat"
- toolspeed = 0.5
-
-/obj/item/surgical/cautery/cyborg
- icon_state = "cyborg_cautery"
- toolspeed = 0.5
-
-/obj/item/surgical/surgicaldrill/cyborg
- icon_state = "cyborg_drill"
- toolspeed = 0.5
-
-/obj/item/surgical/scalpel/cyborg
- icon_state = "cyborg_scalpel"
- toolspeed = 0.5
-
-/obj/item/surgical/circular_saw/cyborg
- icon_state = "cyborg_saw"
- toolspeed = 0.5
-
-/obj/item/surgical/bonegel/cyborg
- toolspeed = 0.5
-
-/obj/item/surgical/FixOVein/cyborg
- toolspeed = 0.5
-
-/obj/item/surgical/bonesetter/cyborg
- icon_state = "cyborg_setter"
- toolspeed = 0.5
-
-/obj/item/surgical/bioregen/cyborg //VoreStation edit: let the borgs S U C C
- icon_state = "cyborg_bioregen"
- toolspeed = 0.5
/*
* Alien Tools
diff --git a/code/game/objects/items/weapons/tools/crowbar.dm b/code/game/objects/items/weapons/tools/crowbar.dm
index 4662f0a1768..39344ccdca2 100644
--- a/code/game/objects/items/weapons/tools/crowbar.dm
+++ b/code/game/objects/items/weapons/tools/crowbar.dm
@@ -64,13 +64,6 @@
origin_tech = list(TECH_COMBAT = 4, TECH_ENGINEERING = 3)
reach = 2
-/obj/item/tool/crowbar/cyborg
- name = "hydraulic crowbar"
- desc = "A hydraulic prying tool, compact but powerful. Designed to replace crowbars in industrial synthetics."
- usesound = 'sound/items/jaws_pry.ogg'
- force = 10
- toolspeed = 0.5
-
/obj/item/tool/crowbar/power
name = "power pryer"
desc = "You shouldn't see this."
diff --git a/code/game/objects/items/weapons/tools/screwdriver.dm b/code/game/objects/items/weapons/tools/screwdriver.dm
index 125b5cae43f..6c7a255797f 100644
--- a/code/game/objects/items/weapons/tools/screwdriver.dm
+++ b/code/game/objects/items/weapons/tools/screwdriver.dm
@@ -100,12 +100,6 @@
random_color = FALSE
reach = 2
-/obj/item/tool/screwdriver/cyborg
- name = "powered screwdriver"
- desc = "An electrical screwdriver, designed to be both precise and quick."
- usesound = 'sound/items/drill_use.ogg'
- toolspeed = 0.5
-
/obj/item/tool/screwdriver/power
name = "power screwdriver"
desc = "You shouldn't see this."
diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm
index 764e082b3aa..6718eb171bc 100644
--- a/code/game/objects/items/weapons/tools/weldingtool.dm
+++ b/code/game/objects/items/weapons/tools/weldingtool.dm
@@ -362,11 +362,6 @@
origin_tech = list(TECH_ENGINEERING = 2, TECH_PHORON = 2)
matter = list(MAT_STEEL = 70, MAT_GLASS = 60)
-/obj/item/weldingtool/largetank/cyborg
- name = "integrated welding tool"
- desc = "An advanced welder designed to be used in robotic systems."
- toolspeed = 0.5
-
/obj/item/weldingtool/hugetank
name = "upgraded welding tool"
desc = "A much larger welder with a huge tank."
@@ -639,6 +634,10 @@
..()
/obj/item/weldingtool/electric/proc/get_external_power_supply()
+ if(istype(src.loc, /obj/item/robotic_multibelt)) //We are in a multibelt
+ if(istype(src.loc.loc, /mob/living/silicon/robot)) //We are in a multibelt that is in a robot! This is sanity in case someone spawns a multibelt in via admin commands.
+ var/mob/living/silicon/robot/R = src.loc.loc
+ return R.cell
if(isrobot(src.loc))
var/mob/living/silicon/robot/R = src.loc
return R.cell
@@ -659,9 +658,6 @@
/obj/item/weldingtool/electric/mounted
use_external_power = 1
-/obj/item/weldingtool/electric/mounted/cyborg
- toolspeed = 0.5
-
/obj/item/weldingtool/electric/mounted/exosuit
var/obj/item/mecha_parts/mecha_equipment/equip_mount = null
flame_intensity = 1
diff --git a/code/game/objects/items/weapons/tools/wirecutters.dm b/code/game/objects/items/weapons/tools/wirecutters.dm
index aa56913a7d6..4c36b0f0ee5 100644
--- a/code/game/objects/items/weapons/tools/wirecutters.dm
+++ b/code/game/objects/items/weapons/tools/wirecutters.dm
@@ -81,12 +81,6 @@
origin_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4)
random_color = FALSE
-/obj/item/tool/wirecutters/cyborg
- name = "wirecutters"
- desc = "This cuts wires. With science."
- usesound = 'sound/items/jaws_cut.ogg'
- toolspeed = 0.5
-
/obj/item/tool/wirecutters/hybrid
name = "strange wirecutters"
desc = "This cuts wires. With " + span_purple("Science!")
diff --git a/code/game/objects/items/weapons/tools/wrench.dm b/code/game/objects/items/weapons/tools/wrench.dm
index aeb4b15f66b..066348c018a 100644
--- a/code/game/objects/items/weapons/tools/wrench.dm
+++ b/code/game/objects/items/weapons/tools/wrench.dm
@@ -19,12 +19,6 @@
pickup_sound = 'sound/items/pickup/wrench.ogg'
tool_qualities = list(TOOL_WRENCH)
-/obj/item/tool/wrench/cyborg
- name = "automatic wrench"
- desc = "An advanced robotic wrench. Can be found in industrial synthetic shells."
- usesound = 'sound/items/drill_use.ogg'
- toolspeed = 0.5
-
/obj/item/tool/wrench/pipe
name = "pipe wrench"
desc = "A wrench used for plumbing. Can make a good makeshift weapon."
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index 3001cabecf4..a251a72dbbf 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -3,11 +3,8 @@
w_class = ITEMSIZE_NO_CONTAINER
blocks_emissive = EMISSIVE_BLOCK_GENERIC
- var/climbable
- var/climb_delay = 3.5 SECONDS
var/breakable
var/parts
- var/list/climbers
var/block_turf_edges = FALSE // If true, turf edge icons will not be made on the turf this occupies.
var/list/connections
@@ -15,11 +12,6 @@
var/list/blend_objects = newlist() // Objects which to blend with
var/list/noblend_objects = newlist() //Objects to avoid blending with (such as children of listed blend objects.
-/obj/structure/Initialize(mapload)
- . = ..()
- if(climbable)
- verbs += /obj/structure/proc/climb_on
-
/obj/structure/Destroy()
if(parts)
new parts(loc)
@@ -34,12 +26,7 @@
var/mob/living/carbon/human/H = user
if(H.species.can_shred(user))
attack_generic(user,1,"slices")
-
- if(LAZYLEN(climbers) && !(user in climbers))
- user.visible_message(span_warning("[user.name] shakes \the [src]."), \
- span_notice("You shake \the [src]."))
- structure_shaken()
-
+ SEND_SIGNAL(src, COMSIG_CLIMBABLE_SHAKE_CLIMBERS, user)
return ..()
/obj/structure/attack_tk()
@@ -57,121 +44,6 @@
if(3.0)
return
-/obj/structure/proc/climb_on()
- set name = "Climb structure"
- set desc = "Climbs onto a structure."
- set category = "Object"
- set src in oview(1)
-
- do_climb(usr)
-
-/obj/structure/MouseDrop_T(mob/target, mob/user)
- var/mob/living/H = user
- if(istype(H) && can_climb(H) && target == user)
- do_climb(target)
- else
- return ..()
-
-/obj/structure/proc/can_climb(var/mob/living/user, post_climb_check=0)
- if (!climbable || !can_touch(user) || (!post_climb_check && (user in climbers)))
- return 0
-
- if (!user.Adjacent(src))
- to_chat(user, span_danger("You can't climb there, the way is blocked."))
- return 0
-
- var/obj/occupied = turf_is_crowded()
- if(occupied)
- to_chat(user, span_danger("There's \a [occupied] in the way."))
- return 0
- return 1
-
-/obj/structure/proc/turf_is_crowded()
- var/turf/T = get_turf(src)
- if(!T || !istype(T))
- return "empty void"
- if(T.density)
- return T
- for(var/obj/O in T.contents)
- if(istype(O,/obj/structure))
- var/obj/structure/S = O
- if(S.climbable) continue
- if(O && O.density && !(O.flags & ON_BORDER)) //ON_BORDER structures are handled by the Adjacent() check.
- return O
- return 0
-
-/obj/structure/proc/do_climb(var/mob/living/user)
- if (!can_climb(user))
- return
-
- user.visible_message(span_warning("[user] starts climbing onto \the [src]!"))
- LAZYDISTINCTADD(climbers, user)
-
- if(!do_after(user,(issmall(user) ? climb_delay * 0.6 : climb_delay)))
- LAZYREMOVE(climbers, user)
- return
-
- if (!can_climb(user, post_climb_check=1))
- LAZYREMOVE(climbers, user)
- return
-
- user.forceMove(climb_to(user))
-
- if (get_turf(user) == get_turf(src))
- user.visible_message(span_warning("[user] climbs onto \the [src]!"))
- LAZYREMOVE(climbers, user)
-
-/obj/structure/proc/climb_to(var/mob/living/user)
- return get_turf(src)
-
-/obj/structure/proc/structure_shaken()
- for(var/mob/living/M in climbers)
- M.Weaken(1)
- to_chat(M, span_danger("You topple as you are shaken off \the [src]!"))
- climbers.Cut(1,2)
-
- for(var/mob/living/M in get_turf(src))
- if(M.lying) return //No spamming this on people.
-
- M.Weaken(3)
- to_chat(M, span_danger("You topple as \the [src] moves under you!"))
-
- if(prob(25))
-
- var/damage = rand(15,30)
- var/mob/living/carbon/human/H = M
- if(!istype(H))
- to_chat(H, span_danger("You land heavily!"))
- M.adjustBruteLoss(damage)
- return
-
- var/obj/item/organ/external/affecting
-
- switch(pick(list("ankle","wrist","head","knee","elbow")))
- if("ankle")
- affecting = H.get_organ(pick(BP_L_FOOT, BP_R_FOOT))
- if("knee")
- affecting = H.get_organ(pick(BP_L_LEG, BP_R_LEG))
- if("wrist")
- affecting = H.get_organ(pick(BP_L_HAND, BP_R_HAND))
- if("elbow")
- affecting = H.get_organ(pick(BP_L_ARM, BP_R_ARM))
- if("head")
- affecting = H.get_organ(BP_HEAD)
-
- if(affecting)
- to_chat(M, span_danger("You land heavily on your [affecting.name]!"))
- affecting.take_damage(damage, 0)
- if(affecting.parent)
- affecting.parent.add_autopsy_data("Misadventure", damage)
- else
- to_chat(H, span_danger("You land heavily!"))
- H.adjustBruteLoss(damage)
-
- H.UpdateDamageIcon()
- H.updatehealth()
- return
-
/obj/structure/proc/can_touch(var/mob/user)
if (!user)
return 0
diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm
index c7e094b2919..443cb18cbfa 100644
--- a/code/game/objects/structures/artstuff.dm
+++ b/code/game/objects/structures/artstuff.dm
@@ -13,6 +13,10 @@
//max_integrity = 60
var/obj/item/canvas/painting = null
+/obj/structure/easel/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/climbable)
+
//Adding canvases
/obj/structure/easel/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/canvas))
diff --git a/code/game/objects/structures/cliff.dm b/code/game/objects/structures/cliff.dm
index 6e13b840bca..a39aafc61b9 100644
--- a/code/game/objects/structures/cliff.dm
+++ b/code/game/objects/structures/cliff.dm
@@ -19,6 +19,7 @@ When mapping these in, be sure to give at least a one tile clearance, as NORTH f
two tiles on initialization, and which way a cliff is facing may change during maploading.
*/
+#define CLIFF_CLIMB_DELAY 10
/obj/structure/cliff
name = "cliff"
desc = "A steep rock ledge. You might be able to climb it if you feel bold enough."
@@ -31,8 +32,6 @@ two tiles on initialization, and which way a cliff is facing may change during m
anchored = TRUE
density = TRUE
opacity = FALSE
- climbable = TRUE
- climb_delay = 10 SECONDS
unacidable = TRUE
block_turf_edges = TRUE // Don't want turf edges popping up from the cliff edge.
plane = TURF_PLANE
@@ -48,6 +47,7 @@ two tiles on initialization, and which way a cliff is facing may change during m
/obj/structure/cliff/Initialize(mapload)
. = ..()
register_dangerous_to_step()
+ AddElement(/datum/element/climbable/cliff,CLIFF_CLIMB_DELAY SECONDS)
/obj/structure/cliff/Destroy()
unregister_dangerous_to_step()
@@ -106,11 +106,8 @@ two tiles on initialization, and which way a cliff is facing may change during m
// Now make the bottom cliff have mostly the same variables.
var/obj/structure/cliff/bottom/bottom = new(T)
is_double_cliff = TRUE
- climb_delay /= 2 // Since there are two cliffs to climb when going north, both take half the time.
-
bottom.dir = dir
bottom.is_double_cliff = TRUE
- bottom.climb_delay = climb_delay
bottom.icon_variant = icon_variant
bottom.corner = corner
bottom.ramp = ramp
@@ -254,19 +251,10 @@ two tiles on initialization, and which way a cliff is facing may change during m
sleep(5)
bottom_cliff.fall_off_cliff(L)
-/obj/structure/cliff/can_climb(mob/living/user, post_climb_check = FALSE)
- // Cliff climbing requires climbing gear.
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- var/obj/item/clothing/shoes/shoes = H.shoes
- if(shoes && shoes.rock_climbing)
- return ..() // Do the other checks too.
-
- to_chat(user, span_warning("\The [src] is too steep to climb unassisted."))
- return FALSE
-
// This tells AI mobs to not be dumb and step off cliffs willingly.
/obj/structure/cliff/is_safe_to_step(mob/living/L)
if(should_fall(L))
return FALSE
return ..()
+
+#undef CLIFF_CLIMB_DELAY
diff --git a/code/game/objects/structures/crates_lockers/__closets.dm b/code/game/objects/structures/crates_lockers/__closets.dm
index 683ce6b7911..afb32326aeb 100644
--- a/code/game/objects/structures/crates_lockers/__closets.dm
+++ b/code/game/objects/structures/crates_lockers/__closets.dm
@@ -357,6 +357,9 @@
if(!isturf(user.loc)) // are you in a container/closet/pod/etc?
return
if(!opened)
+ // Attempt to climb if not opened!
+ if(O == user)
+ SEND_SIGNAL(src, COMSIG_CLIMBABLE_START_CLIMB, user)
return
if(istype(O, /obj/structure/closet))
return
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
index ecba61ba485..32f15499a52 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
@@ -1,3 +1,7 @@
+/obj/structure/closet/secure_closet/freezer/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/climbable)
+
/obj/structure/closet/secure_closet/freezer/kitchen
name = "kitchen cabinet"
req_access = list(access_kitchen)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 5170037b66f..ace35e003d6 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -5,7 +5,6 @@
desc = "A rectangular steel crate."
icon = 'icons/obj/closets/bases/crate.dmi'
closet_appearance = /decl/closet_appearance/crate
- climbable = TRUE
dir = 4 //Spawn facing 'forward' by default.
var/points_per_crate = 5
var/rigged = 0
@@ -13,6 +12,10 @@
open_sound = 'sound/effects/crate_open.ogg'
close_sound = 'sound/effects/crate_close.ogg'
+/obj/structure/closet/crate/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/climbable)
+
/obj/structure/closet/crate/can_open()
return 1
@@ -40,8 +43,7 @@
O.forceMove(get_turf(src))
src.opened = 1
- if(climbable)
- structure_shaken()
+ SEND_SIGNAL(src, COMSIG_CLIMBABLE_SHAKE_CLIMBERS, null)
update_icon()
return 1
@@ -69,14 +71,6 @@
update_icon()
return 1
-/obj/structure/closet/crate/MouseDrop_T(mob/target, mob/user)
- // Adds climbing from drag, You can't put yourself in crates with a drag anyway... Nore anyone else actually.
- var/mob/living/H = user
- if(istype(H) && can_climb(H) && target == user)
- do_climb(target)
- else
- return ..()
-
/obj/structure/closet/crate/verb/rotate_clockwise()
set name = "Rotate Crate Clockwise"
set category = "Object"
diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm
index b27a6bc9d29..be3c7ef2310 100644
--- a/code/game/objects/structures/crates_lockers/largecrate.dm
+++ b/code/game/objects/structures/crates_lockers/largecrate.dm
@@ -37,7 +37,7 @@
if(!AMBLINAL.mind)
AMBLINAL.ghostjoin = 1
AMBLINAL.ghostjoin_icon()
- active_ghost_pods |= AMBLINAL
+ GLOB.active_ghost_pods |= AMBLINAL
//VOREStation Add End
user.visible_message(span_notice("[user] pries \the [src] open."), \
span_notice("You pry open \the [src]."), \
diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm
index 8180e59dbd7..8b2fc19ad18 100644
--- a/code/game/objects/structures/fence.dm
+++ b/code/game/objects/structures/fence.dm
@@ -102,11 +102,11 @@
if(MEDIUM_HOLE)
visible_message(span_notice("\The [user] cuts into \the [src] some more."))
to_chat(user, span_notice("You could probably fit yourself through that hole now. Although climbing through would be much faster if you made it even bigger."))
- climbable = TRUE
+ AddElement(/datum/element/climbable)
if(LARGE_HOLE)
visible_message(span_notice("\The [user] completely cuts through \the [src]."))
to_chat(user, span_notice("The hole in \the [src] is now big enough to walk through."))
- climbable = FALSE
+ RemoveElement(/datum/element/climbable)
update_cut_status()
return TRUE
diff --git a/code/game/objects/structures/fitness_vr.dm b/code/game/objects/structures/fitness_vr.dm
index 48635f47fc2..79905b80356 100644
--- a/code/game/objects/structures/fitness_vr.dm
+++ b/code/game/objects/structures/fitness_vr.dm
@@ -5,11 +5,14 @@
icon_state = "ropes"
density = TRUE
throwpass = TRUE
- climbable = TRUE
layer = WINDOW_LAYER
anchored = TRUE
flags = ON_BORDER
+/obj/structure/fitness/boxing_ropes/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/climbable, vaulting = TRUE)
+
/obj/structure/fitness/boxing_ropes/CanPass(atom/movable/mover, turf/target)
if(istype(mover) && mover.checkpass(PASSTABLE))
return TRUE
@@ -23,39 +26,6 @@
if(get_dir(mover, target) == dir) // From here to elsewhere, can't move in our dir
return !density
return TRUE
-/obj/structure/fitness/boxing_ropes/do_climb(var/mob/living/user) //Sets it so that players can climb *over* the turf and will enter the the turf **this** turf is facing.
- if(!can_climb(user))
- return
-
- user.visible_message(span_warning("[user] starts climbing onto \the [src]!"))
- LAZYDISTINCTADD(climbers, user)
-
- if(!do_after(user,(issmall(user) ? 20 : 34)))
- LAZYREMOVE(climbers, user)
- return
-
- if(!can_climb(user, post_climb_check=1))
- LAZYREMOVE(climbers, user)
- return
-
- if(get_turf(user) == get_turf(src))
- user.forceMove(get_step(src, src.dir))
- else
- user.forceMove(get_turf(src))
-
- user.visible_message(span_warning("[user] climbed over \the [src]!"))
- LAZYREMOVE(climbers, user)
-
-/obj/structure/fitness/boxing_ropes/can_climb(var/mob/living/user, post_climb_check=0) //Sets it to keep people from climbing over into the next turf if it is occupied.
- if(!..())
- return 0
-
- if(get_turf(user) == get_turf(src))
- var/obj/occupied = neighbor_turf_impassable()
- if(occupied)
- to_chat(user, span_danger("You can't climb there, there's \a [occupied] in the way."))
- return 0
- return 1
/obj/structure/fitness/boxing_ropes/bottom
plane = MOB_PLANE
diff --git a/code/game/objects/structures/gargoyle.dm b/code/game/objects/structures/gargoyle.dm
index 73f3f72f5c7..02d076ae3e6 100644
--- a/code/game/objects/structures/gargoyle.dm
+++ b/code/game/objects/structures/gargoyle.dm
@@ -252,7 +252,7 @@
if(istype(W,/obj/item/grab || /obj/item/holder))
gargoyle.vore_attackby(W, user)
return
- if(gargoyle.adminbus_trash || is_type_in_list(W,edible_trash) && W.trash_eatable && !is_type_in_list(W,item_vore_blacklist))
+ if(gargoyle.adminbus_trash || is_type_in_list(W, GLOB.edible_trash) && W.trash_eatable && !is_type_in_list(W, GLOB.item_vore_blacklist))
to_chat(user, span_warning("You slip [W] into [gargoyle]'s [lowertext(gargoyle.vore_selected.name)] ."))
user.drop_item()
W.forceMove(gargoyle.vore_selected)
@@ -276,7 +276,7 @@
/obj/structure/gargoyle/hitby(atom/movable/AM as mob|obj,var/speed = THROWFORCE_SPEED_DIVISOR)
if(istype(AM,/obj/item) && gargoyle && gargoyle.vore_selected && gargoyle.trash_catching)
var/obj/item/I = AM
- if(gargoyle.adminbus_trash || is_type_in_list(I,edible_trash) && I.trash_eatable && !is_type_in_list(I,item_vore_blacklist))
+ if(gargoyle.adminbus_trash || is_type_in_list(I, GLOB.edible_trash) && I.trash_eatable && !is_type_in_list(I, GLOB.item_vore_blacklist))
gargoyle.hitby(AM, speed)
return
else if(isliving(AM) && gargoyle)
diff --git a/code/game/objects/structures/ghost_pods/event_vr.dm b/code/game/objects/structures/ghost_pods/event_vr.dm
index 94d63546daf..cc73428a83e 100644
--- a/code/game/objects/structures/ghost_pods/event_vr.dm
+++ b/code/game/objects/structures/ghost_pods/event_vr.dm
@@ -1,5 +1,5 @@
/obj/structure/ghost_pod/proc/reset_ghostpod() //Makes the ghost pod usable again and re-adds it to the active ghost pod list if it is not on it.
- active_ghost_pods |= src
+ GLOB.active_ghost_pods |= src
used = FALSE
busy = FALSE
@@ -174,8 +174,7 @@
/obj/structure/ghost_pod/ghost_activated/maintpred/redgate/Initialize(mapload)
. = ..()
- if(!(src in active_ghost_pods))
- active_ghost_pods += src
+ GLOB.active_ghost_pods += src
/obj/structure/ghost_pod/ghost_activated/maint_lurker
name = "strange maintenance hole"
@@ -260,8 +259,7 @@
/obj/structure/ghost_pod/ghost_activated/maint_lurker/Initialize(mapload)
. = ..()
- if(!(src in active_ghost_pods))
- active_ghost_pods += src
+ GLOB.active_ghost_pods += src
/// redspace variant
diff --git a/code/game/objects/structures/ghost_pods/ghost_pods.dm b/code/game/objects/structures/ghost_pods/ghost_pods.dm
index 97bd9089d08..b1c41a8bb7c 100644
--- a/code/game/objects/structures/ghost_pods/ghost_pods.dm
+++ b/code/game/objects/structures/ghost_pods/ghost_pods.dm
@@ -51,10 +51,7 @@
// Override this to create whatever mob you need. Be sure to call ..() if you don't want it to make infinite mobs.
/obj/structure/ghost_pod/proc/create_occupant(var/mob/M)
used = TRUE
- //VOREStation Addition Start
- if(src in active_ghost_pods)
- active_ghost_pods -= src
- //VOREStation Addition End
+ GLOB.active_ghost_pods -= src
return TRUE
diff --git a/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm b/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm
index d69946073cc..ff2523d6524 100644
--- a/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm
+++ b/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm
@@ -1,7 +1,6 @@
/obj/structure/ghost_pod/Destroy()
- if(src in active_ghost_pods)
- active_ghost_pods -= src
- ..()
+ GLOB.active_ghost_pods -= src
+ . = ..()
/obj/structure/ghost_pod
var/spawn_active = FALSE
@@ -47,8 +46,7 @@
create_occupant(user)
/obj/structure/ghost_pod/proc/ghostpod_startup(var/notify = FALSE)
- if(!(src in active_ghost_pods))
- active_ghost_pods += src
+ GLOB.active_ghost_pods |= src
if(notify)
trigger()
diff --git a/code/game/objects/structures/gravemarker.dm b/code/game/objects/structures/gravemarker.dm
index 33bb0656609..9028a62adfa 100644
--- a/code/game/objects/structures/gravemarker.dm
+++ b/code/game/objects/structures/gravemarker.dm
@@ -6,7 +6,6 @@
density = TRUE
anchored = TRUE
throwpass = 1
- climbable = TRUE
layer = ABOVE_JUNK_LAYER
@@ -27,6 +26,7 @@
if(!material)
return INITIALIZE_HINT_QDEL
color = material.icon_colour
+ AddElement(/datum/element/climbable)
/obj/structure/gravemarker/examine(mob/user)
. = ..()
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 79bad9dcf76..d89cf47f7e6 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -9,7 +9,6 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart)
anchored = FALSE
density = TRUE
flags = OPENCONTAINER
- climbable = TRUE
//copypaste sorry
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite
var/obj/item/storage/bag/trash/mybag = null
@@ -24,6 +23,10 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart)
var/static/list/equippable_item_whitelist
+/obj/structure/janitorialcart/Initialize(mapload, ...)
+ . = ..()
+ AddElement(/datum/element/climbable)
+
/obj/structure/janitorialcart/proc/equip_janicart_item(mob/user, obj/item/I)
if(!equippable_item_whitelist)
equippable_item_whitelist = typecacheof(list(
diff --git a/code/game/objects/structures/ledges.dm b/code/game/objects/structures/ledges.dm
index e56ebaee405..2bd4e8877ae 100644
--- a/code/game/objects/structures/ledges.dm
+++ b/code/game/objects/structures/ledges.dm
@@ -4,13 +4,16 @@
icon = 'icons/obj/ledges.dmi'
density = TRUE
throwpass = 1
- climbable = TRUE
anchored = TRUE
var/solidledge = 1
flags = ON_BORDER
layer = STAIRS_LAYER
icon_state = "ledge"
+/obj/structure/ledge/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/climbable, vaulting = TRUE)
+
/obj/structure/ledge_corner
icon_state = "ledge-corner"
flags = 0
@@ -19,10 +22,13 @@
icon = 'icons/obj/ledges.dmi'
density = TRUE
throwpass = 1
- climbable = TRUE
anchored = TRUE
layer = STAIRS_LAYER
+/obj/structure/ledge_corner/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/climbable, vaulting = TRUE)
+
/obj/structure/ledge/ledge_nub
desc = "Part of a rocky ledge."
icon_state = "ledge-nub"
@@ -49,37 +55,3 @@
if(solidledge && get_dir(mover, target) == dir) // From here to elsewhere, can't move in our dir
return FALSE
return TRUE
-
-/obj/structure/ledge/do_climb(var/mob/living/user)
- if(!can_climb(user))
- return
-
- user.visible_message(span_warning("[user] starts climbing onto \the [src]!"))
- LAZYDISTINCTADD(climbers, user)
-
- if(!do_after(user,(issmall(user) ? 20 : 34)))
- LAZYREMOVE(climbers, user)
- return
-
- if(!can_climb(user, post_climb_check=1))
- LAZYREMOVE(climbers, user)
- return
-
- if(get_turf(user) == get_turf(src))
- user.forceMove(get_step(src, src.dir))
- else
- user.forceMove(get_turf(src))
-
- user.visible_message(span_warning("[user] climbed over \the [src]!"))
- LAZYREMOVE(climbers, user)
-
-/obj/structure/ledge/can_climb(var/mob/living/user, post_climb_check=0)
- if(!..())
- return 0
-
- if(get_turf(user) == get_turf(src))
- var/obj/occupied = neighbor_turf_impassable()
- if(occupied)
- to_chat(user, span_danger("You can't climb there, there's \a [occupied] in the way."))
- return 0
- return 1
diff --git a/code/game/objects/structures/low_wall.dm b/code/game/objects/structures/low_wall.dm
index 807ac96af84..e339a5fc0c8 100644
--- a/code/game/objects/structures/low_wall.dm
+++ b/code/game/objects/structures/low_wall.dm
@@ -11,7 +11,6 @@
//atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE | ATOM_FLAG_CAN_BE_PAINTED | ATOM_FLAG_ADJACENT_EXCEPTION
anchored = TRUE
density = TRUE
- climbable = TRUE
throwpass = 1
layer = TABLE_LAYER
@@ -43,6 +42,8 @@
health = material.integrity
+ AddElement(/datum/element/climbable)
+
return INITIALIZE_HINT_LATELOAD
/obj/structure/low_wall/LateInitialize()
@@ -123,9 +124,8 @@
/obj/structure/low_wall/MouseDrop_T(atom/movable/AM, mob/user, src_location, over_location, src_control, over_control, params)
if(AM == user)
- var/mob/living/H = user
- if(istype(H) && can_climb(H))
- do_climb(AM)
+ SEND_SIGNAL(src, COMSIG_CLIMBABLE_START_CLIMB, user)
+ return
var/obj/O = AM
if(!istype(O))
return
diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm
index d420cf0befb..5ea18d051ec 100644
--- a/code/game/objects/structures/mop_bucket.dm
+++ b/code/game/objects/structures/mop_bucket.dm
@@ -4,7 +4,6 @@
icon = 'icons/obj/janitor.dmi'
icon_state = "mopbucket"
density = TRUE
- climbable = TRUE
w_class = ITEMSIZE_NORMAL
pressure_resistance = 5
flags = OPENCONTAINER
@@ -15,6 +14,7 @@ GLOBAL_LIST_BOILERPLATE(all_mopbuckets, /obj/structure/mopbucket)
/obj/structure/mopbucket/Initialize(mapload, ...)
create_reagents(300)
. = ..()
+ AddElement(/datum/element/climbable)
/obj/structure/mopbucket/examine(mob/user)
. = ..()
diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm
index e52d1f3d069..55b1e95f4bf 100644
--- a/code/game/objects/structures/railing.dm
+++ b/code/game/objects/structures/railing.dm
@@ -5,7 +5,6 @@
icon = 'icons/obj/railing.dmi'
density = TRUE
throwpass = 1
- climbable = TRUE
layer = WINDOW_LAYER
anchored = TRUE
flags = ON_BORDER
@@ -27,11 +26,7 @@
// TODO - "constructed" is not passed to us. We need to find a way to do this safely.
if (constructed) // player-constructed railings
anchored = FALSE
- if(climbable)
- verbs += /obj/structure/proc/climb_on
-
-/obj/structure/railing/Initialize(mapload)
- . = ..()
+ AddElement(/datum/element/climbable/unanchored_can_break, 3.4 SECONDS, TRUE) // It's a RAILING!
if(src.anchored)
update_icon(0)
@@ -190,7 +185,7 @@
to_chat(usr, "It is fastened to the floor therefore you can't flip it!")
return 0
- var/obj/occupied = neighbor_turf_impassable()
+ var/obj/occupied = can_climb_neighbor_turf(src)
if(occupied)
to_chat(usr, "You can't flip \the [src] because there's \a [occupied] in the way.")
return 0
@@ -235,7 +230,7 @@
var/obj/item/grab/G = W
if (isliving(G.affecting))
var/mob/living/M = G.affecting
- var/obj/occupied = turf_is_crowded()
+ var/obj/occupied = can_climb_turf(src)
if(occupied)
to_chat(user, span_danger("There's \a [occupied] in the way."))
return
@@ -278,55 +273,3 @@
qdel(src)
return
return
-
-// Duplicated from structures.dm, but its a bit different.
-/obj/structure/railing/do_climb(var/mob/living/user)
- if(!can_climb(user))
- return
-
- user.visible_message(span_warning("[user] starts climbing onto \the [src]!"))
- LAZYDISTINCTADD(climbers, user)
-
- if(!do_after(user,(issmall(user) ? 20 : 34)))
- LAZYREMOVE(climbers, user)
- return
-
- if(!can_climb(user, post_climb_check=1))
- LAZYREMOVE(climbers, user)
- return
-
- if(get_turf(user) == get_turf(src))
- user.forceMove(get_step(src, src.dir))
- else
- user.forceMove(get_turf(src))
-
- user.visible_message(span_warning("[user] climbed over \the [src]!"))
- if(!anchored) take_damage(maxhealth) // Fatboy
- LAZYREMOVE(climbers, user)
-
-/obj/structure/railing/can_climb(var/mob/living/user, post_climb_check=0)
- if(!..())
- return 0
-
- // Normal can_climb() handles climbing from adjacent turf onto our turf. But railings also allow climbing
- // from our turf onto an adjacent! If that is the case we need to do checks for that too...
- if(get_turf(user) == get_turf(src))
- var/obj/occupied = neighbor_turf_impassable()
- if(occupied)
- to_chat(user, span_danger("You can't climb there, there's \a [occupied] in the way."))
- return 0
- return 1
-
-// TODO - This here might require some investigation
-/obj/structure/proc/neighbor_turf_impassable()
- var/turf/T = get_step(src, src.dir)
- if(!T || !istype(T))
- return 0
- if(T.density == 1)
- return T
- for(var/obj/O in T.contents)
- if(istype(O,/obj/structure))
- var/obj/structure/S = O
- if(S.climbable) continue
- if(O && O.density && !(O.flags & ON_BORDER && !(turn(O.dir, 180) & dir)))
- return O
diff --git a/code/game/objects/structures/trash_pile_vr.dm b/code/game/objects/structures/trash_pile_vr.dm
index c3dd40246e0..fb2d12c1ce0 100644
--- a/code/game/objects/structures/trash_pile_vr.dm
+++ b/code/game/objects/structures/trash_pile_vr.dm
@@ -44,6 +44,7 @@
"trashbag",
"brokecomp")
mouse_nest = new(src)
+ AddElement(/datum/element/climbable)
/obj/structure/trash_pile/Destroy()
qdel(mouse_nest)
diff --git a/code/game/objects/structures/under_wardrobe.dm b/code/game/objects/structures/under_wardrobe.dm
index addfcdaad02..899e0a4b1ce 100644
--- a/code/game/objects/structures/under_wardrobe.dm
+++ b/code/game/objects/structures/under_wardrobe.dm
@@ -5,6 +5,10 @@
icon_state = "wardrobe"
density = TRUE
+/obj/structure/undies_wardrobe/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/climbable)
+
/obj/structure/undies_wardrobe/attack_hand(var/mob/user)
if(!human_who_can_use_underwear(user))
to_chat(user, span_warning("Sadly there's nothing in here for you to wear."))
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 0b4ca498a73..9cb17b244a1 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -500,6 +500,11 @@
anchored = TRUE
var/busy = 0 //Something's being washed at the moment
+/obj/structure/sink/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/hose_connector/endless_source/water)
+ AddComponent(/datum/component/hose_connector/endless_drain)
+
/obj/structure/sink/MouseDrop_T(var/obj/item/thing, var/mob/user)
..()
if(!istype(thing) || !thing.is_open_container())
diff --git a/code/game/objects/stumble_into_vr.dm b/code/game/objects/stumble_into_vr.dm
index db814f32c7b..075c883164f 100644
--- a/code/game/objects/stumble_into_vr.dm
+++ b/code/game/objects/stumble_into_vr.dm
@@ -7,7 +7,7 @@
M.stop_flying()
/obj/structure/table/stumble_into(mob/living/M)
- var/obj/occupied = turf_is_crowded()
+ var/obj/occupied = can_climb_turf(src)
if(occupied)
return ..()
if(material)
@@ -70,7 +70,7 @@
M.stop_flying()
/obj/structure/railing/stumble_into(mob/living/M)
- var/obj/occupied = turf_is_crowded()
+ var/obj/occupied = can_climb_turf(src)
if(occupied)
return ..()
playsound(src, 'sound/misc/slip.ogg', 25, 1, -1)
diff --git a/code/game/objects/trash_eating.dm b/code/game/objects/trash_eating.dm
index 8d087064a08..f9bf7ae8992 100644
--- a/code/game/objects/trash_eating.dm
+++ b/code/game/objects/trash_eating.dm
@@ -1,7 +1,7 @@
// checks for when items are consumed by trash/ore eater
/obj/item/proc/on_trash_eaten(var/mob/living/user)
SHOULD_CALL_PARENT(TRUE)
- if(is_type_in_list(src,item_vore_blacklist) && !user.adminbus_trash) //If someone has adminbus, they can eat whatever they want.
+ if(is_type_in_list(src, GLOB.item_vore_blacklist) && !user.adminbus_trash) //If someone has adminbus, they can eat whatever they want.
to_chat(user, span_warning("You are not allowed to eat this."))
return FALSE
if(!trash_eatable) //OOC pref. This /IS/ respected, even if adminbus_trash is enabled
diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm
index 0fe48d12636..90393cb1220 100644
--- a/code/modules/admin/DB ban/functions.dm
+++ b/code/modules/admin/DB ban/functions.dm
@@ -486,4 +486,6 @@
output += ""
qdel(select_query)
- usr << browse("[output]","window=lookupbans;size=900x700")
+ var/datum/browser/popup = new(owner, "lookupbans", "Lookup Bans", 900, 700)
+ popup.set_content(output)
+ popup.open()
diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm
index 98761987fe2..6053bcaceae 100644
--- a/code/modules/admin/NewBan.dm
+++ b/code/modules/admin/NewBan.dm
@@ -190,7 +190,10 @@ var/savefile/Banlist
dat += ""
dat = "" + span_bold("Bans:") + " " + span_blue("(U) = Unban , (E) = Edit Ban") + " - " + span_green("([count] Bans)") + "
@@ -172,10 +171,13 @@ GLOBAL_VAR_INIT(floorIsLava, 0)
if(istype(gene,/datum/gene/trait))
var/datum/gene/trait/T = gene
tname = T.get_name()
- var/bcolor="[(bstate)?"#006600":"#ff0000"]"
- if(!bstate && M.dna.GetSEState(block)) // Gene isn't active, but the dna says it is... Was blocked by another gene!
- bcolor="#d88d00"
- body += "[bname][block]" // Traitgenes edit - show trait linked names on mouseover
+ if(bstate)
+ bname = span_green(bname)
+ else if(!bstate && M.dna.GetSEState(block)) // Gene isn't active, but the dna says it is... Was blocked by another gene!
+ bname = span_orange(bname)
+ else
+ bname = span_red(bname)
+ body += "[bname][block]" // Traitgenes edit - show trait linked names on mouseover
else
body += "[block]"
body+=""
@@ -232,15 +234,19 @@ GLOBAL_VAR_INIT(floorIsLava, 0)
if(!f) body += " | "
else f = 0
if(L in M.languages)
- body += "[k]"
+ k = span_green(k)
+ body += "[k]"
else
- body += "[k]"
+ k = span_red(k)
+ body += "[k]"
- body += {"
-
- "}
+ body += {" "}
+
+ var/datum/browser/popup = new(owner, "adminplayeropts", "Edit Player", 550, 515)
+ popup.add_head_content("Options for [M.key]")
+ popup.set_content(body)
+ popup.open()
- usr << browse(body, "window=adminplayeropts;size=550x515")
feedback_add_details("admin_verb","SPP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -314,7 +320,7 @@ GLOBAL_VAR_INIT(floorIsLava, 0)
to_chat(usr, "Error: you are not an admin!")
return
var/dat
- dat = text("Admin Newscaster
"} + span_bold("The following annomalities have been detected. The ones in red need immediate attention: Some of those in black may be intentional.") + {"
" + span_red("Camera not connected to wall at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) Network: [C1.network]") + "
"
output += "
"
- usr << browse("[output]","window=airreport;size=1000x500")
+
+ var/datum/browser/popup = new(src, "airreport", "Airreport", 1000, 500)
+ popup.set_content(output)
+ popup.open()
feedback_add_details("admin_verb","mCRP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/intercom_view()
diff --git a/code/modules/awaymissions/bluespaceartillery.dm b/code/modules/awaymissions/bluespaceartillery.dm
index d2003d34b09..b7b531c2cc4 100644
--- a/code/modules/awaymissions/bluespaceartillery.dm
+++ b/code/modules/awaymissions/bluespaceartillery.dm
@@ -27,9 +27,10 @@
dat += span_bold("Charge progress: [reload]/180:") + " "
dat += "Open Fire "
dat += "Deployment of weapon authorized by [using_map.company_name] Naval Command
Remember, friendly fire is grounds for termination of your contract and life.
"
- user << browse("[dat]", "window=scroll")
- onclose(user, "scroll")
- return
+
+ var/datum/browser/popup = new(user, "artillery", "Artillery")
+ popup.set_content(dat)
+ popup.open()
/obj/machinery/artillerycontrol/Topic(href, href_list)
..()
diff --git a/code/modules/awaymissions/overmap_renamer/debrisfield_renamer.dm b/code/modules/awaymissions/overmap_renamer/debrisfield_renamer.dm
index a0621b01499..f7bdeccfddd 100644
--- a/code/modules/awaymissions/overmap_renamer/debrisfield_renamer.dm
+++ b/code/modules/awaymissions/overmap_renamer/debrisfield_renamer.dm
@@ -10,7 +10,7 @@
. = ..()
if(!reference)
// testing("First overmap descriptor, name: [name]")
- for(var/obj/effect/overmap/visitable/D in visitable_overmap_object_instances)
+ for(var/obj/effect/overmap/visitable/D in GLOB.visitable_overmap_object_instances)
if(D.unique_identifier == "Debris Field")
if(D.possible_descriptors && islist(D.possible_descriptors))
D.possible_descriptors |= list(descriptors)
diff --git a/code/modules/awaymissions/overmap_renamer/readme.md b/code/modules/awaymissions/overmap_renamer/readme.md
index 6927ef394b0..e370bbfaebb 100644
--- a/code/modules/awaymissions/overmap_renamer/readme.md
+++ b/code/modules/awaymissions/overmap_renamer/readme.md
@@ -51,14 +51,14 @@ How to use - for mappers:
Important procs, vars etc. contained within the following files:
code\_helpers\global_lists_vr.dm
- var/list/visitable_overmap_object_instances - Collects instances with reference for things like the Debris Field, Space Whale, Talon etc. We need it to call the proc on the instance
+ GLOBAL_LIST_EMPTY(visitable_overmap_object_instances) - Collects instances with reference for things like the Debris Field, Space Whale, Talon etc. We need it to call the proc on the instance
code\modules\overmap\sectors.dm
var/list/possible_descriptors - contains a list of list("name","desc","scanner_desc")
var/unique_identifier - A way to check if the object in question loaded without causing a compiler error. Name them sth easy to recognize, like "Debris field" for... debris field.
var/real_name - Used to handle known = FALSE overmap objects properly
var/real_desc - same as real_name
- /obj/effect/overmap/visitable/Initialize() - adds the object's instance with reference to visitable_overmap_object_instances
+ /obj/effect/overmap/visitable/Initialize() - adds the object's instance with reference to GLOB.visitable_overmap_object_instances
code\modules\awaymissions\overmap_renamer\overmap_renamer.dm
/obj/effect/overmap/visitable/proc/modify_descriptors() - Takes possible_descriptors from src, picks a valid one after sanitization. Gives warnings if input is invalid.
diff --git a/code/modules/casino/casino.dm b/code/modules/casino/casino.dm
index 59e0e15397b..42267a53c94 100644
--- a/code/modules/casino/casino.dm
+++ b/code/modules/casino/casino.dm
@@ -12,13 +12,16 @@
icon_state = "roulette_table"
density = 1
anchored = 1
- climbable = 1
layer = TABLE_LAYER
throwpass = 1
var/item_place = 1 //allows items to be placed on the table, but not on benches.
var/busy = 0
+/obj/structure/casino_table/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/climbable)
+
/obj/structure/casino_table/attackby(obj/item/W, mob/user)
if(item_place)
user.drop_item(src.loc)
diff --git a/code/modules/client/preference_setup/loadout/loadout_eyes.dm b/code/modules/client/preference_setup/loadout/loadout_eyes.dm
index f53a39b7a8c..6be257d0492 100644
--- a/code/modules/client/preference_setup/loadout/loadout_eyes.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_eyes.dm
@@ -196,20 +196,20 @@
)
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
-/datum/gear/eyes/arglasses/visor
+/datum/gear/eyes/arglasses_visor
display_name = "AR visor"
path = /obj/item/clothing/glasses/omnihud/visor
-/datum/gear/eyes/arglasses/visor/New()
+/datum/gear/eyes/arglasses_visor/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
-/datum/gear/eyes/arglasses/sec
+/datum/gear/eyes/arglasses_sec
display_name = "AR-Security glasses"
path = /obj/item/clothing/glasses/omnihud/sec
allowed_roles = list(JOB_SECURITY_OFFICER,JOB_HEAD_OF_SECURITY,JOB_WARDEN,JOB_DETECTIVE)
-/datum/gear/eyes/arglasses/sec/New()
+/datum/gear/eyes/arglasses_sec/New()
..()
var/list/selector_uniforms = list(
"standard AR-Security glasses"=/obj/item/clothing/glasses/omnihud/sec,
@@ -217,12 +217,12 @@
)
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
-/datum/gear/eyes/arglasses/sci
+/datum/gear/eyes/arglasses_sci
display_name = "AR-Research glasses"
path = /obj/item/clothing/glasses/omnihud/rnd
allowed_roles = list(JOB_RESEARCH_DIRECTOR,JOB_SCIENTIST,JOB_XENOBIOLOGIST,JOB_XENOBOTANIST,JOB_ROBOTICIST)
-/datum/gear/eyes/arglasses/sci/New()
+/datum/gear/eyes/arglasses_sci/New()
..()
var/list/selector_uniforms = list(
"standard AR-Research glasses"=/obj/item/clothing/glasses/omnihud/rnd,
@@ -230,12 +230,12 @@
)
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
-/datum/gear/eyes/arglasses/eng
+/datum/gear/eyes/arglasses_eng
display_name = "AR-Engineering glasses"
path = /obj/item/clothing/glasses/omnihud/eng
allowed_roles = list(JOB_ENGINEER,JOB_CHIEF_ENGINEER,JOB_ATMOSPHERIC_TECHNICIAN)
-/datum/gear/eyes/arglasses/eng/New()
+/datum/gear/eyes/arglasses_eng/New()
..()
var/list/selector_uniforms = list(
"standard AR-Engineering glasses"=/obj/item/clothing/glasses/omnihud/eng,
@@ -243,12 +243,12 @@
)
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
-/datum/gear/eyes/arglasses/med
+/datum/gear/eyes/arglasses_med
display_name = "AR-Medical glasses"
path = /obj/item/clothing/glasses/omnihud/med
allowed_roles = list(JOB_MEDICAL_DOCTOR,JOB_CHIEF_MEDICAL_OFFICER,JOB_CHEMIST,JOB_PARAMEDIC,JOB_GENETICIST, JOB_PSYCHIATRIST)
-/datum/gear/eyes/arglasses/med/New()
+/datum/gear/eyes/arglasses_med/New()
..()
var/list/selector_uniforms = list(
"standard AR-Medical glasses"=/obj/item/clothing/glasses/omnihud/med,
@@ -256,13 +256,13 @@
)
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
-/datum/gear/eyes/arglasses/all
+/datum/gear/eyes/arglasses_all
display_name = "AR-Command glasses"
path = /obj/item/clothing/glasses/omnihud/all
cost = 2
allowed_roles = list(JOB_SITE_MANAGER,JOB_HEAD_OF_PERSONNEL)
-/datum/gear/eyes/arglasses/all/New()
+/datum/gear/eyes/arglasses_all/New()
..()
var/list/selector_uniforms = list(
"standard AR-Command glasses"=/obj/item/clothing/glasses/omnihud/all,
diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems.dm
index f75ae256d5f..f62080a6fcb 100644
--- a/code/modules/client/preference_setup/loadout/loadout_fluffitems.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems.dm
@@ -229,6 +229,12 @@
ckeywhitelist = list("bricker98")
character_name = list("Nettie Stough")
+/datum/gear/fluff/tally_doll
+ path = /obj/item/remote_scene_tool/tally_necklace
+ display_name = "Custom Collar"
+ ckeywhitelist = list("bricker98")
+ character_name = list("Talenya Lapushkina")
+
/datum/gear/fluff/xin_sovietuniform
path = /obj/item/clothing/under/soviet
display_name = "Xin's Soviet Uniform"
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index c91bef0635e..a72c66b60fd 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -120,9 +120,6 @@ var/list/preferences_datums = list()
var/lastnews // Hash of last seen lobby news content.
var/lastlorenews //ID of last seen lore news article.
- var/examine_text_mode = 0 // Just examine text, include usage (description_info), switch to examine panel.
- var/multilingual_mode = 0 // Default behaviour, delimiter-key-space, delimiter-key-delimiter, off
-
// THIS IS NOT SAVED
// WE JUST HAVE NOWHERE ELSE TO STORE IT
var/list/action_button_screen_locs
diff --git a/code/modules/client/preferences/types/game/chat.dm b/code/modules/client/preferences/types/game/chat.dm
index ddeff834fb0..63f4814d5fd 100644
--- a/code/modules/client/preferences/types/game/chat.dm
+++ b/code/modules/client/preferences/types/game/chat.dm
@@ -61,3 +61,25 @@
savefile_key = "PAIN_FREQUENCY"
default_value = FALSE
savefile_identifier = PREFERENCE_PLAYER
+
+/datum/preference/choiced/examine_mode
+ category = PREFERENCE_CATEGORY_GAME_PREFERENCES
+ savefile_key = "EXAMINE_MODE"
+ savefile_identifier = PREFERENCE_PLAYER
+
+/datum/preference/choiced/examine_mode/init_possible_values()
+ return list(EXAMINE_MODE_SLIM,EXAMINE_MODE_VERBOSE,EXAMINE_MODE_SWITCH_TO_PANEL)
+
+/datum/preference/choiced/examine_mode/create_default_value()
+ return EXAMINE_MODE_VERBOSE
+
+/datum/preference/choiced/multilingual_mode
+ category = PREFERENCE_CATEGORY_GAME_PREFERENCES
+ savefile_identifier = PREFERENCE_PLAYER
+ savefile_key = "MULTI_LANGUAGE_YAP_MODE"
+
+/datum/preference/choiced/multilingual_mode/init_possible_values()
+ return list(MULTILINGUAL_DEFAULT,MULTILINGUAL_SPACE,MULTILINGUAL_DOUBLE_DELIMITER, MULTILINGUAL_OFF)
+
+/datum/preference/choiced/multilingual_mode/create_default_value()
+ return MULTILINGUAL_DEFAULT
diff --git a/code/modules/client/preferences_toggle_procs.dm b/code/modules/client/preferences_toggle_procs.dm
index 841b8110dcc..5b0c5e6b20e 100644
--- a/code/modules/client/preferences_toggle_procs.dm
+++ b/code/modules/client/preferences_toggle_procs.dm
@@ -13,38 +13,3 @@
to_chat(src,"You will [(prefs.be_special & role_flag) ? "now" : "no longer"] be considered for [role] events (where possible).")
feedback_add_details("admin_verb","TBeSpecial") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-// Not attached to a pref datum because those are strict binary toggles
-/client/verb/toggle_examine_mode()
- set name = "Toggle Examine Mode"
- set category = "Preferences.Game"
- set desc = "Toggle the additional behaviour of examining things."
-
- prefs.examine_text_mode++
- prefs.examine_text_mode %= EXAMINE_MODE_MAX // This cycles through them because if you're already specifically being routed to the examine panel, you probably don't need to have the extra text printed to chat
- switch(prefs.examine_text_mode) // ... And I only wanted to add one verb
- if(EXAMINE_MODE_DEFAULT)
- to_chat(src, span_filter_system("Examining things will only output the base examine text, and you will not be redirected to the examine panel automatically."))
-
- if(EXAMINE_MODE_INCLUDE_USAGE)
- to_chat(src, span_filter_system("Examining things will also print any extra usage information normally included in the examine panel to the chat."))
-
- if(EXAMINE_MODE_SWITCH_TO_PANEL)
- to_chat(src, span_filter_system("Examining things will direct you to the examine panel, where you can view extended information about the thing."))
-
-/client/verb/toggle_multilingual_mode()
- set name = "Toggle Multilingual Mode"
- set category = "Preferences.Character"
- set desc = "Toggle the behaviour of multilingual speech parsing."
-
- prefs.multilingual_mode++
- prefs.multilingual_mode %= MULTILINGUAL_MODE_MAX // Cycles through the various options
- switch(prefs.multilingual_mode)
- if(MULTILINGUAL_DEFAULT)
- to_chat(src, span_filter_system("Multilingual parsing will only check for the delimiter-key combination (,0galcom-2tradeband)."))
- if(MULTILINGUAL_SPACE)
- to_chat(src, span_filter_system("Multilingual parsing will enforce a space after the delimiter-key combination (,0 galcom -2still galcom). The extra space will be consumed by the pattern-matching."))
- if(MULTILINGUAL_DOUBLE_DELIMITER)
- to_chat(src, span_filter_system("Multilingual parsing will enforce the a language delimiter after the delimiter-key combination (,0,galcom -2 still galcom). The extra delimiter will be consumed by the pattern-matching."))
- if(MULTILINGUAL_OFF)
- to_chat(src, span_filter_system("Multilingual parsing is now disabled. Entire messages will be in the language specified at the start of the message."))
diff --git a/code/modules/economy/money_bag.dm b/code/modules/economy/money_bag.dm
index d515a1249bd..aff6d6ca7fe 100644
--- a/code/modules/economy/money_bag.dm
+++ b/code/modules/economy/money_bag.dm
@@ -43,7 +43,10 @@
dat += text("Phoron coins: [amt_phoron] Remove one ")
if (amt_uranium)
dat += text("Uranium coins: [amt_uranium] Remove one ")
- user << browse("[dat]", "window=moneybag")
+
+ var/datum/browser/popup = new(user, "moneybag", "Moneybag")
+ popup.set_content(dat)
+ popup.open()
/obj/item/moneybag/attackby(obj/item/W, mob/user)
..()
diff --git a/code/modules/economy/retail_scanner.dm b/code/modules/economy/retail_scanner.dm
index 35c6f4baa88..02914c1cfbb 100644
--- a/code/modules/economy/retail_scanner.dm
+++ b/code/modules/economy/retail_scanner.dm
@@ -88,11 +88,10 @@
dat += " "
dat += "Device ID: [machine_id]"
- dat = "