diff --git a/citadel.dme b/citadel.dme
index 484d097fd025..2d5d3e73a37b 100644
--- a/citadel.dme
+++ b/citadel.dme
@@ -666,6 +666,7 @@
#include "code\datums\components\gps_signal.dm"
#include "code\datums\components\horror_aura.dm"
#include "code\datums\components\jousting.dm"
+#include "code\datums\components\object_transform.dm"
#include "code\datums\components\orbiter.dm"
#include "code\datums\components\simple_access.dm"
#include "code\datums\components\slaved_atom_to_loc.dm"
diff --git a/code/__DEFINES/_flags/atom_flags.dm b/code/__DEFINES/_flags/atom_flags.dm
index d29d8ee6cdf1..afb4dec95219 100644
--- a/code/__DEFINES/_flags/atom_flags.dm
+++ b/code/__DEFINES/_flags/atom_flags.dm
@@ -156,7 +156,9 @@ DEFINE_BITFIELD(movement_type, list(
/// Don't let us buckle people to ourselves.
#define BUCKLING_NO_USER_BUCKLE_OTHER_TO_SELF (1<<6)
/// Lets the user avoid step checks.
-#define BUCKLING_GROUND_HOIST (1<<7)
+#define BUCKLING_GROUND_HOIST (1<<7)
+/// projects our depth to the buckled object. you usually don't want this.
+#define BUCKLING_PROJECTS_DEPTH (1<<8)
DEFINE_BITFIELD(buckle_flags, list(
BITFIELD(BUCKLING_REQUIRES_RESTRAINTS),
@@ -167,4 +169,5 @@ DEFINE_BITFIELD(buckle_flags, list(
BITFIELD(BUCKLING_NO_DEFAULT_RESIST),
BITFIELD(BUCKLING_NO_USER_BUCKLE_OTHER_TO_SELF),
BITFIELD(BUCKLING_GROUND_HOIST),
+ BITFIELD(BUCKLING_PROJECTS_DEPTH),
))
diff --git a/code/__DEFINES/_flags/obj_flags.dm b/code/__DEFINES/_flags/obj_flags.dm
index bc1d453b2011..14beb93e7060 100644
--- a/code/__DEFINES/_flags/obj_flags.dm
+++ b/code/__DEFINES/_flags/obj_flags.dm
@@ -7,10 +7,13 @@
#define ON_BLUEPRINTS (1<<2)
/// Prevent people from clicking under us
#define OBJ_PREVENT_CLICK_UNDER (1<<3)
+/// We ignore depth system when blocking mobs
+#define OBJ_IGNORE_MOB_DEPTH (1<<4)
DEFINE_BITFIELD(obj_flags, list(
BITFIELD(EMAGGED),
BITFIELD(CAN_BE_HIT),
BITFIELD(ON_BLUEPRINTS),
BITFIELD(OBJ_PREVENT_CLICK_UNDER),
+ BITFIELD(OBJ_IGNORE_MOB_DEPTH),
))
diff --git a/code/__DEFINES/ability.dm b/code/__DEFINES/ability.dm
index 914080f3b89e..dc6fd5c3b21e 100644
--- a/code/__DEFINES/ability.dm
+++ b/code/__DEFINES/ability.dm
@@ -13,3 +13,4 @@
#define ABILITY_CHECK_STANDING (1<<1)
#define ABILITY_CHECK_FREE_HAND (1<<2)
#define ABILITY_CHECK_STUNNED (1<<3)
+#define ABILITY_CHECK_RESTING (1<<4)
diff --git a/code/__DEFINES/procs/do_after.dm b/code/__DEFINES/procs/do_after.dm
index 2a8c22cc0f62..24d4fd21fd55 100644
--- a/code/__DEFINES/procs/do_after.dm
+++ b/code/__DEFINES/procs/do_after.dm
@@ -52,3 +52,5 @@
#define INTERACTING_FOR_ALT_CLICK "alt_click"
/// Attempting to resist out of something
#define INTERACTING_FOR_RESIST "resist"
+/// Climbing a structure
+#define INTERACTING_FOR_CLIMB "climb"
diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm
index 89976c498422..22c3827022ff 100644
--- a/code/__DEFINES/tgs.dm
+++ b/code/__DEFINES/tgs.dm
@@ -1,6 +1,6 @@
// tgstation-server DMAPI
-#define TGS_DMAPI_VERSION "6.5.0"
+#define TGS_DMAPI_VERSION "6.5.2"
// All functions and datums outside this document are subject to change with any version and should not be relied on.
diff --git a/code/controllers/subsystem/mapping/maps.dm b/code/controllers/subsystem/mapping/maps.dm
index c8cb7eee8987..7479adb8c495 100644
--- a/code/controllers/subsystem/mapping/maps.dm
+++ b/code/controllers/subsystem/mapping/maps.dm
@@ -252,3 +252,4 @@
log_and_message_admins("[key_name(src)] is changing the next map from [was.name] ([was.id]) to [changing_to.name] ([changing_to.id])")
SSmapping.next_station = changing_to
+ SSmapping.write_next_map(changing_to)
diff --git a/code/controllers/subsystem/supply.dm b/code/controllers/subsystem/supply.dm
index af3411f44f0d..cbcb428d476d 100644
--- a/code/controllers/subsystem/supply.dm
+++ b/code/controllers/subsystem/supply.dm
@@ -221,6 +221,9 @@ SUBSYSTEM_DEF(supply)
// Will attempt to purchase the specified order, returning TRUE on success, FALSE on failure
/datum/controller/subsystem/supply/proc/approve_order(var/datum/supply_order/O, var/mob/user)
+ // do not double purchase!!
+ if(O.status != SUP_ORDER_REQUESTED)
+ return FALSE
// Not enough points to purchase the crate
if(SSsupply.points <= O.object.cost)
return FALSE
diff --git a/code/datums/ability.dm b/code/datums/ability.dm
index 1ef787b7c196..6c50c2ba8b8e 100644
--- a/code/datums/ability.dm
+++ b/code/datums/ability.dm
@@ -170,7 +170,7 @@
to_chat(user, SPAN_WARNING("[src] is still on cooldown! ([round((world.time - last_used) * 0.1, 0.1)] / [round(cooldown * 0.1, 0.1)])"))
return FALSE
if(!available_check())
- to_chat(user, SPAN_WARNING("You can't do that right now!"))
+ to_chat(user, SPAN_WARNING(unavailable_reason()))
return FALSE
return TRUE
@@ -259,6 +259,8 @@
return FALSE
if((ability_check_flags & ABILITY_CHECK_FREE_HAND) && !(owner.has_free_hand()))
return FALSE
+ if((ability_check_flags & ABILITY_CHECK_RESTING) && !IS_PRONE(owner))
+ return FALSE
if(!CHECK_MOBILITY(owner, mobility_check_flags))
return FALSE
return TRUE
@@ -277,6 +279,8 @@
return "You cannot do that while on the ground."
if((ability_check_flags & ABILITY_CHECK_FREE_HAND) && !(owner.has_free_hand()))
return "You cannot do that without a free hand."
+ if((ability_check_flags & ABILITY_CHECK_RESTING) && !owner.lying)
+ return "You must be lying down to do that."
if(!CHECK_MOBILITY(owner, mobility_check_flags))
return "You cannot do that while incapacitated."
diff --git a/code/datums/components/object_transform.dm b/code/datums/components/object_transform.dm
new file mode 100644
index 000000000000..a772d920adbe
--- /dev/null
+++ b/code/datums/components/object_transform.dm
@@ -0,0 +1,33 @@
+/datum/component/object_transform
+ var/obj/transformed_object
+ var/to_object_text
+ var/to_mob_text
+
+/datum/component/object_transform/Initialize(_transformed_object, _to_object_text, _to_mob_text)
+ transformed_object = _transformed_object
+ to_object_text = _to_object_text
+ to_mob_text = _to_mob_text
+ put_in_object(TRUE)
+
+/datum/component/object_transform/proc/swap_object(new_object)
+ . = transformed_object
+ var/mob/owner = parent
+ if(parent in transformed_object.contents)
+ owner.forceMove(transformed_object.loc)
+ transformed_object = new_object
+ put_in_object()
+
+/datum/component/object_transform/proc/put_in_object(silent = FALSE)
+ var/mob/owner = parent
+ transformed_object.forceMove(owner.loc)
+ owner.forceMove(transformed_object)
+ if(!silent && length(to_object_text))
+ owner.visible_message("[owner] [to_object_text]")
+
+/datum/component/object_transform/proc/put_in_mob(silent = FALSE)
+ var/mob/owner = parent
+ owner.forceMove(transformed_object.loc)
+ transformed_object.forceMove(parent)
+ if(!silent && length(to_mob_text))
+ owner.visible_message("[owner] [to_mob_text]")
+
diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm
index 7351b5d8be42..4bda92467aba 100644
--- a/code/game/machinery/computer/atmos_control.dm
+++ b/code/game/machinery/computer/atmos_control.dm
@@ -26,6 +26,9 @@
icon_keyboard = "pcu_key"
density = FALSE
light_color = "#00cc00"
+ depth_level = 0
+ depth_projected = FALSE
+ climb_allowed = FALSE
/obj/machinery/computer/atmoscontrol/attack_ai(mob/user)
ui_interact(user)
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 34af11784c4c..956524447cf1 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -7,6 +7,9 @@
use_power = USE_POWER_IDLE
idle_power_usage = 300
active_power_usage = 300
+ depth_level = 8
+ depth_projected = TRUE
+ climb_allowed = TRUE
//blocks_emissive = FALSE
var/processing = FALSE
diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm
index 2d7851711b0e..ded499f7c774 100755
--- a/code/game/machinery/computer/guestpass.dm
+++ b/code/game/machinery/computer/guestpass.dm
@@ -84,7 +84,9 @@
layer = ABOVE_TURF_LAYER
icon_keyboard = null
icon_screen = "pass"
- density = 0
+ depth_projected = FALSE
+ climb_allowed = FALSE
+ density = FALSE
circuit = /obj/item/circuitboard/guestpass
var/obj/item/card/id/giver
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 734cc897362b..66badb710a09 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -507,7 +507,9 @@
light_color = "#5284e7"
circuit = /obj/item/circuitboard/med_data/pcu
density = FALSE
-
+ depth_level = 0
+ depth_projected = FALSE
+ climb_allowed = FALSE
#undef FIELD
#undef MED_FIELD
diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm
index 65b2b5870cc3..ba55c1287bea 100644
--- a/code/game/machinery/computer/skills.dm
+++ b/code/game/machinery/computer/skills.dm
@@ -14,6 +14,9 @@
req_one_access = list(ACCESS_COMMAND_BRIDGE)
circuit = /obj/item/circuitboard/skills/pcu
density = FALSE
+ depth_level = 0
+ depth_projected = FALSE
+ climb_allowed = FALSE
var/obj/item/card/id/scan = null
var/authenticated = null
var/rank = null
diff --git a/code/game/machinery/computer/timeclock_vr.dm b/code/game/machinery/computer/timeclock_vr.dm
index 8d18a35c73e6..1b8cdfdd51bf 100644
--- a/code/game/machinery/computer/timeclock_vr.dm
+++ b/code/game/machinery/computer/timeclock_vr.dm
@@ -16,6 +16,8 @@
density = FALSE
circuit = /obj/item/circuitboard/timeclock
clicksound = null
+ climb_allowed = FALSE
+ depth_projected = FALSE
var/channel = "Common" //Radio channel to announce on
var/obj/item/card/id/card // Inserted Id card
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 8eb507be9e9e..2f740a0166ea 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -15,6 +15,8 @@
icon_state = "cellconsole"
circuit = /obj/item/circuitboard/cryopodcontrol
density = FALSE
+ climb_allowed = FALSE
+ depth_projected = FALSE
interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_ALLOW_SILICON
var/mode = null
diff --git a/code/game/machinery/doors/airlock_subtypes.dm b/code/game/machinery/doors/airlock_subtypes.dm
index abcf41cd152d..9c5c56ec437f 100644
--- a/code/game/machinery/doors/airlock_subtypes.dm
+++ b/code/game/machinery/doors/airlock_subtypes.dm
@@ -142,8 +142,8 @@
close_sound_powered = 'sound/machines/door/hall1c.ogg'
maxhealth = 300
explosion_resistance = 5
- opacity = 1
- glass = 1
+ opacity = FALSE
+ glass = TRUE
window_color = GLASS_COLOR
/obj/machinery/door/airlock/centcom
diff --git a/code/game/machinery/holopad.dm b/code/game/machinery/holopad.dm
index 7f53db686258..dfaf5ab0c7d1 100644
--- a/code/game/machinery/holopad.dm
+++ b/code/game/machinery/holopad.dm
@@ -35,6 +35,8 @@ GLOBAL_VAR_INIT(holopad_connectivity_rebuild_queued, FALSE)
active_power_usage = 100
light_range = 1.5
light_power = 0
+ depth_projected = FALSE
+ climb_allowed = FALSE
//? balancing
/// base power used to project at all
diff --git a/code/game/machinery/lathes/lathe.dm b/code/game/machinery/lathes/lathe.dm
index a264d2330a27..71a0e394180c 100644
--- a/code/game/machinery/lathes/lathe.dm
+++ b/code/game/machinery/lathes/lathe.dm
@@ -25,6 +25,9 @@
circuit = /obj/item/circuitboard/machine/lathe
default_deconstruct = 0 SECONDS
default_panel = 0 SECONDS
+ depth_projected = TRUE
+ depth_level = 8
+ climb_allowed = TRUE
/// icon state when printing, if any
var/active_icon_state
@@ -196,7 +199,7 @@
/obj/machinery/lathe/proc/insert_item(obj/item/I, mob/user)
if(LAZYLEN(stored_items) >= items_max)
- user.action_feedback(SPAN_WARNING("[src] can't hold [items_max && "more"] items for machining."), src)
+ user.action_feedback(SPAN_WARNING("[src] can't hold [items_max? "any more" : ""]items for machining."), src)
return FALSE
if(!isnull(user))
if(user.is_in_inventory(I) && !user.transfer_item_to_loc(I, src))
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 949d4d23fdcb..4a10872a7473 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -4,6 +4,9 @@
w_class = ITEMSIZE_NORMAL
// todo: better way, for now, block all rad contamination to interior
rad_flags = RAD_BLOCK_CONTENTS
+ obj_flags = OBJ_IGNORE_MOB_DEPTH
+ depth_level = 0
+ climb_allowed = FALSE
//? Flags
/// Item flags.
diff --git a/code/game/objects/items/poi_items.dm b/code/game/objects/items/poi_items.dm
index 5762579fcc9c..f94168e7a5cd 100644
--- a/code/game/objects/items/poi_items.dm
+++ b/code/game/objects/items/poi_items.dm
@@ -26,7 +26,6 @@
icon_state = "poireactor"
icon_opened = "poireactor_open"
icon_closed = "poireactor"
- climbable = 0
starts_with = list(
/obj/item/fuel_assembly/deuterium = 6)
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 86d54fc31cdc..ef6d74c5c5ab 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -122,42 +122,106 @@ var/global/list/datum/stack_recipe/grass_recipes = list( \
singular_name = "black carpet"
desc = "A piece of black carpet. It is the same size as a normal floor tile!"
icon_state = "tile-bcarpet"
+
/obj/item/stack/tile/carpet/blucarpet
name = "blue carpet"
singular_name = "blue carpet"
desc = "A piece of blue carpet. It is the same size as a normal floor tile!"
icon_state = "tile-blucarpet"
+
/obj/item/stack/tile/carpet/turcarpet
name = "tur carpet"
singular_name = "tur carpet"
desc = "A piece of turquoise carpet. It is the same size as a normal floor tile!"
icon_state = "tile-turcarpet"
+
/obj/item/stack/tile/carpet/sblucarpet
name = "silver-blue carpet"
singular_name = "silver-blue carpet"
desc = "A piece of silver-blue carpet. It is the same size as a normal floor tile!"
icon_state = "tile-sblucarpet"
+
/obj/item/stack/tile/carpet/gaycarpet
name = "funny carpet"
singular_name = "funny carpet"
desc = "A piece of funny carpet. Perfect for clowning around on."
icon_state = "tile-gaycarpet"
+
/obj/item/stack/tile/carpet/purcarpet
name = "purple carpet"
singular_name = "purple carpet"
desc = "A piece of purple carpet. It is the same size as a normal floor tile!"
icon_state = "tile-purcarpet"
+
/obj/item/stack/tile/carpet/oracarpet
name = "orange carpet"
singular_name = "orange carpet"
desc = "A piece of orange carpet. It is the same size as a normal floor tile!"
icon_state = "tile-oracarpet"
+
/obj/item/stack/tile/carpet/arcadecarpet
name = "arcadey carpet"
singular_name = "arcadey carpet"
desc = "A piece of arcadey carpet. It is the same size as a normal floor tile!"
icon_state = "tile-carpet-arcade"
+/obj/item/stack/tile/carpet/patterned
+ no_variants = TRUE
+
+/obj/item/stack/tile/carpet/patterned/brown
+ name = "brown patterned carpet"
+ singular_name = "brown patterned carpet"
+ desc = "A piece of brown carpet with a fetching light brown pattern. It is the same size as a normal floor tile!"
+ icon_state = "tile-carpetbrown"
+
+/obj/item/stack/tile/carpet/patterned/green
+ name = "green patterned carpet"
+ singular_name = "green patterned carpet"
+ desc = "A piece of green carpet with a fetching light green pattern. It is the same size as a normal floor tile!"
+ icon_state = "tile-carpetgreen"
+
+/obj/item/stack/tile/carpet/patterned/red
+ name = "red patterned carpet"
+ singular_name = "red patterned carpet"
+ desc = "A piece of red carpet with a fetching gold pattern. It is the same size as a normal floor tile!"
+ icon_state = "tile-carpetred"
+
+/obj/item/stack/tile/carpet/patterned/blue
+ name = "blue patterned carpet"
+ singular_name = "blue patterned carpet"
+ desc = "A piece of brown carpet with a fetching gold pattern. It is the same size as a normal floor tile!"
+ icon_state = "tile-carpetblue"
+
+/obj/item/stack/tile/carpet/patterned/blue/alt
+ name = "blue patterned carpet"
+ singular_name = "blue patterned carpet"
+ desc = "A piece of blue carpet with a fetching white pattern. It is the same size as a normal floor tile!"
+ icon_state = "tile-carpetblue2"
+
+/obj/item/stack/tile/carpet/patterned/blue/alt2
+ name = "blue patterned carpet"
+ singular_name = "blue patterned carpet"
+ desc = "A piece of blue carpet with a fetching seafoam green pattern. It is the same size as a normal floor tile!"
+ icon_state = "tile-carpetblue3"
+
+/obj/item/stack/tile/carpet/patterned/magenta
+ name = "magenta patterned carpet"
+ singular_name = "magenta patterned carpet"
+ desc = "A piece of magenta carpet with a fetching gold pattern. It is the same size as a normal floor tile!"
+ icon_state = "tile-carpetmagenta"
+
+/obj/item/stack/tile/carpet/patterned/purple
+ name = "purple patterned carpet"
+ singular_name = "purple patterned carpet"
+ desc = "A piece of purple carpet with a fetching gold pattern. It is the same size as a normal floor tile!"
+ icon_state = "tile-carpetpurple"
+
+/obj/item/stack/tile/carpet/patterned/orange
+ name = "orange patterned carpet"
+ singular_name = "orange patterned carpet"
+ desc = "A piece of orange carpet with a fetching gold pattern. It is the same size as a normal floor tile!"
+ icon_state = "tile-carpetorange"
+
/obj/item/stack/tile/floor
name = "floor tile"
singular_name = "floor tile"
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 33bc578db287..623b05d1d001 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -18,6 +18,26 @@
/// If set, at least one of these accesses are needed to access this object.
var/list/req_one_access
+ //? Climbing
+ /// people can climb onto us
+ var/climb_allowed = FALSE
+ /// people are allowed to knock climbers off of us
+ var/climb_knockable = TRUE
+ /// list of people currently climbing on us
+ /// currently, only /mob/living is allowed to climb
+ var/list/mob/living/climbing
+ /// nominal climb delay before modifiers
+ var/climb_delay = 3.5 SECONDS
+
+ //? Depth
+ /// logical depth in pixels. people can freely run from high to low objects without being blocked.
+ ///
+ /// negative values are ignored as turfs are assumed to be depth 0
+ /// unless we change that in the future
+ var/depth_level = 28
+ /// contributes to depth when we're on a turf
+ var/depth_projected = FALSE
+
//? Economy
/// economic category for objects
var/economic_category_obj = ECONOMIC_CATEGORY_OBJ_DEFAULT
@@ -163,7 +183,7 @@
/obj/proc/hides_under_flooring()
return 0
- /**
+/**
* This proc is used for telling whether something can pass by this object in a given direction, for use by the pathfinding system.
*
* Trying to generate one long path across the station will call this proc on every single object on every single tile that we're seeing if we can move through, likely
@@ -236,6 +256,157 @@
add_fingerprint(user)
..()
+//? Climbing
+
+/obj/MouseDroppedOn(atom/dropping, mob/user, proximity, params)
+ if(drag_drop_climb_interaction(user, dropping))
+ return CLICKCHAIN_DO_NOT_PROPAGATE
+ return ..()
+
+/obj/proc/drag_drop_climb_interaction(mob/user, atom/dropping)
+ if(!climb_allowed)
+ return FALSE
+ if(user != dropping)
+ return FALSE
+ // todo: better hinting to user for this
+ if(buckle_allowed && user.a_intent != INTENT_GRAB)
+ return FALSE
+ if(!user.Adjacent(src))
+ return FALSE
+ . = TRUE
+ INVOKE_ASYNC(src, PROC_REF(attempt_climb_on), user)
+
+/obj/proc/attempt_climb_on(mob/living/climber, delay_mod = 1)
+ if(!istype(climber))
+ return FALSE
+ if(!allow_climb_on(climber))
+ climber.action_feedback(SPAN_WARNING("You can't climb onto [src]!"), src)
+ return FALSE
+ if(INTERACTING_WITH_FOR(climber, src, INTERACTING_FOR_CLIMB))
+ return FALSE
+ climber.visible_action_feedback(SPAN_WARNING("[climber] starts climbing onto \the [src]!"), src, MESSAGE_RANGE_COMBAT_LOUD)
+ START_INTERACTING_WITH(climber, src, INTERACTING_FOR_CLIMB)
+ LAZYDISTINCTADD(climbing, climber)
+ . = do_after(climber, climb_delay * delay_mod, src, mobility_flags = MOBILITY_CAN_MOVE | MOBILITY_CAN_STAND | MOBILITY_IS_STANDING)
+ if(!INTERACTING_WITH_FOR(climber, src, INTERACTING_FOR_CLIMB))
+ . = FALSE
+ LAZYREMOVE(climbing, climber)
+ STOP_INTERACTING_WITH(climber, src, INTERACTING_FOR_CLIMB)
+ if(!allow_climb_on(climber))
+ climber.action_feedback(SPAN_WARNING("You couldn't climb onto [src]!"), src)
+ return FALSE
+ do_climb_on(climber)
+
+/obj/proc/allow_climb_on(mob/living/climber)
+ if(!istype(climber))
+ return FALSE
+ if(!climb_allowed)
+ return FALSE
+ if(!climber.Adjacent(src))
+ return FALSE
+ return TRUE
+
+/obj/proc/do_climb_on(mob/living/climber)
+ climber.visible_message(SPAN_WARNING("[climber] climbs onto \the [src]!"))
+ // all this effort just to avoid a splurtstation railing spare ID speedrun incident
+ var/old_depth = climber.depth_current
+ if(climber.depth_current < depth_level)
+ // basically, we don't force move them, we just elevate them to our level
+ // if something else blocks them, L + ratio + get parried
+ climber.change_depth(depth_level)
+ if(!step_towards(climber, do_climb_target(climber)))
+ climber.change_depth(old_depth)
+
+/obj/proc/do_climb_target(mob/living/climber)
+ return get_turf(src)
+
+/obj/attack_hand(mob/user, list/params)
+ . = ..()
+ if(.)
+ return
+ if(length(climbing) && user.a_intent == INTENT_HARM)
+ user.visible_message(SPAN_WARNING("[user] slams against \the [src]!"))
+ user.do_attack_animation(src)
+ shake_climbers()
+ return TRUE
+
+/obj/proc/shake_climbers()
+ for(var/mob/living/climber as anything in climbing)
+ climber.afflict_knockdown(1 SECONDS)
+ climber.visible_message(SPAN_WARNING("[climber] is toppled off of \the [src]!"))
+ STOP_INTERACTING_WITH(climber, src, INTERACTING_FOR_CLIMB)
+ climbing = null
+
+ // disabled old, but fun code that knocks people on their ass if something is shaken without climbers
+ // being ontop of it
+ // consider re-enabling this sometime.
+ /*
+ for(var/mob/living/M in get_turf(src))
+ if(M.lying) return //No spamming this on people.
+
+ M.afflict_paralyze(20 * 3)
+ to_chat(M, "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, "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, "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, "You land heavily!")
+ H.adjustBruteLoss(damage)
+
+ H.UpdateDamageIcon()
+ H.update_health()
+ */
+
+//? Materials
+
+/obj/get_materials()
+ . = materials.Copy()
+
+/**
+ * initialize materials
+ */
+/obj/proc/init_materials()
+ if(!isnull(material_defaults))
+ set_material_parts(material_defaults)
+ for(var/key in material_defaults)
+ var/mat = material_defaults[key]
+ var/amt = material_parts[key]
+ materials[mat] += amt
+
+/**
+ * sets our material parts to a list by key / value
+ * this does not update [materials], you have to do that manually
+ * this is usually done in init using init_materials
+ */
+/obj/proc/set_material_parts(list/parts)
+ return
+
//? Resists
/**
@@ -308,27 +479,3 @@
var/shake_dir = pick(-1, 1)
animate(src, transform=turn(matrix(), 8*shake_dir), pixel_x=init_px + 2*shake_dir, time=1)
animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING)
-
-//? materials
-
-/obj/get_materials()
- . = materials.Copy()
-
-/**
- * initialize materials
- */
-/obj/proc/init_materials()
- if(!isnull(material_defaults))
- set_material_parts(material_defaults)
- for(var/key in material_defaults)
- var/mat = material_defaults[key]
- var/amt = material_parts[key]
- materials[mat] += amt
-
-/**
- * sets our material parts to a list by key / value
- * this does not update [materials], you have to do that manually
- * this is usually done in init using init_materials
- */
-/obj/proc/set_material_parts(list/parts)
- return
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index f050a280f3f3..f97ca561d5e4 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -5,11 +5,7 @@
// todo: rename to default_unanchor, allow generic structure unanchoring.
var/allow_unanchor = FALSE
-
- var/climbable
- var/climb_delay = 3.5 SECONDS
- var/breakable
- var/list/climbers = list()
+ var/breakable = FALSE
var/list/connections
var/list/other_connections
@@ -19,9 +15,6 @@
/obj/structure/Initialize(mapload)
. = ..()
- if(climbable)
- add_obj_verb(src, /obj/structure/proc/climb_on)
-
if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
QUEUE_SMOOTH(src)
QUEUE_SMOOTH_NEIGHBORS(src)
@@ -48,11 +41,6 @@
if(H.species.can_shred(user))
attack_generic(user,1,"slices")
- if(climbers.len && !(user in climbers))
- user.visible_message("[user.name] shakes \the [src].", \
- "You shake \the [src].")
- structure_shaken()
-
return ..()
/obj/structure/attack_tk()
@@ -70,122 +58,17 @@
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/MouseDroppedOnLegacy(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, "You can't climb there, the way is blocked.")
- return 0
-
- var/obj/occupied = turf_is_crowded()
- if(occupied)
- to_chat(user, "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 0
for(var/obj/O in T.contents)
- if(istype(O,/obj/structure))
- var/obj/structure/S = O
- if(S.climbable) continue
+ if(O.climb_allowed)
+ continue
if(O && O.density && !(O.atom_flags & ATOM_BORDER)) //ATOM_BORDER structures are handled by the Adjacent() check.
return O
return 0
-// todo: climbable obj-level (to avoid element/signal spam)
-/obj/structure/proc/do_climb(var/mob/living/user)
- if (!can_climb(user))
- return
-
- usr.visible_message("[user] starts climbing onto \the [src]!")
- climbers |= user
-
- if(!do_after(user, issmall(user) ? climb_delay * 0.6 : climb_delay, src, mobility_flags = MOBILITY_CAN_MOVE | MOBILITY_CAN_USE))
- climbers -= user
- return
-
- if (!can_climb(user, post_climb_check=1))
- climbers -= user
- return
-
- var/old = pass_flags & (ATOM_PASS_BUCKLED)
- pass_flags |= ATOM_PASS_BUCKLED
- usr.locationTransitForceMove(get_turf(src), allow_buckled = TRUE, allow_pulled = FALSE, allow_grabbed = TRUE)
- pass_flags = (pass_flags & ~(ATOM_PASS_BUCKLED)) | (old & ATOM_PASS_BUCKLED)
-
- if (get_turf(user) == get_turf(src))
- usr.visible_message("[user] climbs onto \the [src]!")
- climbers -= user
-
-/obj/structure/proc/structure_shaken()
- for(var/mob/living/M in climbers)
- M.afflict_paralyze(20 * 1)
- to_chat(M, "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.afflict_paralyze(20 * 3)
- to_chat(M, "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, "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, "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, "You land heavily!")
- H.adjustBruteLoss(damage)
-
- H.UpdateDamageIcon()
- H.update_health()
- return
-
// todo: remove
/obj/structure/proc/can_touch(var/mob/user)
if (!user)
diff --git a/code/game/objects/structures/cliff.dm b/code/game/objects/structures/cliff.dm
index e6100d7aaa87..8dae834f31c5 100644
--- a/code/game/objects/structures/cliff.dm
+++ b/code/game/objects/structures/cliff.dm
@@ -31,7 +31,7 @@ two tiles on initialization, and which way a cliff is facing may change during m
anchored = TRUE
density = TRUE
opacity = FALSE
- climbable = TRUE
+ climb_allowed = TRUE
climb_delay = 10 SECONDS
// TODO: IMPLEMENT THIS AGAIN, this was done in a horrifically slow and stupid way
// block_turf_edges = TRUE // Don't want turf edges popping up from the cliff edge.
@@ -219,19 +219,24 @@ 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)
+/obj/structure/cliff/allow_climb_on(mob/living/climber)
+ . = ..()
+ if(!.)
+ return
+ //! LEGAYC CODE START
+ var/mob/living/user = climber
// 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.
+ return TRUE
var/obj/item/held = H.get_active_held_item()
if(held && istype(held, /obj/item/pickaxe/icepick))
- return ..() //climb rock wall with ice pick. Makes sense.
-
+ return TRUE
to_chat(user, SPAN_WARNING( "\The [src] is too steep to climb unassisted."))
return FALSE
+ //! END
// This tells AI mobs to not be dumb and step off cliffs willingly.
/obj/structure/cliff/is_safe_to_step(mob/living/L)
diff --git a/code/game/objects/structures/crates_lockers/__closet.dm b/code/game/objects/structures/crates_lockers/__closet.dm
index 941e28c00367..b341a300b97f 100644
--- a/code/game/objects/structures/crates_lockers/__closet.dm
+++ b/code/game/objects/structures/crates_lockers/__closet.dm
@@ -1,7 +1,7 @@
/obj/structure/closet
name = "closet"
desc = "It's a basic storage unit."
- icon = 'icons/obj/closet.dmi'
+ icon = 'icons/obj/closets/bases/closet.dmi'
icon_state = "base"
density = 1
w_class = ITEMSIZE_HUGE
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 92cd4508417a..8a5ad5f0ff8a 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -148,6 +148,7 @@
/obj/item/clothing/under/rank/head_of_security/turtleneck,
/obj/item/clothing/under/oricon/mildress/marine/command,
/obj/item/clothing/suit/storage/vest/hoscoat/jensen,
+ /obj/item/clothing/suit/storage/vest/hoscoat/combatcoat,
/obj/item/clothing/suit/storage/vest/hoscoat,
/obj/item/clothing/suit/storage/vest/hos_overcoat,
/obj/item/clothing/suit/storage/hooded/wintercoat/security,
diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
index 803009c04cc6..a1b3a05743b3 100644
--- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
@@ -88,12 +88,6 @@
/obj/item/extinguisher = 2,
/obj/item/clothing/head/hardhat/red = 2)
-/obj/structure/closet/firecloset/update_icon()
- if(!opened)
- icon_state = icon_closed
- else
- icon_state = icon_opened
-
/*
* Tool Closet
*/
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 6a565c8c40a4..cbcb39c99c76 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -3,8 +3,11 @@
/obj/structure/closet/crate
name = "crate"
desc = "A rectangular steel crate."
+ icon = 'icons/obj/closets/bases/crate.dmi'
closet_appearance = /singleton/closet_appearance/crate
- climbable = 1
+ climb_allowed = TRUE
+ depth_projected = TRUE
+ depth_level = 8
var/points_per_crate = 5
// mouse_drag_pointer = MOUSE_ACTIVE_POINTER //???
var/rigged = 0
@@ -43,9 +46,7 @@
O.forceMove(get_turf(src))
icon_state = icon_opened
src.opened = 1
-
- if(climbable)
- structure_shaken()
+ shake_climbers()
return 1
/obj/structure/closet/crate/close()
diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm
index 69405eb9c4f1..81ac90e359f3 100644
--- a/code/game/objects/structures/fence.dm
+++ b/code/game/objects/structures/fence.dm
@@ -94,11 +94,9 @@
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
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
update_cut_status()
return TRUE
@@ -106,15 +104,20 @@
if(!cuttable)
return
density = TRUE
+ climb_allowed = initial(climb_allowed)
+ climb_delay = initial(climb_delay)
switch(hole_size)
if(NO_HOLE)
icon_state = initial(icon_state)
if(MEDIUM_HOLE)
icon_state = "straight-cut2"
+ climb_allowed = TRUE
if(LARGE_HOLE)
icon_state = "straight-cut3"
density = FALSE
+ climb_allowed = TRUE
+ climb_delay = 0
//FENCE DOORS
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index e30cd90d92d4..ca18e4e9d962 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -6,6 +6,8 @@
density = TRUE
plane = TURF_PLANE
w_class = ITEMSIZE_HUGE
+ depth_level = 24
+ depth_projected = TRUE
var/state = 0
var/health = 200
diff --git a/code/game/objects/structures/gravemarker.dm b/code/game/objects/structures/gravemarker.dm
index eb073df8cd69..4e52b35ec668 100644
--- a/code/game/objects/structures/gravemarker.dm
+++ b/code/game/objects/structures/gravemarker.dm
@@ -5,7 +5,8 @@
density = TRUE
pass_flags_self = ATOM_PASS_THROWN | ATOM_PASS_CLICK | ATOM_PASS_TABLE | ATOM_PASS_OVERHEAD_THROW
- climbable = TRUE
+ climb_allowed = TRUE
+ depth_level = 8
anchored = TRUE
layer = ABOVE_JUNK_LAYER
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 7b04af27eaec..4e7067671332 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -7,7 +7,8 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart)
icon_state = "cart"
anchored = 0
density = 1
- climbable = 1
+ climb_allowed = TRUE
+ depth_level = 20
atom_flags = OPENCONTAINER
//copypaste sorry
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite
diff --git a/code/game/objects/structures/ledges.dm b/code/game/objects/structures/ledges.dm
index 059a5916a6f4..4e715093f578 100644
--- a/code/game/objects/structures/ledges.dm
+++ b/code/game/objects/structures/ledges.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/ledges.dmi'
pass_flags_self = ATOM_PASS_TABLE | ATOM_PASS_THROWN | ATOM_PASS_CLICK | ATOM_PASS_OVERHEAD_THROW | ATOM_PASS_BUCKLED
density = TRUE
- climbable = TRUE
+ climb_allowed = TRUE
anchored = TRUE
var/solidledge = 1
atom_flags = ATOM_BORDER
@@ -19,7 +19,7 @@
icon = 'icons/obj/ledges.dmi'
density = TRUE
pass_flags_self = ATOM_PASS_TABLE | ATOM_PASS_THROWN | ATOM_PASS_CLICK | ATOM_PASS_OVERHEAD_THROW | ATOM_PASS_BUCKLED
- climbable = TRUE
+ climb_allowed = TRUE
anchored = TRUE
layer = STAIRS_LAYER
@@ -51,37 +51,3 @@
if(!(get_dir(src, newLoc) & dir))
return TRUE
return FALSE
-
-/obj/structure/ledge/do_climb(var/mob/living/user)
- if(!can_climb(user))
- return
-
- usr.visible_message("[user] starts climbing onto \the [src]!")
- climbers |= user
-
- if(!do_after(user,(issmall(user) ? 20 : 34)))
- climbers -= user
- return
-
- if(!can_climb(user, post_climb_check=1))
- climbers -= user
- return
-
- if(get_turf(user) == get_turf(src))
- usr.forceMove(get_step(src, src.dir))
- else
- usr.forceMove(get_turf(src))
-
- usr.visible_message("[user] climbed over \the [src]!")
- 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, "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 333903bdf194..86df124311b3 100644
--- a/code/game/objects/structures/low_wall.dm
+++ b/code/game/objects/structures/low_wall.dm
@@ -25,6 +25,10 @@ GLOBAL_LIST_INIT(wallframe_typecache, typecacheof(list(
smoothing_flags = SMOOTH_BITMASK
smoothing_groups = (SMOOTH_GROUP_LOW_WALL)
canSmoothWith = (SMOOTH_GROUP_AIRLOCK+SMOOTH_GROUP_LOW_WALL+SMOOTH_GROUP_WALLS)
+ depth_projected = TRUE
+ depth_level = 8
+ climb_allowed = TRUE
+ climb_delay = 2.0 SECONDS
plane = OBJ_PLANE
var/default_material = MAT_STEEL
diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm
index 8b086f10d7e1..51e97f054af9 100644
--- a/code/game/objects/structures/mop_bucket.dm
+++ b/code/game/objects/structures/mop_bucket.dm
@@ -4,7 +4,8 @@
icon = 'icons/obj/janitor.dmi'
icon_state = "mopbucket"
density = 1
- climbable = 1
+ climb_allowed = TRUE
+ depth_level = 8
w_class = ITEMSIZE_NORMAL
pressure_resistance = 5
atom_flags = OPENCONTAINER
diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm
index 1178892d49ff..e6b9b7ea4ca1 100644
--- a/code/game/objects/structures/railing.dm
+++ b/code/game/objects/structures/railing.dm
@@ -5,7 +5,8 @@
icon = 'icons/obj/railing.dmi'
density = TRUE
pass_flags_self = ATOM_PASS_THROWN | ATOM_PASS_CLICK | ATOM_PASS_TABLE | ATOM_PASS_OVERHEAD_THROW | ATOM_PASS_CLICK | ATOM_PASS_BUCKLED
- climbable = TRUE
+ climb_allowed = TRUE
+ depth_level = 24
layer = WINDOW_LAYER
anchored = TRUE
atom_flags = ATOM_BORDER
@@ -25,8 +26,6 @@
// TODO - "constructed" is not passed to us. We need to find a way to do this safely.
if (constructed) // player-constructed railings
anchored = 0
- if(climbable)
- add_obj_verb(src, /obj/structure/proc/climb_on)
if(src.anchored)
update_icon(0)
@@ -46,6 +45,10 @@
return TRUE
if(!(get_dir(src, newLoc) & dir))
return TRUE
+ if(isliving(mover))
+ var/mob/living/L = mover
+ if((L.depth_current >= depth_level) && !(obj_flags & OBJ_IGNORE_MOB_DEPTH))
+ return TRUE
return !density
/obj/structure/railing/examine(mob/user, dist)
@@ -268,55 +271,13 @@
switch(severity)
if(1.0)
qdel(src)
- return
if(2.0)
qdel(src)
- return
if(3.0)
qdel(src)
- return
- else
- return
-
-// Duplicated from structures.dm, but its a bit different.
-/obj/structure/railing/do_climb(var/mob/living/user)
- if(!can_climb(user))
- return
-
- usr.visible_message("[user] starts climbing onto \the [src]!")
- climbers |= user
-
- if(!do_after(user,(issmall(user) ? 20 : 34)))
- climbers -= user
- return
-
- if(!can_climb(user, post_climb_check=1))
- climbers -= user
- return
-
- if(get_turf(user) == get_turf(src))
- usr.locationTransitForceMove(get_step(src, src.dir), allow_buckled = TRUE, allow_pulled = FALSE, allow_grabbed = TRUE)
- else
- usr.locationTransitForceMove(get_turf(src), allow_buckled = TRUE, allow_pulled = FALSE, allow_grabbed = TRUE)
-
- usr.visible_message("[user] climbed over \the [src]!")
- if(!anchored) take_damage(maxhealth) // Fatboy
- 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, "You can't climb there, there's \a [occupied] in the way.")
- return 0
- return 1
// TODO - This here might require some investigation
+// todo: no, this here needs to be thrown out, we have depth system now
/obj/structure/proc/neighbor_turf_impassable()
var/turf/T = get_step(src, src.dir)
if(!T || !istype(T))
@@ -326,6 +287,10 @@
for(var/obj/O in T.contents)
if(istype(O,/obj/structure))
var/obj/structure/S = O
- if(S.climbable) continue
+ if(S.climb_allowed)
+ continue
if(O && O.density && !(O.atom_flags & ATOM_BORDER && !(turn(O.dir, 180) & dir)))
return O
+
+/obj/structure/railing/do_climb_target(mob/living/climber)
+ return climber.loc == get_turf(src)? get_step(src, dir) : ..()
diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
index 20c5fe87b595..c615c6156d13 100644
--- a/code/game/objects/structures/statues.dm
+++ b/code/game/objects/structures/statues.dm
@@ -346,7 +346,9 @@
density = TRUE
anchored = TRUE
pass_flags_self = ATOM_PASS_THROWN | ATOM_PASS_OVERHEAD_THROW
- climbable = TRUE
+ climb_allowed = TRUE
+ depth_projected = TRUE
+ depth_level = 24
/obj/structure/memorial/small
icon = 'icons/obj/structures.dmi'
diff --git a/code/game/rendering/parallax/parallax_holder.dm b/code/game/rendering/parallax/parallax_holder.dm
index 0ffebf5cd501..e018f065419c 100644
--- a/code/game/rendering/parallax/parallax_holder.dm
+++ b/code/game/rendering/parallax/parallax_holder.dm
@@ -9,6 +9,10 @@
* - Layers - normal layers, scroll with movement to relative position, can scroll
* - Absolute - absolute layers, scroll with movement to absolute position, cannot scroll
* - Vis - vis_contents-like model - things in this are directly applied and get no processing whatsoever. Things like overmap ships can use this.
+ *
+ * ## Known Issues
+ *
+ * Secondary map support just affixes layers. There's no way to shift them around as the eye moves automatically.
*/
/datum/parallax_holder
/// Client that owns us
diff --git a/code/game/rendering/parallax/parallax_object.dm b/code/game/rendering/parallax/parallax_object.dm
index f0ebcc637c30..813d7d121249 100644
--- a/code/game/rendering/parallax/parallax_object.dm
+++ b/code/game/rendering/parallax/parallax_object.dm
@@ -45,7 +45,10 @@
offset_y -= 480
if(offset_y < -240)
offset_y += 480
- screen_loc = "[map_id && "[map_id]:"]CENTER-7:[round(offset_x,1)],CENTER-7:[round(offset_y,1)]"
+ if(map_id)
+ screen_loc = "[map_id]:1,1"
+ else
+ screen_loc = "CENTER-7:[round(offset_x,1)],CENTER-7:[round(offset_y,1)]"
/atom/movable/screen/parallax_layer/proc/RelativePosition(x, y, rel_x, rel_y)
if(absolute)
diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm
index ea9c84849ec3..de7f55114bd5 100644
--- a/code/game/turfs/change_turf.dm
+++ b/code/game/turfs/change_turf.dm
@@ -72,19 +72,24 @@ GLOBAL_LIST_INIT(multiz_hole_baseturfs, typecacheof(list(
// Creates a new turf
// new_baseturfs can be either a single type or list of types, formated the same as baseturfs. see turf.dm
/turf/proc/ChangeTurf(path, list/new_baseturfs, flags)
+ // todo: hopefully someday we can get simulated/open to just be turf/open or something once
+ // we refactor ZAS
+ // then we can skip all this bullshit and have proper space zmimic
+ // as long as zm overhead isn't too high.
switch(path)
if(null)
return
if(/turf/baseturf_bottom)
path = SSmapping.level_baseturf(z) || /turf/space
if(!ispath(path))
- path = text2path(path)
- if (!ispath(path))
- warning("Z-level [z] has invalid baseturf '[SSmapping.level_baseturf(z)]'")
- path = /turf/space
+ stack_trace("Z-level [z] has invalid baseturf '[SSmapping.level_baseturf(z)]'")
+ path = /turf/space
if(path == /turf/space) // no space/basic check, if you use space/basic in a map honestly get bent
if(istype(GetBelow(src), /turf/simulated))
path = /turf/simulated/open
+ else if(path == /turf/simulated/open)
+ if(istype(GetBelow(src), /turf/space))
+ path = /turf/space
if(/turf/space/basic)
// basic doesn't initialize and this will cause issues
// no warning though because this can happen naturaly as a result of it being built on top of
diff --git a/code/game/turfs/simulated/flooring/_flooring.dm b/code/game/turfs/simulated/flooring/_flooring.dm
index 1f157028daa4..2774c998f058 100644
--- a/code/game/turfs/simulated/flooring/_flooring.dm
+++ b/code/game/turfs/simulated/flooring/_flooring.dm
@@ -260,6 +260,52 @@ var/list/flooring_types
icon_base = "arcade"
build_type = /obj/item/stack/tile/carpet/arcadecarpet
+/singleton/flooring/carpet/patterened/brown
+ name = "brown patterened carpet"
+ icon_base = "brown"
+ build_type = /obj/item/stack/tile/carpet/patterned/brown
+
+/singleton/flooring/carpet/patterened/red
+ name = "red patterened carpet"
+ icon_base = "red"
+ build_type = /obj/item/stack/tile/carpet/patterned/red
+
+/singleton/flooring/carpet/patterened/blue
+ name = "blue patterened carpet"
+ icon_base = "blue1"
+ build_type = /obj/item/stack/tile/carpet/patterned/blue
+
+/singleton/flooring/carpet/patterened/blue/alt
+ name = "blue patterened carpet"
+ icon_base = "blue2"
+ build_type = /obj/item/stack/tile/carpet/patterned/blue/alt
+
+/singleton/flooring/carpet/patterened/blue/alt2
+ name = "blue patterened carpet"
+ icon_base = "blue3"
+ build_type = /obj/item/stack/tile/carpet/patterned/blue/alt2
+
+/singleton/flooring/carpet/patterened/green
+ name = "green patterened carpet"
+ icon_base = "green"
+ build_type = /obj/item/stack/tile/carpet/patterned/green
+
+/singleton/flooring/carpet/patterened/magenta
+ name = "magenta patterened carpet"
+ icon_base = "magenta"
+ build_type = /obj/item/stack/tile/carpet/patterned/magenta
+
+/singleton/flooring/carpet/patterened/purple
+ name = "purple patterened carpet"
+ icon_base = "purple"
+ build_type = /obj/item/stack/tile/carpet/patterned/purple
+
+/singleton/flooring/carpet/patterened/orange
+ name = "orange patterened carpet"
+ icon_base = "orange"
+ build_type = /obj/item/stack/tile/carpet/patterned/orange
+
+
/singleton/flooring/tiling
name = "floor"
desc = "Scuffed from the passage of countless greyshirts."
diff --git a/code/game/turfs/simulated/flooring/flooring_decals.dm b/code/game/turfs/simulated/flooring/flooring_decals.dm
index 999c57e561a7..d188a7290040 100644
--- a/code/game/turfs/simulated/flooring/flooring_decals.dm
+++ b/code/game/turfs/simulated/flooring/flooring_decals.dm
@@ -528,6 +528,10 @@ var/list/floor_decals = list()
name = "spline - plain"
icon_state = "spline_plain"
+/obj/effect/floor_decal/spline/plain/corner
+ name = "spline - plain"
+ icon_state = "spline_plain_corner"
+
/obj/effect/floor_decal/spline/fancy
name = "spline - fancy"
icon_state = "spline_fancy"
diff --git a/code/game/turfs/simulated/flooring/flooring_premade.dm b/code/game/turfs/simulated/flooring/flooring_premade.dm
index 54d6cae115a4..dd0d45746c03 100644
--- a/code/game/turfs/simulated/flooring/flooring_premade.dm
+++ b/code/game/turfs/simulated/flooring/flooring_premade.dm
@@ -59,6 +59,51 @@
icon_state = "arcade"
initial_flooring = /singleton/flooring/carpet/arcadecarpet
+/turf/simulated/floor/carpet/patterened/brown
+ name = "brown patterend carpet"
+ icon_state = "brown"
+ initial_flooring = /singleton/flooring/carpet/patterened/brown
+
+/turf/simulated/floor/carpet/patterened/blue
+ name = "blue patterend carpet"
+ icon_state = "blue1"
+ initial_flooring = /singleton/flooring/carpet/patterened/blue
+
+/turf/simulated/floor/carpet/patterened/blue/alt
+ name = "blue patterend carpet"
+ icon_state = "blue2"
+ initial_flooring = /singleton/flooring/carpet/patterened/blue/alt
+
+/turf/simulated/floor/carpet/patterened/blue/alt2
+ name = "blue patterend carpet"
+ icon_state = "blue3"
+ initial_flooring = /singleton/flooring/carpet/patterened/blue/alt2
+
+/turf/simulated/floor/carpet/patterened/red
+ name = "red patterend carpet"
+ icon_state = "red"
+ initial_flooring = /singleton/flooring/carpet/patterened/red
+
+/turf/simulated/floor/carpet/patterened/green
+ name = "green patterend carpet"
+ icon_state = "green"
+ initial_flooring = /singleton/flooring/carpet/patterened/green
+
+/turf/simulated/floor/carpet/patterened/magneta
+ name = "magenta patterend carpet"
+ icon_state = "magenta"
+ initial_flooring = /singleton/flooring/carpet/patterened/magenta
+
+/turf/simulated/floor/carpet/patterened/purple
+ name = "purple patterend carpet"
+ icon_state = "purple"
+ initial_flooring = /singleton/flooring/carpet/patterened/purple
+
+/turf/simulated/floor/carpet/patterened/orange
+ name = "orange patterend carpet"
+ icon_state = "orange"
+ initial_flooring = /singleton/flooring/carpet/patterened/orange
+
/turf/simulated/floor/bluegrid
name = "mainframe floor"
icon = 'icons/turf/flooring/circuit.dmi'
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 3e776a064e93..84c2615ccace 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -566,12 +566,7 @@
return TRUE
return FALSE
-//? Radiation
-
-/turf/proc/update_rad_insulation()
- rad_insulation_contents = 1
-
-//? atom color - we don't use the expensive system.
+//? Atom Color - we don't use the expensive system.
/turf/get_atom_colour()
return color
@@ -589,3 +584,20 @@
if(isnull(other.color))
return
color = other.color
+
+//? Depth
+
+/**
+ * gets overall depth level for stuff standing on us
+ */
+/turf/proc/depth_level()
+ . = 0
+ for(var/obj/O in src)
+ if(!O.depth_projected)
+ continue
+ . = max(., O.depth_level)
+
+//? Radiation
+
+/turf/proc/update_rad_insulation()
+ rad_insulation_contents = 1
diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm
index 8d77343171f4..6db0948469d2 100644
--- a/code/modules/admin/verbs/buildmode.dm
+++ b/code/modules/admin/verbs/buildmode.dm
@@ -363,8 +363,7 @@ GLOBAL_LIST_EMPTY(buildholders)
var/obj/structure/window/reinforced/WIN = new/obj/structure/window/reinforced(get_turf(object))
WIN.setDir(WEST)
if(NORTHWEST)
- var/obj/structure/window/reinforced/WIN = new/obj/structure/window/reinforced(get_turf(object))
- WIN.setDir(NORTHWEST)
+ new /obj/spawner/window/reinforced/full(get_turf(object))
var/turf/TC = get_turf(object)
log_admin("[key_name(usr)] made a window at [COORD(TC)]")
if(2) // Adv. Build
diff --git a/code/modules/atmospherics/machinery/machinery.dm b/code/modules/atmospherics/machinery/machinery.dm
index 0db1aeffbf93..dfe8bf9a6383 100644
--- a/code/modules/atmospherics/machinery/machinery.dm
+++ b/code/modules/atmospherics/machinery/machinery.dm
@@ -20,6 +20,8 @@ Pipelines + Other Objects -> Pipe network
// why block contents? so you ventcrawling little fucks don't pull a 2020 Citadel Main.
rad_flags = RAD_BLOCK_CONTENTS | RAD_NO_CONTAMINATE
atom_colouration_system = FALSE
+ climb_allowed = FALSE
+ depth_projected = FALSE
///The color of the pipe
var/pipe_color
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index dbe25654c5d1..0aa95a12e929 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -381,6 +381,13 @@
icon_state = "hostrench"
inv_hide_flags = HIDEHOLSTER
+/obj/item/clothing/suit/storage/vest/hoscoat/combatcoat
+ name = "security combat coat"
+ desc = "A heavily armored vest worn under a thick coat. The gold embroidery suggests whoever wears this possesses a high rank."
+ icon_state = "hoscombatcoat"
+ blood_overlay_type = "armor"
+ valid_accessory_slots = null
+
/obj/item/clothing/suit/storage/vest/pcrc
name = "PCRC armor vest"
desc = "A simple kevlar vest belonging to Proxima Centauri Risk Control. This one has a PCRC crest clipped to the chest."
@@ -592,13 +599,6 @@
siemens_coefficient = 0.6
valid_accessory_slots = null
-/obj/item/clothing/suit/armor/combat/syndicate
- name = "syndicate combat vest"
- desc = "A heavily armored vest worn over a thick coat. The gold embroidery suggests whoever wears this possesses a high rank."
- icon_state = "syndievest"
- blood_overlay_type = "armor"
- valid_accessory_slots = null
-
//Modular plate carriers
/obj/item/clothing/suit/armor/pcarrier
name = "plate carrier"
@@ -810,12 +810,6 @@
to_chat(H,"You need to have a wolf-taur half to wear this.")
return FALSE
-/obj/item/clothing/suit/storage/vest/hoscoat/jensen
- name = "armored trenchcoat"
- desc = "A trenchcoat augmented with a special alloy for some protection and style."
- icon_state = "hostrench"
- inv_hide_flags = HIDEHOLSTER
-
/obj/item/clothing/suit/storage/vest/oricon
name = "\improper Orion Confederation Government armored vest"
desc = "A synthetic armor vest. This one is marked with the crest of the Orion Confederation Group."
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index c8a75aed338f..6edf6b4af8fa 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -988,10 +988,12 @@
/obj/item/clothing/suit/varsity
name = "black varsity jacket"
desc = "A favorite of jocks everywhere from Sol to Nyx."
+ icon = 'icons/clothing/suit/jackets/varsity.dmi'
icon_state = "varsity"
allowed = list (/obj/item/pen, /obj/item/paper, /obj/item/flashlight,/obj/item/tank/emergency/oxygen, /obj/item/storage/fancy/cigarettes, /obj/item/storage/box/matches, /obj/item/reagent_containers/food/drinks/flask)
item_state_slots = list(SLOT_ID_RIGHT_HAND = "suit_black", SLOT_ID_LEFT_HAND = "suit_black")
inv_hide_flags = HIDETIE|HIDEHOLSTER
+ worn_render_flags = WORN_RENDER_SLOT_ONE_FOR_ALL
/obj/item/clothing/suit/varsity/red
name = "red varsity jacket"
@@ -1454,10 +1456,19 @@
icon_state = "centcomformal_f"
//Someone's on the line.
-/obj/item/clothing/suit/storage/toggle/letterman
+/obj/item/clothing/suit/storage/toggle/varsity
name = "worn letterman jacket"
desc = "A worn varsity letterman jacket. Some of the faded stains around the cuffs are rather suspicious."
+ icon = 'icons/clothing/suit/jackets/varsity.dmi'
icon_state = "varsity_letterman"
+ inv_hide_flags = HIDEHOLSTER
+ worn_render_flags = WORN_RENDER_SLOT_ONE_FOR_ALL
+
+/obj/item/clothing/suit/storage/toggle/varsity/worn
+ name = "well-worn varsity jacket"
+ desc = "A worn varsity jacket. The NanoTrasen corporate logo on the back is outdated, suggesting the age of this coat."
+ icon_state = "varsity_worn"
+ allowed = list(/obj/item/gun/ballistic/sec/flash, /obj/item/tank/emergency/oxygen, /obj/item/flashlight,/obj/item/gun/energy,/obj/item/gun/ballistic,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/handcuffs,/obj/item/storage/fancy/cigarettes,/obj/item/flame/lighter,/obj/item/tape_recorder,/obj/item/uv_light)
/obj/item/clothing/suit/storage/pullover
name = "pullover hoodie"
diff --git a/code/modules/events/meteor_strike_vr.dm b/code/modules/events/meteor_strike_vr.dm
index a65c3e3f7544..4c306f10bce2 100644
--- a/code/modules/events/meteor_strike_vr.dm
+++ b/code/modules/events/meteor_strike_vr.dm
@@ -77,8 +77,9 @@
desc = "A big hunk of star-stuff."
icon = 'icons/obj/meteor.dmi'
icon_state = "large"
- density = 1
- climbable = 1
+ density = TRUE
+ climb_allowed = TRUE
+ depth_level = 16
/obj/structure/meteorite/Initialize(mapload)
. = ..()
diff --git a/code/modules/food/kitchen/smartfridge.dm b/code/modules/food/kitchen/smartfridge.dm
index a3f79d0cf965..0a531eeaf693 100644
--- a/code/modules/food/kitchen/smartfridge.dm
+++ b/code/modules/food/kitchen/smartfridge.dm
@@ -37,6 +37,7 @@
wires = new/datum/wires/smartfridge/secure(src)
else
wires = new/datum/wires/smartfridge(src)
+ update_icon()
/obj/machinery/smartfridge/Destroy()
AIR_UPDATE_ON_DESTROY_AUTO
diff --git a/code/modules/holomap/station_holomap.dm b/code/modules/holomap/station_holomap.dm
index 7d4ceb7f7b3b..d1f740418da1 100644
--- a/code/modules/holomap/station_holomap.dm
+++ b/code/modules/holomap/station_holomap.dm
@@ -6,12 +6,14 @@
desc = "A virtual map of the surrounding station."
icon = 'icons/obj/machines/stationmap.dmi'
icon_state = "station_map"
- anchored = 1
- density = 0
+ anchored = TRUE
+ density = FALSE
use_power = USE_POWER_IDLE
idle_power_usage = 10
active_power_usage = 500
circuit = /obj/item/circuitboard/station_map
+ depth_projected = FALSE
+ climb_allowed = FALSE
// TODO - Port use_auto_lights from /vg - for now declare here
var/use_auto_lights = 1
diff --git a/code/modules/mining/mine_outcrops.dm b/code/modules/mining/mine_outcrops.dm
index aeaa981eda9c..3cf2bc1c7bd4 100644
--- a/code/modules/mining/mine_outcrops.dm
+++ b/code/modules/mining/mine_outcrops.dm
@@ -4,7 +4,8 @@
icon = 'icons/obj/outcrop.dmi'
density = TRUE
pass_flags_self = ATOM_PASS_THROWN | ATOM_PASS_OVERHEAD_THROW
- climbable = TRUE
+ climb_allowed = TRUE
+ depth_level = 12
anchored = TRUE
icon_state = "outcrop"
var/mindrop = 5
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 50b762dfef8a..f21a67fc0b02 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -8,6 +8,7 @@
/mob/living
see_invisible = SEE_INVISIBLE_LIVING
movable_flags = MOVABLE_NO_THROW_SPIN | MOVABLE_NO_THROW_DAMAGE_SCALING | MOVABLE_NO_THROW_SPEED_SCALING
+ buckle_flags = BUCKLING_PROJECTS_DEPTH
//* Health and life related vars *//
/// Maximum health that should be possible. Avoid adjusting this if you can, and instead use modifiers datums.
@@ -144,3 +145,9 @@
var/getting_up_penalized
/// last delay before modifications while getting up - used by resist_a_rest, so reducing damage / whatever doesn't leave you with the same delay
var/getting_up_original
+
+ //? movement
+ /// current depth on turf in pixels
+ var/depth_current = 0
+ /// set during move: staged depth; on successful move, we update depth_current if it's different.
+ var/tmp/depth_staged = 0
diff --git a/code/modules/mob/living/movement.dm b/code/modules/mob/living/movement.dm
index 7e8dc3978444..e7c3aa5f340f 100644
--- a/code/modules/mob/living/movement.dm
+++ b/code/modules/mob/living/movement.dm
@@ -8,15 +8,26 @@
if(MOVE_INTENT_WALK)
. += config_legacy.walk_speed
+// todo: all this depth staged stuff is stupid and it should all be on /turf and cached someday
+// this is however, faster, so that'll be a very long 'someday'.
+
/mob/living/Move(atom/newloc, direct, glide_size_override)
+ depth_staged = 0
if(buckled && buckled.loc != newloc)
return FALSE
- return ..()
+ . = ..()
+ depth_staged = null
-/mob/living/Moved()
+/mob/living/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change)
. = ..()
if(s_active && !CheapReachability(s_active))
s_active.close(src)
+ if(forced && isnull(depth_staged) && isturf(loc))
+ var/turf/T = loc
+ depth_staged = T.depth_level()
+ if(!isnull(depth_staged))
+ change_depth(depth_staged)
+ depth_staged = null
/mob/living/forceMove(atom/destination)
if(buckled && (buckled.loc != destination))
@@ -44,6 +55,16 @@
return TRUE
return ..()
+/mob/living/CanPassThrough(atom/blocker, turf/target, blocker_opinion)
+ . = ..()
+ if(isobj(blocker))
+ var/obj/O = blocker
+ if(O.depth_projected)
+ // FINE ILL USE UNLINT INSTEAD OF REMOVE PURITY
+ UNLINT(depth_staged = max(depth_staged, O.depth_level))
+ if(!(O.obj_flags & OBJ_IGNORE_MOB_DEPTH) && O.depth_level <= depth_current)
+ return TRUE
+
/mob/living/can_cross_under(atom/movable/mover)
if(isliving(mover))
var/mob/living/L = mover
@@ -84,6 +105,8 @@
return FALSE
return TRUE
+//? Bumping / Crawling
+
/mob/living/Bump(atom/A)
var/skip_atom_bump_handling
if(throwing)
@@ -357,3 +380,21 @@
// restore dir if needed
if(their_dir)
pushing.setDir(their_dir)
+
+//? Depth
+
+/mob/living/proc/change_depth(new_depth)
+ // depth is propagated up/down our buckled objects, and overridden by what we're buckled to
+ if(isliving(buckled) && (buckled.buckle_flags & BUCKLING_PROJECTS_DEPTH))
+ var/mob/living/L = buckled
+ new_depth = L.depth_current
+ else if(isobj(buckled) && (buckled.buckle_flags & BUCKLING_PROJECTS_DEPTH))
+ var/obj/O = buckled
+ new_depth = O.depth_level
+ if(new_depth == depth_current)
+ return
+ . = new_depth - depth_current
+ depth_current = new_depth
+ pixel_y += .
+ for(var/mob/living/L in buckled_mobs)
+ L.change_depth(new_depth)
diff --git a/code/modules/mob/living/silicon/pai/defense.dm b/code/modules/mob/living/silicon/pai/defense.dm
index cb29a48f0c3a..d1472a204b43 100644
--- a/code/modules/mob/living/silicon/pai/defense.dm
+++ b/code/modules/mob/living/silicon/pai/defense.dm
@@ -16,6 +16,37 @@
else if(istype(W, /obj/item/card/id) && idaccessible == 0)
to_chat(user, "[src] is not accepting access modifcations at this time.")
return
+ else if(istype(W, /obj/item/clothing))
+ var/obj/item/clothing/C = W
+ var/new_base_uploaded_path
+ if(C.slot_flags & SLOT_HEAD)
+ new_base_uploaded_path = /obj/item/clothing/head
+ if(C.slot_flags & SLOT_ICLOTHING)
+ new_base_uploaded_path = /obj/item/clothing/under
+ if(C.slot_flags & SLOT_EYES)
+ new_base_uploaded_path = /obj/item/clothing/glasses
+ if(C.slot_flags & SLOT_GLOVES)
+ new_base_uploaded_path = /obj/item/clothing/gloves
+ if(C.slot_flags & SLOT_MASK)
+ new_base_uploaded_path = /obj/item/clothing/mask
+ if(C.slot_flags & SLOT_FEET)
+ new_base_uploaded_path = /obj/item/clothing/shoes
+ if(C.slot_flags & SLOT_OCLOTHING)
+ new_base_uploaded_path = /obj/item/clothing/suit
+
+ if(new_base_uploaded_path != null)
+ base_uploaded_path = new_base_uploaded_path
+ last_uploaded_path = W.type
+
+ var/obj/item/clothing/under/U = C
+ if(istype(U))
+ uploaded_snowflake_worn_state = U.snowflake_worn_state
+ uploaded_color = W.get_atom_colour()
+
+ to_chat(user, "You successfully upload the [W.name] to [src].")
+ to_chat(src, "[user] has successfully uploaded the [W.name] to you.")
+
+ return
else
. = ..()
diff --git a/code/modules/mob/living/silicon/pai/mobility.dm b/code/modules/mob/living/silicon/pai/mobility.dm
index 5a026c9b307f..e2c1a31b5ed9 100644
--- a/code/modules/mob/living/silicon/pai/mobility.dm
+++ b/code/modules/mob/living/silicon/pai/mobility.dm
@@ -1,36 +1,35 @@
/mob/living/silicon/pai/restrained()
- if(istype(src.loc,/obj/item/paicard))
+ if(src.loc == shell)
return FALSE
..()
-//I'm not sure how much of this is necessary, but I would rather avoid issues.
/mob/living/silicon/pai/proc/close_up()
+ // we can't close up if already inside our shell
+ if(src.loc == shell)
+ return
- last_special = world.time + 20
+ // we check mobility here to stop people folding up if they currently cannot move
+ if(!CHECK_MOBILITY(src, MOBILITY_CAN_MOVE))
+ return
- if(src.loc == card)
+ if(!can_action())
return
- release_vore_contents()
+ last_special = world.time + 20
- var/turf/T = get_turf(src)
- if(istype(T))
- T.visible_message("[src] neatly folds inwards, compacting down to a rectangular card.")
+ release_vore_contents()
stop_pulling()
- //stop resting
- resting = FALSE
-
// If we are being held, handle removing our holder from their inv.
var/obj/item/holder/H = loc
if(istype(H))
H.forceMove(get_turf(src))
forceMove(get_turf(src))
- // Move us into the card and move the card to the ground.
- card.forceMove(loc)
- forceMove(card)
+ // Move us into the shell and move the shell to the ground.
+ transform_component.put_in_object()
+
update_perspective()
set_resting(FALSE)
update_mobility()
@@ -40,34 +39,37 @@
/mob/living/silicon/pai/proc/open_up()
last_special = world.time + 20
- //I'm not sure how much of this is necessary, but I would rather avoid issues.
- if(istype(card.loc,/obj/item/hardsuit_module))
+ // stops unfolding in hardsuits and vore bellies, if implanted you explode out
+ if(istype(shell.loc,/obj/item/hardsuit_module))
to_chat(src, "There is no room to unfold inside this hardsuit module. You're good and stuck.")
return FALSE
- else if(istype(card.loc,/mob))
- var/mob/holder = card.loc
- var/datum/belly/inside_belly = check_belly(card)
+ else if(istype(shell.loc,/mob))
+ var/mob/holder = shell.loc
+ var/datum/belly/inside_belly = check_belly(shell)
if(inside_belly)
to_chat(src, "There is no room to unfold in here. You're good and stuck.")
return FALSE
if(ishuman(holder))
var/mob/living/carbon/human/H = holder
for(var/obj/item/organ/external/affecting in H.organs)
- if(card in affecting.implants)
+ if(shell in affecting.implants)
affecting.take_damage(rand(30,50))
- affecting.implants -= card
+ affecting.implants -= shell
H.visible_message("\The [src] explodes out of \the [H]'s [affecting.name] in shower of gore!")
break
- holder.drop_item_to_ground(card, INV_OP_FORCE)
- else if(istype(card.loc,/obj/item/pda))
- var/obj/item/pda/holder = card.loc
+ holder.drop_item_to_ground(shell, INV_OP_FORCE)
+ else if(istype(shell.loc,/obj/item/pda))
+ var/obj/item/pda/holder = shell.loc
holder.pai = null
- forceMove(card.loc)
- card.forceMove(src)
+ // handle the actual object stuffing via the component
+ transform_component.put_in_mob()
+
update_perspective()
- card.screen_loc = null
+ var/obj/item/paicard/card = shell
+ if(istype(card))
+ card.screen_loc = null
var/turf/T = get_turf(src)
if(istype(T))
@@ -106,9 +108,21 @@
// space movement (we get one ion burst every 3 seconds)
/mob/living/silicon/pai/Process_Spacemove(movement_dir = NONE)
. = ..()
- if(!.)
+ if(!. && src.loc != shell)
if(world.time >= last_space_movement + 30)
last_space_movement = world.time
// place an effect for the movement
new /obj/effect/temp_visual/pai_ion_burst(get_turf(src))
return TRUE
+
+/mob/living/silicon/pai/proc/can_change_shell()
+ if(istype(src.loc, /mob))
+ to_chat(src, "You're not able to change your shell while being held.")
+ return FALSE
+ if(stat != CONSCIOUS)
+ return FALSE
+ if(!can_action())
+ return FALSE
+ if(!CHECK_MOBILITY(src, MOBILITY_CAN_MOVE))
+ return FALSE
+ return TRUE
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index e9c28af19137..a0cf368c6092 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -45,7 +45,8 @@
var/ram = 100 // Used as currency to purchase different abilities
var/list/software = list()
var/userDNA // The DNA string of our assigned user
- var/obj/item/paicard/card // The card we inhabit
+ var/obj/item/shell // The shell we inhabit
+ var/obj/item/paicard/card // The card we belong to, it is not always our shell, but it is linked to us regardless
var/obj/item/radio/radio // Our primary radio
var/obj/item/communicator/integrated/communicator // Our integrated communicator.
var/obj/item/pda/ai/pai/pda = null // Our integrated PDA
@@ -74,6 +75,17 @@
"Canine" = list("yaps","barks","woofs"),
)
+ // shell transformation
+ var/global/list/possible_clothing_options = list(
+ "Maid Costume" = /obj/item/clothing/under/dress/maid/sexy,
+ "Grey Pleated Skirt" = /obj/item/clothing/under/color/grey_skirt,
+ "Last Uploaded Clothing" = null,
+ )
+ var/obj/item/clothing/last_uploaded_path
+ var/obj/item/clothing/base_uploaded_path
+ var/uploaded_snowflake_worn_state
+ var/uploaded_color
+
/// The cable we produce and use when door or camera jacking.
var/obj/item/pai_cable/cable
@@ -105,14 +117,20 @@
// space movement related
var/last_space_movement = 0
+ // transformation component
+ var/datum/component/object_transform/transform_component
+
/mob/living/silicon/pai/Initialize(mapload)
. = ..()
- card = loc
+ shell = loc
+ if(istype(shell, /obj/item/paicard))
+ card = loc
sradio = new(src)
communicator = new(src)
- if(card)
- if(!card.radio)
- card.radio = new /obj/item/radio(src.card)
+ if(shell)
+ transform_component = AddComponent(/datum/component/object_transform, shell, "neatly folds inwards, compacting down to a rectangular card", "folds outwards, expanding into a mobile form.")
+ if(card && !card.radio)
+ card.radio = new /obj/item/radio(src.card)
radio = card.radio
add_verb(src, /mob/living/silicon/pai/proc/choose_chassis)
@@ -199,3 +217,48 @@
new_people_eaten += M.size_multiplier
people_eaten = min(1, new_people_eaten)
+// changing the shell
+/mob/living/silicon/pai/proc/switch_shell(obj/item/new_shell)
+ // setup transform text
+ if(istype(new_shell, /obj/item/paicard))
+ transform_component.to_object_text = "neatly folds inwards, compacting down to a rectangular card"
+ else
+ transform_component.to_object_text = "neatly folds inwards, compacting down into their shell"
+
+ // swap the shell, if the old shell is our card we keep it, otherwise we delete it because it's not important
+ shell = new_shell
+ var/obj/item/old_shell = transform_component.swap_object(new_shell)
+ if(istype(old_shell, /obj/item/paicard))
+ old_shell.forceMove(src)
+ else
+ QDEL_NULL(old_shell)
+
+ // some sanity stuff because this is also putting us inside an object so we want to interrupt a couple of possible things such as pulling, resting, eating, viewing camera
+ release_vore_contents()
+ stop_pulling()
+ update_perspective()
+ set_resting(FALSE)
+ update_mobility()
+ remove_verb(src, /mob/living/silicon/pai/proc/pai_nom)
+
+ // pass attack self on to the card regardless of our shell
+ if(!istype(new_shell, /obj/item/paicard))
+ RegisterSignal(shell, COMSIG_ITEM_ATTACK_SELF, .proc/pass_attack_self_to_card)
+
+// changing the shell into clothing
+/mob/living/silicon/pai/proc/change_shell_by_path(object_path)
+ if(!can_change_shell())
+ return FALSE
+
+ last_special = world.time + 20
+
+ var/obj/item/new_object = new object_path
+ new_object.name = "[src.name] (pAI)"
+ new_object.desc = src.desc
+ new_object.forceMove(src.loc)
+ switch_shell(new_object)
+ return TRUE
+
+/mob/living/silicon/pai/proc/pass_attack_self_to_card()
+ if(istype(shell.loc, /mob/living/carbon))
+ card.attack_self(shell.loc)
diff --git a/code/modules/mob/living/silicon/pai/verbs.dm b/code/modules/mob/living/silicon/pai/verbs.dm
index 2c214ff9ea86..85282fe43eba 100644
--- a/code/modules/mob/living/silicon/pai/verbs.dm
+++ b/code/modules/mob/living/silicon/pai/verbs.dm
@@ -7,7 +7,7 @@
if(!can_action())
return
// to fold out we need to be in the card
- if(src.loc != card)
+ if(src.loc != shell)
return
open_up()
@@ -22,7 +22,7 @@
if(!can_action())
return
// to fold up we need to not be in the card already
- if(src.loc == card)
+ if(src.loc == shell)
return
close_up()
@@ -66,7 +66,7 @@
set category = "IC"
// Pass lying down or getting up to our pet human, if we're in a hardsuit.
- if(istype(src.loc,/obj/item/paicard))
+ if(src.loc == shell)
set_resting(FALSE)
var/obj/item/hardsuit/hardsuit = src.get_hardsuit()
if(istype(hardsuit))
@@ -115,3 +115,45 @@
if (stat != CONSCIOUS)
return
return feed_grabbed_to_self(src,T)
+
+/mob/living/silicon/pai/verb/change_shell_clothing()
+ set name = "pAI Clothing"
+ set category = "pAI Commands"
+ set desc = "Allows you to transform your shell into clothing."
+
+ if(!can_change_shell())
+ return
+
+ var/clothing_entry = input(usr, "What clothing would you like to change your shell to?") as null|anything in possible_clothing_options
+ if(clothing_entry)
+ if(clothing_entry != "Last Uploaded Clothing")
+ change_shell_by_path(possible_clothing_options[clothing_entry])
+ else
+ if(last_uploaded_path && can_change_shell())
+ last_special = world.time + 20
+ var/state = initial(last_uploaded_path.icon_state)
+ var/icon = initial(last_uploaded_path.icon)
+ var/obj/item/clothing/new_clothing = new base_uploaded_path
+ new_clothing.forceMove(src.loc)
+ new_clothing.name = "[src.name] (pAI)"
+ new_clothing.desc = src.desc
+ new_clothing.icon = icon
+ new_clothing.icon_state = state
+ new_clothing.add_atom_colour(uploaded_color, FIXED_COLOUR_PRIORITY)
+
+ var/obj/item/clothing/under/U = new_clothing
+ if(istype(U))
+ U.snowflake_worn_state = uploaded_snowflake_worn_state
+
+ switch_shell(new_clothing)
+
+/mob/living/silicon/pai/verb/revert_shell_to_card()
+ set name = "Reset Shell"
+ set category = "pAI Commands"
+ set desc = "Reverts your shell back to card form."
+
+ if(!can_change_shell())
+ return
+ if(!card || card.loc != src || card == shell)
+ return
+ switch_shell(card)
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 6e03e78d6c80..3fdd8a484f74 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -635,3 +635,11 @@ var/list/global/organ_rel_size = list(
. = JOINTEXT(.)
if(re_encode)
. = html_encode(.)
+
+/// if sufficent nutrition is present, take it and return true, otherwise just return false
+/mob/proc/try_take_nutrition(var/amount)
+ if(nutrition >= amount)
+ nutrition = nutrition - amount
+ return TRUE
+ else
+ return FALSE
diff --git a/code/modules/mob/movement.dm b/code/modules/mob/movement.dm
index ab0cb5a37742..a1d8a8784a62 100644
--- a/code/modules/mob/movement.dm
+++ b/code/modules/mob/movement.dm
@@ -519,14 +519,15 @@
// Called when a mob successfully moves.
// Would've been an /atom/movable proc but it caused issues.
-/mob/Moved(atom/oldloc)
+/mob/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change)
. = ..()
client?.parallax_holder?.Update()
for(var/obj/O in contents)
- O.on_loc_moved(oldloc)
+ O.on_loc_moved(old_loc)
reset_pixel_shifting()
// Received from Moved(), useful for items that need to know that their loc just moved.
+// todo: REMOVE, this is bad for performance.
/obj/proc/on_loc_moved(atom/oldloc)
return
diff --git a/code/modules/mob/observer/dead/orbit.dm b/code/modules/mob/observer/dead/orbit.dm
index 37450a1a736c..3e18d7566315 100644
--- a/code/modules/mob/observer/dead/orbit.dm
+++ b/code/modules/mob/observer/dead/orbit.dm
@@ -64,6 +64,10 @@
npcs += list(serialized)
else
players += list(serialized)
+ else if(isrobot(M))
+ players += list(serialized)
+ else if(isAI(M))
+ players += list(serialized)
data["players"] = players
data["simplemobs"] = simplemobs
diff --git a/code/modules/multiz/structures.dm b/code/modules/multiz/structures.dm
index 9fe6bd1c69dc..e14fd0f798a2 100644
--- a/code/modules/multiz/structures.dm
+++ b/code/modules/multiz/structures.dm
@@ -192,7 +192,7 @@
icon_state = "stair_u"
opacity = TRUE
density = TRUE // Too high to simply step up on
- climbable = TRUE // But they can be climbed if the bottom is out
+ climb_allowed = TRUE
var/obj/structure/stairs/top/top = null
var/obj/structure/stairs/bottom/bottom = null
@@ -265,7 +265,7 @@
/obj/structure/stairs/middle/MouseDroppedOnLegacy(mob/target, mob/user)
. = ..()
if(check_integrity())
- do_climb(user)
+ do_climb_on(user)
transition_atom(user, get_turf(top)) // You can't really drag things when you have to climb up the gap in the stairs yourself
/obj/structure/stairs/middle/Bumped(mob/user)
diff --git a/code/modules/multiz/zmimic/mimic_movable.dm b/code/modules/multiz/zmimic/mimic_movable.dm
index fd891c0ac6bd..0bccce61e87e 100644
--- a/code/modules/multiz/zmimic/mimic_movable.dm
+++ b/code/modules/multiz/zmimic/mimic_movable.dm
@@ -104,7 +104,7 @@
name = "openspace multiplier"
desc = "You shouldn't see this."
icon = LIGHTING_ICON
- icon_state = LIGHTING_DARKNESS_ICON_STATE
+ icon_state = "blank"
plane = OPENTURF_MAX_PLANE
layer = MIMICED_LIGHTING_LAYER_MAIN
blend_mode = BLEND_MULTIPLY
diff --git a/code/modules/organs/internal/species/xenos.dm b/code/modules/organs/internal/species/xenos.dm
index f5314af880b4..8e41b7aab955 100644
--- a/code/modules/organs/internal/species/xenos.dm
+++ b/code/modules/organs/internal/species/xenos.dm
@@ -130,11 +130,17 @@
icon_state = "xenode"
organ_tag = O_RESIN
- /*organ_verbs = list(
+ organ_verbs = list(
/mob/living/carbon/human/proc/resin,
/mob/living/carbon/human/proc/plant
)
- edit because the xenos that use it have the verbs anyways and hybrids dont want the plant verb*/
+
+/obj/item/organ/internal/xenos/resinspinner/hybrid
+ name = "weakend resinspinner"
+ organ_verbs = list(
+ /mob/living/carbon/human/proc/hybrid_resin,
+ /mob/living/carbon/human/proc/hybrid_plant//replaced from the normal weed node to place a singular weed
+ )
/obj/item/organ/internal/xenos/resinspinner/grey
icon_state = "xenode_grey"
@@ -148,3 +154,8 @@
var/mob/living/carbon/human/H = owner
if(H.species.blood_color)
add_atom_colour(H.species.blood_color, FIXED_COLOUR_PRIORITY)
+
+/obj/item/organ/internal/heart/xenomorph
+ name = "xenomorph heart"
+
+
diff --git a/code/modules/overmap/legacy/ships/computers/helm.dm b/code/modules/overmap/legacy/ships/computers/helm.dm
index e90886ee0c12..c1a1c019300b 100644
--- a/code/modules/overmap/legacy/ships/computers/helm.dm
+++ b/code/modules/overmap/legacy/ships/computers/helm.dm
@@ -282,7 +282,9 @@ GLOBAL_LIST_EMPTY(all_waypoints)
icon_keyboard = null
icon_screen = null
circuit = /obj/item/circuitboard/nav/tele
- density = 0
+ density = FALSE
+ depth_projected = FALSE
+ climb_allowed = FALSE
/obj/machinery/computer/ship/navigation/telescreen/update_icon()
if(machine_stat & NOPOWER || machine_stat & BROKEN)
diff --git a/code/modules/overmap/legacy/spacetravel.dm b/code/modules/overmap/legacy/spacetravel.dm
index 396b37cb5eef..e28e4a88668c 100644
--- a/code/modules/overmap/legacy/spacetravel.dm
+++ b/code/modules/overmap/legacy/spacetravel.dm
@@ -124,6 +124,11 @@ var/list/cached_space = list()
ny = TRANSITIONEDGE + 2
nx = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2)
+ nz = SAFEPICK(M.map_z)
+ if(!isnull(nz))
+ A.forceMove(locate(nx, ny, nz))
+ return
+
testing("[A] spacemoving from [M] ([M.x], [M.y]).")
var/turf/map = locate(M.x,M.y,(LEGACY_MAP_DATUM).overmap_z)
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index ca571af5932b..94b33e7ee10b 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -480,8 +480,6 @@ GLOBAL_LIST_EMPTY(apcs)
// update the APC icon to show the three base states
// also add overlays for indicator lights
/obj/machinery/power/apc/update_icon()
-
-
if (!status_overlays)
status_overlays = 1
status_overlays_lock = new
@@ -542,8 +540,7 @@ GLOBAL_LIST_EMPTY(apcs)
cut_overlays()
if(update & 2)
- if(overlays.len)
- overlays.Cut()
+ cut_overlays()
if(!(machine_stat & (BROKEN|MAINT)) && update_state & UPDATE_ALLGOOD)
add_overlay(status_overlays_lock[locked+1])
add_overlay(status_overlays_charging[charging+1])
diff --git a/code/modules/power/pacman2.dm b/code/modules/power/pacman2.dm
deleted file mode 100644
index 85f4d0f14345..000000000000
--- a/code/modules/power/pacman2.dm
+++ /dev/null
@@ -1,173 +0,0 @@
-//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:05
-
-
-//PACMAN variant that can run on the small plasma tanks.
-//a true relic of code history.
-/obj/machinery/power/port_gen/pacman2
- name = "Pacman II"
- desc = "P.A.C.M.A.N. type II portable generator. Uses liquid phoron as a fuel source."
- power_gen = 4500
- var/obj/item/tank/phoron/P = null
- var/board_path = "/obj/item/circuitboard/pacman2"
- var/emagged = 0
- var/heat = 0
-/*
- process()
- if(P)
- if(P.air_contents.phoron <= 0)
- P.air_contents.phoron = 0
- eject()
- else
- P.air_contents.phoron -= 0.001
- return
-*/
-
- HasFuel()
- if(P.air_contents.phoron >= 0.1)
- return 1
- return 0
-
- UseFuel()
- P.air_contents.phoron -= 0.01
- return
-
- New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/stock_parts/matter_bin(src)
- component_parts += new /obj/item/stock_parts/micro_laser(src)
- component_parts += new /obj/item/stack/cable_coil(src)
- component_parts += new /obj/item/stack/cable_coil(src)
- component_parts += new /obj/item/stock_parts/capacitor(src)
- component_parts += new board_path(src)
- RefreshParts()
-
- RefreshParts()
- var/temp_rating = 0
- for(var/obj/item/stock_parts/SP in component_parts)
- if(istype(SP, /obj/item/stock_parts/matter_bin))
- //max_coins = SP.rating * SP.rating * 1000
- else if(istype(SP, /obj/item/stock_parts/micro_laser) || istype(SP, /obj/item/stock_parts/capacitor))
- temp_rating += SP.rating
- power_gen = round(initial(power_gen) * (max(2, temp_rating) / 2))
-
- examine(mob/user, dist)
- . = ..()
- . += "The generator has [P.air_contents.phoron] units of fuel left, producing [power_gen] per cycle."
-
- handleInactive()
- heat -= 2
- if (heat < 0)
- heat = 0
- else
- for(var/mob/M in viewers(1, src))
- if (M.client && M.machine == src)
- src.updateUsrDialog()
-
- proc
- overheat()
- explosion(get_turf(src), 2, 5, 2, -1)
-
- attackby(var/obj/item/O as obj, var/mob/user as mob)
- if(istype(O, /obj/item/tank/phoron))
- if(P)
- to_chat(user, "The generator already has a phoron tank loaded!")
- return
- P = O
- user.drop_item()
- O.loc = src
- to_chat(user, "You add the phoron tank to the generator.")
- else if(!active)
- if(O.is_wrench())
- anchored = !anchored
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- if(anchored)
- to_chat(user, "You secure the generator to the floor.")
- else
- to_chat(user, "You unsecure the generator from the floor.")
- SSmachines.makepowernets()
- else if(O.is_screwdriver())
- open = !open
- playsound(loc, O.tool_sound, 50, 1)
- if(open)
- to_chat(user, "You open the access panel.")
- else
- to_chat(user, "You close the access panel.")
- else if(O.is_crowbar() && !open)
- playsound(loc, O.tool_sound, 50, 1)
- var/obj/machinery/constructable_frame/machine_frame/new_frame = new /obj/machinery/constructable_frame/machine_frame(src.loc)
- for(var/obj/item/I in component_parts)
- I.loc = src.loc
- new_frame.state = 2
- new_frame.icon_state = "box_1"
- qdel(src)
-
- attack_hand(mob/user as mob)
- ..()
- if (!anchored)
- return
-
- interact(user)
-
- attack_ai(mob/user as mob)
- interact(user)
-
- attack_paw(mob/user as mob)
- interact(user)
-
- proc
- interact(mob/user)
- if (get_dist(src, user) > 1 )
- if (!istype(user, /mob/living/silicon/ai))
- user.machine = null
- user << browse(null, "window=port_gen")
- return
-
- user.machine = src
-
- var/dat = "[name]
"
- if (active)
- dat += "Generator: On
"
- else
- dat += "Generator: Off
"
- if(P)
- dat += "Currently loaded phoron tank: [P.air_contents.phoron]
"
- else
- dat += "No phoron tank currently loaded.
"
- dat += "Power output: - [power_gen * power_output] +
"
- dat += "Heat: [heat]
"
- dat += "
Close"
- user << browse("[dat]", "window=port_gen")
-
- Topic(href, href_list)
- if(..())
- return
-
- src.add_fingerprint(usr)
- if(href_list["action"])
- if(href_list["action"] == "enable")
- if(!active && HasFuel())
- active = 1
- icon_state = "portgen1"
- src.updateUsrDialog()
- if(href_list["action"] == "disable")
- if (active)
- active = 0
- icon_state = "portgen0"
- src.updateUsrDialog()
- if(href_list["action"] == "lower_power")
- if (power_output > 1)
- power_output--
- src.updateUsrDialog()
- if (href_list["action"] == "higher_power")
- if (power_output < 4 || emagged)
- power_output++
- src.updateUsrDialog()
- if (href_list["action"] == "close")
- usr << browse(null, "window=port_gen")
- usr.machine = null
-
-/obj/machinery/power/port_gen/pacman2/emag_act(var/remaining_uses, var/mob/user)
- emagged = 1
- emp_act(1)
- return 1
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 1624eb42b1a1..40ec7979a535 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -317,6 +317,7 @@
ui.open()
/obj/machinery/power/port_gen/pacman/ui_data(mob/user)
+ // todo: rewrite the whole fuckin' UI.
var/list/data = list()
data["active"] = active
diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm
index 84f623207a88..244ac16f4ff2 100644
--- a/code/modules/power/singularity/particle_accelerator/particle.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle.dm
@@ -85,15 +85,21 @@
M.afflict_radiation(radiation, TRUE)
/obj/effect/accelerated_particle/proc/move(var/lag)
+ var/turf/new_target
if(target)
if(movetotarget)
- forceMove(get_step_towards(src, target))
- if(get_dist(src,target) < 1)
+ new_target = get_step_towards(src, target)
+ if(get_dist(src,new_target) < 1)
movetotarget = 0
else
- forceMove(get_step_away(src, source))
+ new_target = get_step_away(src, source)
else
- forceMove(get_step(src, dir))
+ new_target = get_step(src, dir)
+ if(new_target)
+ forceMove(new_target)
+ else
+ qdel(src)
+ return
movement_range--
if(movement_range <= 0)
qdel(src)
diff --git a/code/modules/preferences/preference_setup/loadout/loadout_event_rewards.dm b/code/modules/preferences/preference_setup/loadout/loadout_event_rewards.dm
index 3299aeff8bbe..a6e688a9eec6 100644
--- a/code/modules/preferences/preference_setup/loadout/loadout_event_rewards.dm
+++ b/code/modules/preferences/preference_setup/loadout/loadout_event_rewards.dm
@@ -55,4 +55,4 @@
/datum/gear/event_reward/tacskirt
name = "Tactical Skirt"
path = /obj/item/clothing/under/syndicate/skirt_pleated
- ckeywhitelist = list("GrapePantaSoda")
+ ckeywhitelist = list("grapepantasoda")
diff --git a/code/modules/preferences/preference_setup/loadout/loadout_suit.dm b/code/modules/preferences/preference_setup/loadout/loadout_suit.dm
index 3cb5f7cf4f42..ea580104b8a8 100644
--- a/code/modules/preferences/preference_setup/loadout/loadout_suit.dm
+++ b/code/modules/preferences/preference_setup/loadout/loadout_suit.dm
@@ -272,6 +272,10 @@
varsities[initial(varsity.name)] = varsity
gear_tweaks += new/datum/gear_tweak/path(tim_sort(varsities, /proc/cmp_text_asc))
+/datum/gear/suit/varsity_worn
+ name = "Varsity Jacket - Worn"
+ path = /obj/item/clothing/suit/storage/toggle/varsity/worn
+
/datum/gear/suit/track
name = "Track Jacket - Selection"
path = /obj/item/clothing/suit/storage/toggle/track
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index d2e2b3d3b6fa..bf7d6b858af2 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -10,7 +10,8 @@
anchored = TRUE
unacidable = TRUE
pass_flags = ATOM_PASS_TABLE
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ depth_level = INFINITY // nothing should be passing over us from depth
////TG PROJECTILE SYTSEM
//Projectile stuff
diff --git a/code/modules/reagents/machinery/dispenser/dispenser.dm b/code/modules/reagents/machinery/dispenser/dispenser.dm
index a3157edca30e..d5539b02f217 100644
--- a/code/modules/reagents/machinery/dispenser/dispenser.dm
+++ b/code/modules/reagents/machinery/dispenser/dispenser.dm
@@ -428,7 +428,7 @@
if(inserted)
investigate_log("[key_name(user)] ejected [ref_name_path(inserted)]", INVESTIGATE_REAGENTS)
user.visible_action_feedback(SPAN_NOTICE("[user] quickly swaps [src]'s [inserted] for [I]."), src, range = MESSAGE_RANGE_INVENTORY_SOFT)
- user.put_in_hand_or_drop(inserted)
+ user.put_in_hands_or_drop(inserted)
else
user.visible_action_feedback(SPAN_NOTICE("[user] inserts [I] into [src]."), src, range = MESSAGE_RANGE_INVENTORY_SOFT)
investigate_log("[key_name(user)] inserted [ref_name_path(I)]", INVESTIGATE_REAGENTS)
diff --git a/code/modules/rogueminer_vr/controller.dm b/code/modules/rogueminer_vr/controller.dm
index 544a88088729..f5ebabf5bb69 100644
--- a/code/modules/rogueminer_vr/controller.dm
+++ b/code/modules/rogueminer_vr/controller.dm
@@ -142,7 +142,7 @@ var/datum/controller/rogue/rm_controller
oldest_zone = ZM
oldest_time = ZM.prepared_at
- return oldest_zone
+ return oldest_zone || SAFEINDEXACCESS(all_zones, 1)
/datum/controller/rogue/proc/mark_clean(var/datum/rogue/zonemaster/ZM)
if(!(ZM in all_zones)) //What? Who?
@@ -183,6 +183,11 @@ var/datum/controller/rogue/rm_controller
/datum/controller/rogue/proc/prepare_new_zone()
var/datum/rogue/zonemaster/ZM_target
+ if(clean_zones.len <= 1) //Need to clean the oldest one, too.
+ rm_controller.dbg("RMC(pnz): Cleaning up oldest zone.")
+ var/datum/rogue/zonemaster/ZM_oldest = get_oldest_zone()
+ ZM_oldest.clean_zone()
+
if(clean_zones.len)
ZM_target = pick(clean_zones)
@@ -196,10 +201,4 @@ var/datum/controller/rogue/rm_controller
else
rm_controller.dbg("RMC(pnz): I was asked for a new zone but there's no space.")
- if(clean_zones.len <= 1) //Need to clean the oldest one, too.
- rm_controller.dbg("RMC(pnz): Cleaning up oldest zone.")
- spawn(0) //Detatch it so we can return the new zone for now.
- var/datum/rogue/zonemaster/ZM_oldest = get_oldest_zone()
- ZM_oldest.clean_zone()
-
return ZM_target
diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm
index 93007cb676fd..a4314251b010 100644
--- a/code/modules/shuttles/shuttle_console.dm
+++ b/code/modules/shuttles/shuttle_console.dm
@@ -3,7 +3,7 @@
desc = "Used to control a linked shuttle."
icon_keyboard = "atmos_key"
icon_screen = "shuttle"
- circuit = null
+ circuit = /obj/item/circuitboard/shuttle_console
var/shuttle_tag // Used to coordinate data in shuttle controller.
var/hacked = 0 // Has been emagged, no access restrictions.
diff --git a/code/modules/species/station/xenomorph_hybrids/hybrid_abilities.dm b/code/modules/species/station/xenomorph_hybrids/hybrid_abilities.dm
index 8a3cd3839292..53cdedd199eb 100644
--- a/code/modules/species/station/xenomorph_hybrids/hybrid_abilities.dm
+++ b/code/modules/species/station/xenomorph_hybrids/hybrid_abilities.dm
@@ -9,3 +9,67 @@
if(O)
O.color = "#422649"
return
+
+/datum/ability/species/xenomorph_hybrid
+ action_icon = 'icons/screen/actions/xenomorph.dmi'
+ var/plasma_cost = 0
+
+/datum/ability/species/xenomorph_hybrid/available_check()
+ . = ..()
+ if(.)
+ var/mob/living/carbon/human/H = owner
+ if(plasma_cost && !istype(H))
+ return FALSE
+ if(plasma_cost > 0 && !check_plasmavessel(H))
+ return FALSE
+ var/obj/item/organ/internal/xenos/plasmavessel/P = H.internal_organs_by_name[O_PLASMA]
+ if(istype(P) && P.stored_plasma < plasma_cost)
+ return FALSE
+
+/datum/ability/species/xenomorph_hybrid/proc/check_plasmavessel(var/mob/living/carbon/human/H)
+ var/obj/item/organ/internal/xenos/plasmavessel/P = H.internal_organs_by_name[O_PLASMA]
+ if(!istype(P))
+ return FALSE
+ return TRUE
+
+/datum/ability/species/xenomorph_hybrid/proc/take_plasma(var/mob/living/carbon/human/H)
+ var/obj/item/organ/internal/xenos/plasmavessel/P = H.internal_organs_by_name[O_PLASMA]
+ if(!istype(P))
+ return
+ P.adjust_plasma(-plasma_cost)
+
+/datum/ability/species/xenomorph_hybrid/on_trigger(mob/user, toggling)
+ . = ..()
+ take_plasma(user)
+
+/datum/ability/species/xenomorph_hybrid/regenerate
+ name = "Rest and regenerate"
+ desc = "Lie down and regenerate your health"
+ action_state = "regenerate"
+ windup = 0 SECOND
+ interact_type = ABILITY_INTERACT_TRIGGER
+ always_bind = TRUE
+ ability_check_flags = ABILITY_CHECK_RESTING
+ mobility_check_flags = MOBILITY_IS_CONSCIOUS
+ plasma_cost = 10
+
+/datum/ability/species/xenomorph_hybrid/regenerate/on_trigger()
+ . = ..()
+ var/mob/living/carbon/human/O = owner
+ if(istype(O))
+ to_chat(O, SPAN_NOTICEALIEN("We begin to mend our wounds."))
+ O.active_regen = TRUE
+
+ if (O.getBruteLoss() == 0) //If we have no flat damage remaining, fix internal issues, and not running around
+ for(var/limb_type in O.species.has_limbs)
+ var/obj/item/organ/external/E = O.organs_by_name[limb_type]
+ if((E.status & ORGAN_BROKEN))
+ E.status &= ~ORGAN_BROKEN
+ to_chat(O, SPAN_NOTICEALIEN("You mend the bone in your [E]"))
+ return//fix one then stop, trigger again to mend more
+
+
+
+
+
+
diff --git a/code/modules/species/station/xenomorph_hybrids/xeno_hybrids.dm b/code/modules/species/station/xenomorph_hybrids/xeno_hybrids.dm
index bc0c3433767d..e8761a3cce83 100644
--- a/code/modules/species/station/xenomorph_hybrids/xeno_hybrids.dm
+++ b/code/modules/species/station/xenomorph_hybrids/xeno_hybrids.dm
@@ -50,15 +50,14 @@
/mob/living/proc/shred_limb,
/mob/living/carbon/human/proc/tie_hair,
/mob/living/carbon/human/proc/psychic_whisper,
- /mob/living/carbon/human/proc/hybrid_resin,
- /mob/living/carbon/human/proc/hybrid_plant//replaced from the normal weed node to place a singular weed
)
abilities = list(
/datum/ability/species/sonar,
/datum/ability/species/toggle_agility,
+ /datum/ability/species/xenomorph_hybrid/regenerate,
)
- total_health = 110 //Exoskeleton makes you tougher than baseline
+ total_health = 150 //Exoskeleton makes you tougher than baseline
brute_mod = 0.95 // Chitin is somewhat hard to crack
burn_mod = 1.5 // Natural enemy of xenomorphs is fire. Upgraded to Major Burn Weakness. Reduce to Minor if this is too harsh.
blood_volume = 560 //Baseline
@@ -95,46 +94,51 @@
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/hunter,//Important for the xenomorph abilities, hunter to have a pretty small plasma capacity
O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE = /obj/item/organ/internal/intestine,
- O_RESIN = /obj/item/organ/internal/xenos/resinspinner,
+ O_RESIN = /obj/item/organ/internal/xenos/resinspinner/hybrid,
)
vision_organ = O_BRAIN//Neomorphs have no (visible) Eyes, seeing without them should be possible.
reagent_tag = IS_XENOHYBRID
+ var/heal_rate = 0.5 //Lets just create a set number
+
/datum/species/xenohybrid/can_breathe_water()
return TRUE //they dont quite breathe
-/datum/species/xenohybrid/handle_environment_special(var/mob/living/carbon/human/H)
- var/heal_amount = min(H.nutrition, 200) / 50 //Not to much else we might as well give them a diona like healing
- H.nutrition = max(H.nutrition-heal_amount,0)
-
- if(H.resting)
- heal_amount *= 1.05//resting allows you to heal a little faster
- var/fire_damage = H.getFireLoss()
- if(fire_damage >= heal_amount)
- H.adjustFireLoss(-heal_amount)
- heal_amount = 0;
- return
- if(fire_damage < heal_amount)
- H.adjustFireLoss(-heal_amount)
- heal_amount -= fire_damage
-
- var/trauma_damage = H.getBruteLoss()
- if(trauma_damage >= heal_amount)
- H.adjustBruteLoss(-heal_amount)
- heal_amount = 0;
+/datum/species/xenohybrid/proc/handle_healing_conditions(var/mob/living/carbon/human/H)
+ var/healing_factor = 1
+ if(H.lying)
+ healing_factor *= 1.2
+ if(H.active_regen)
+ if(!H.lying)
+ to_chat(H, SPAN_BOLDWARNING("You need to lie down to benefit from your enhanced regeneration"))
+ H.active_regen = FALSE
+ else if(H.nutrition < 50)
+ to_chat(H, SPAN_BOLDWARNING("You are too hungry to benefit from your enhanced regeneration"))
+ H.active_regen = FALSE
+ healing_factor *= 4
+ var/turf/T = get_turf(H)
+ if(/obj/effect/alien/weeds in T.contents)
+ healing_factor *= 1.1
+ if(/obj/structure/bed/hybrid_nest in T.contents)
+ healing_factor *= 1.2
+
+ return healing_factor // highest value is 6,336
+
+/datum/species/xenohybrid/handle_environment_special(mob/living/carbon/human/H)
+ var/heal_amount = heal_rate * handle_healing_conditions(H)
+
+ var/nutrition_debt = (H.getFireLoss() ? heal_rate : 0)//Heal rate and not heal_amount, since we want to reward taking the modifiers
+ H.adjustFireLoss(-heal_amount)
+ nutrition_debt += (H.getBruteLoss() ? heal_rate : 0)
+ H.adjustBruteLoss(-heal_amount)
+ nutrition_debt += (H.getToxLoss() ? heal_rate : 0)
+ H.adjustToxLoss(-heal_amount)
+
+ H.nutrition -= nutrition_debt
+ if(H.nutrition < 100 || heal_amount <= 0.6)
return
- if(trauma_damage < heal_amount)
- H.adjustBruteLoss(-heal_amount)
- heal_amount -= trauma_damage
-
- var/posion_damage = H.getToxLoss()
- if(posion_damage >= heal_amount)
- H.adjustToxLoss(-heal_amount)
- heal_amount = 0;
- return
- if(posion_damage < heal_amount)
- H.adjustToxLoss(-heal_amount)
- heal_amount -= posion_damage
- H.nutrition += heal_amount
+ if(H.vessel.get_reagent_amount("blood") <= blood_level_safe && H.try_take_nutrition(heal_amount * 4))
+ H.vessel.add_reagent("blood", heal_amount)//instead of IB healing, they regenerate blood a lot faster
+
diff --git a/code/modules/species/xenomorphs/alien_species.dm b/code/modules/species/xenomorphs/alien_species.dm
index a247e87a2235..20b21f2e7cc5 100644
--- a/code/modules/species/xenomorphs/alien_species.dm
+++ b/code/modules/species/xenomorphs/alien_species.dm
@@ -198,10 +198,8 @@
inherent_verbs = list(
/mob/living/proc/ventcrawl,
/mob/living/carbon/human/proc/regurgitate,
- /mob/living/carbon/human/proc/plant,
/mob/living/carbon/human/proc/transfer_plasma,
/mob/living/carbon/human/proc/evolve,
- /mob/living/carbon/human/proc/resin,
/mob/living/carbon/human/proc/corrosive_acid
)
@@ -310,12 +308,10 @@
/mob/living/carbon/human/proc/psychic_whisper,
/mob/living/carbon/human/proc/regurgitate,
/mob/living/carbon/human/proc/lay_egg,
- /mob/living/carbon/human/proc/plant,
/mob/living/carbon/human/proc/transfer_plasma,
/mob/living/carbon/human/proc/corrosive_acid,
/mob/living/carbon/human/proc/neurotoxin,
/mob/living/carbon/human/proc/acidspit,
- /mob/living/carbon/human/proc/resin
)
/datum/species/xenos/queen/handle_login_special(var/mob/living/carbon/human/H)
diff --git a/code/modules/tables/flipping.dm b/code/modules/tables/flipping.dm
index e271b22d1388..b3f7b6cefd0a 100644
--- a/code/modules/tables/flipping.dm
+++ b/code/modules/tables/flipping.dm
@@ -26,11 +26,7 @@
return
usr.visible_message("[usr] flips \the [src]!")
-
- if(climbable)
- structure_shaken()
-
- return
+ shake_climbers()
/obj/structure/table/proc/unflipping_check(var/direction)
@@ -86,7 +82,7 @@
if(dir != NORTH)
plane = MOB_PLANE
layer = ABOVE_MOB_LAYER
- climbable = 0 //flipping tables allows them to be used as makeshift barriers
+ climb_delay = 10 SECONDS
flipped = 1
atom_flags |= ATOM_BORDER
for(var/D in list(turn(direction, 90), turn(direction, -90)))
@@ -105,7 +101,7 @@
reset_plane_and_layer()
flipped = 0
- climbable = initial(climbable)
+ climb_delay = initial(climb_delay)
atom_flags &= ~ATOM_BORDER
for(var/D in list(turn(dir, 90), turn(dir, -90)))
var/obj/structure/table/T = locate() in get_step(src.loc,D)
diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm
index 06e121332be8..9cca6dc8612a 100644
--- a/code/modules/tables/tables.dm
+++ b/code/modules/tables/tables.dm
@@ -8,7 +8,6 @@ var/list/table_icon_cache = list()
density = TRUE
pass_flags_self = ATOM_PASS_THROWN | ATOM_PASS_CLICK | ATOM_PASS_TABLE | ATOM_PASS_OVERHEAD_THROW | ATOM_PASS_BUCKLED
anchored = TRUE
- climbable = TRUE
layer = TABLE_LAYER
surgery_odds = 66
connections = list("nw0", "ne0", "sw0", "se0")
@@ -17,6 +16,10 @@ var/list/table_icon_cache = list()
smoothing_groups = (SMOOTH_GROUP_TABLES)
canSmoothWith = (SMOOTH_GROUP_TABLES + SMOOTH_GROUP_LOW_WALL)
+ climb_allowed = TRUE
+ depth_level = 8
+ depth_projected = TRUE
+
var/flipped = 0
var/maxhealth = 10
var/health = 10
diff --git a/code/modules/tgs/core/_definitions.dm b/code/modules/tgs/core/_definitions.dm
index ebf6d17c2a07..fd98034eb716 100644
--- a/code/modules/tgs/core/_definitions.dm
+++ b/code/modules/tgs/core/_definitions.dm
@@ -1,2 +1,10 @@
+#if DM_VERSION < 510
+#error The TGS DMAPI does not support BYOND versions < 510!
+#endif
+
#define TGS_UNIMPLEMENTED "___unimplemented"
#define TGS_VERSION_PARAMETER "server_service_version"
+
+#ifndef TGS_DEBUG_LOG
+#define TGS_DEBUG_LOG(message)
+#endif
diff --git a/code/modules/tgs/v3210/commands.dm b/code/modules/tgs/v3210/commands.dm
index d9bd287465b9..e65c816320dc 100644
--- a/code/modules/tgs/v3210/commands.dm
+++ b/code/modules/tgs/v3210/commands.dm
@@ -47,7 +47,7 @@
user.friendly_name = sender
// Discord hack, fix the mention if it's only numbers (fuck you IRC trolls)
- var/regex/discord_id_regex = regex(@"^[0-9]+$")
+ var/regex/discord_id_regex = regex("^\[0-9\]+$")
if(findtext(sender, discord_id_regex))
sender = "<@[sender]>"
@@ -55,4 +55,4 @@
var/datum/tgs_message_content/result = stc.Run(user, params)
result = UpgradeDeprecatedCommandResponse(result, command)
- return result?.text || TRUE
+ return result ? result.text : TRUE
diff --git a/code/modules/tgs/v4/commands.dm b/code/modules/tgs/v4/commands.dm
index d6d3d718d471..25dd6740e3af 100644
--- a/code/modules/tgs/v4/commands.dm
+++ b/code/modules/tgs/v4/commands.dm
@@ -40,5 +40,5 @@
var/datum/tgs_message_content/result = sc.Run(u, params)
result = UpgradeDeprecatedCommandResponse(result, command)
- return result?.text
+ return result ? result.text : TRUE
return "Unknown command: [command]!"
diff --git a/code/modules/tgs/v5/_defines.dm b/code/modules/tgs/v5/_defines.dm
index c7213cc24699..f973338daa03 100644
--- a/code/modules/tgs/v5/_defines.dm
+++ b/code/modules/tgs/v5/_defines.dm
@@ -5,8 +5,8 @@
#define DMAPI5_TOPIC_DATA "tgs_data"
#define DMAPI5_BRIDGE_REQUEST_LIMIT 8198
-#define DMAPI5_TOPIC_REQUEST_LIMIT 65529
-#define DMAPI5_TOPIC_RESPONSE_LIMIT 65528
+#define DMAPI5_TOPIC_REQUEST_LIMIT 65528
+#define DMAPI5_TOPIC_RESPONSE_LIMIT 65529
#define DMAPI5_BRIDGE_COMMAND_PORT_UPDATE 0
#define DMAPI5_BRIDGE_COMMAND_STARTUP 1
diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm
index 926ea10a8f27..34cc43f8762f 100644
--- a/code/modules/tgs/v5/api.dm
+++ b/code/modules/tgs/v5/api.dm
@@ -22,12 +22,17 @@
var/detached = FALSE
+/datum/tgs_api/v5/New()
+ . = ..()
+ TGS_DEBUG_LOG("V5 API created")
+
/datum/tgs_api/v5/ApiVersion()
return new /datum/tgs_version(
#include "__interop_version.dm"
)
/datum/tgs_api/v5/OnWorldNew(minimum_required_security_level)
+ TGS_DEBUG_LOG("OnWorldNew()")
server_port = world.params[DMAPI5_PARAM_SERVER_PORT]
access_identifier = world.params[DMAPI5_PARAM_ACCESS_IDENTIFIER]
@@ -96,17 +101,28 @@
return TRUE
/datum/tgs_api/v5/proc/RequireInitialBridgeResponse()
+ TGS_DEBUG_LOG("RequireInitialBridgeResponse()")
+ var/logged = FALSE
while(!version)
+ if(!logged)
+ TGS_DEBUG_LOG("RequireInitialBridgeResponse: Starting sleep")
+ logged = TRUE
+
sleep(1)
+ TGS_DEBUG_LOG("RequireInitialBridgeResponse: Passed")
+
/datum/tgs_api/v5/OnInitializationComplete()
Bridge(DMAPI5_BRIDGE_COMMAND_PRIME)
/datum/tgs_api/v5/OnTopic(T)
+ TGS_DEBUG_LOG("OnTopic()")
RequireInitialBridgeResponse()
+ TGS_DEBUG_LOG("OnTopic passed bridge request gate")
var/list/params = params2list(T)
var/json = params[DMAPI5_TOPIC_DATA]
if(!json)
+ TGS_DEBUG_LOG("No \"[DMAPI5_TOPIC_DATA]\" entry found, ignoring...")
return FALSE // continue to /world/Topic
if(!initialized)
@@ -156,7 +172,7 @@
TGS_WARNING_LOG("Received legacy string when a [/datum/tgs_message_content] was expected. Please audit all calls to TgsChatBroadcast, TgsChatTargetedBroadcast, and TgsChatPrivateMessage to ensure they use the new /datum.")
return new /datum/tgs_message_content(message)
-/datum/tgs_api/v5/ChatBroadcast(datum/tgs_message_content/message, list/channels)
+/datum/tgs_api/v5/ChatBroadcast(datum/tgs_message_content/message2, list/channels)
if(!length(channels))
channels = ChatChannelInfo()
@@ -165,45 +181,45 @@
var/datum/tgs_chat_channel/channel = I
ids += channel.id
- message = UpgradeDeprecatedChatMessage(message)
+ message2 = UpgradeDeprecatedChatMessage(message2)
if (!length(channels))
return
- message = message._interop_serialize()
- message[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = ids
+ var/list/data = message2._interop_serialize()
+ data[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = ids
if(intercepted_message_queue)
- intercepted_message_queue += list(message)
+ intercepted_message_queue += list(data)
else
- Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = message))
+ Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = data))
-/datum/tgs_api/v5/ChatTargetedBroadcast(datum/tgs_message_content/message, admin_only)
+/datum/tgs_api/v5/ChatTargetedBroadcast(datum/tgs_message_content/message2, admin_only)
var/list/channels = list()
for(var/I in ChatChannelInfo())
var/datum/tgs_chat_channel/channel = I
if (!channel.is_private_channel && ((channel.is_admin_channel && admin_only) || (!channel.is_admin_channel && !admin_only)))
channels += channel.id
- message = UpgradeDeprecatedChatMessage(message)
+ message2 = UpgradeDeprecatedChatMessage(message2)
if (!length(channels))
return
- message = message._interop_serialize()
- message[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = channels
+ var/list/data = message2._interop_serialize()
+ data[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = channels
if(intercepted_message_queue)
- intercepted_message_queue += list(message)
+ intercepted_message_queue += list(data)
else
- Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = message))
+ Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = data))
-/datum/tgs_api/v5/ChatPrivateMessage(datum/tgs_message_content/message, datum/tgs_chat_user/user)
- message = UpgradeDeprecatedChatMessage(message)
- message = message._interop_serialize()
- message[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = list(user.channel.id)
+/datum/tgs_api/v5/ChatPrivateMessage(datum/tgs_message_content/message2, datum/tgs_chat_user/user)
+ message2 = UpgradeDeprecatedChatMessage(message2)
+ var/list/data = message2._interop_serialize()
+ data[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = list(user.channel.id)
if(intercepted_message_queue)
- intercepted_message_queue += list(message)
+ intercepted_message_queue += list(data)
else
- Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = message))
+ Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = data))
/datum/tgs_api/v5/ChatChannelInfo()
RequireInitialBridgeResponse()
@@ -211,6 +227,7 @@
return chat_channels.Copy()
/datum/tgs_api/v5/proc/DecodeChannels(chat_update_json)
+ TGS_DEBUG_LOG("DecodeChannels()")
var/list/chat_channels_json = chat_update_json[DMAPI5_CHAT_UPDATE_CHANNELS]
if(istype(chat_channels_json))
chat_channels.Cut()
diff --git a/code/modules/tgs/v5/commands.dm b/code/modules/tgs/v5/commands.dm
index a832c81f172d..9557f8a08ed5 100644
--- a/code/modules/tgs/v5/commands.dm
+++ b/code/modules/tgs/v5/commands.dm
@@ -35,10 +35,10 @@
if(sc)
var/datum/tgs_message_content/response = sc.Run(u, params)
response = UpgradeDeprecatedCommandResponse(response, command)
-
+
var/list/topic_response = TopicResponse()
- topic_response[DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE] = response?.text
- topic_response[DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE] = response?._interop_serialize()
+ topic_response[DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE] = response ? response.text : null
+ topic_response[DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE] = response ? response._interop_serialize() : null
return topic_response
return TopicResponse("Unknown custom chat command: [command]!")
diff --git a/code/modules/tgs/v5/serializers.dm b/code/modules/tgs/v5/serializers.dm
index 7f9bc731b792..3a32848ad512 100644
--- a/code/modules/tgs/v5/serializers.dm
+++ b/code/modules/tgs/v5/serializers.dm
@@ -1,12 +1,12 @@
/datum/tgs_message_content/proc/_interop_serialize()
- return list("text" = text, "embed" = embed?._interop_serialize())
+ return list("text" = text, "embed" = embed ? embed._interop_serialize() : null)
/datum/tgs_chat_embed/proc/_interop_serialize()
CRASH("Base /proc/interop_serialize called on [type]!")
/datum/tgs_chat_embed/structure/_interop_serialize()
var/list/serialized_fields
- if(islist(fields))
+ if(istype(fields, /list))
serialized_fields = list()
for(var/datum/tgs_chat_embed/field/field as anything in fields)
serialized_fields += list(field._interop_serialize())
@@ -16,12 +16,12 @@
"url" = url,
"timestamp" = timestamp,
"colour" = colour,
- "image" = image?._interop_serialize(),
- "thumbnail" = thumbnail?._interop_serialize(),
- "video" = video?._interop_serialize(),
- "footer" = footer?._interop_serialize(),
- "provider" = provider?._interop_serialize(),
- "author" = author?._interop_serialize(),
+ "image" = src.image ? src.image._interop_serialize() : null,
+ "thumbnail" = thumbnail ? thumbnail._interop_serialize() : null,
+ "video" = video ? video._interop_serialize() : null,
+ "footer" = footer ? footer._interop_serialize() : null,
+ "provider" = provider ? provider._interop_serialize() : null,
+ "author" = author ? author._interop_serialize() : null,
"fields" = serialized_fields
)
@@ -43,7 +43,7 @@
. = ..()
.["iconUrl"] = icon_url
.["proxyIconUrl"] = proxy_icon_url
-
+
/datum/tgs_chat_embed/footer/_interop_serialize()
return list(
"text" = text,
diff --git a/code/modules/tgs/v5/topic.dm b/code/modules/tgs/v5/topic.dm
index 56c1824fd97d..d7d471213813 100644
--- a/code/modules/tgs/v5/topic.dm
+++ b/code/modules/tgs/v5/topic.dm
@@ -5,6 +5,7 @@
return response
/datum/tgs_api/v5/proc/ProcessTopicJson(json, check_access_identifier)
+ TGS_DEBUG_LOG("ProcessTopicJson(..., [check_access_identifier])")
var/list/result = ProcessRawTopic(json, check_access_identifier)
if(!result)
result = TopicResponse("Runtime error!")
@@ -25,16 +26,20 @@
return response_json
/datum/tgs_api/v5/proc/ProcessRawTopic(json, check_access_identifier)
+ TGS_DEBUG_LOG("ProcessRawTopic(..., [check_access_identifier])")
var/list/topic_parameters = json_decode(json)
if(!topic_parameters)
+ TGS_DEBUG_LOG("ProcessRawTopic: json_decode failed")
return TopicResponse("Invalid topic parameters json: [json]!");
var/their_sCK = topic_parameters[DMAPI5_PARAMETER_ACCESS_IDENTIFIER]
if(check_access_identifier && their_sCK != access_identifier)
- return TopicResponse("Failed to decode [DMAPI5_PARAMETER_ACCESS_IDENTIFIER]!")
+ TGS_DEBUG_LOG("ProcessRawTopic: access identifier check failed")
+ return TopicResponse("Failed to decode [DMAPI5_PARAMETER_ACCESS_IDENTIFIER] or it does not match!")
var/command = topic_parameters[DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE]
if(!isnum(command))
+ TGS_DEBUG_LOG("ProcessRawTopic: command type check failed")
return TopicResponse("Failed to decode [DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE]!")
return ProcessTopicCommand(command, topic_parameters)
@@ -43,6 +48,7 @@
return "response[payload_id]"
/datum/tgs_api/v5/proc/ProcessTopicCommand(command, list/topic_parameters)
+ TGS_DEBUG_LOG("ProcessTopicCommand([command], ...)")
switch(command)
if(DMAPI5_TOPIC_COMMAND_CHAT_COMMAND)
@@ -55,7 +61,6 @@
return result
if(DMAPI5_TOPIC_COMMAND_EVENT_NOTIFICATION)
- intercepted_message_queue = list()
var/list/event_notification = topic_parameters[DMAPI5_TOPIC_PARAMETER_EVENT_NOTIFICATION]
if(!istype(event_notification))
return TopicResponse("Invalid [DMAPI5_TOPIC_PARAMETER_EVENT_NOTIFICATION]!")
@@ -66,23 +71,25 @@
var/list/event_parameters = event_notification[DMAPI5_EVENT_NOTIFICATION_PARAMETERS]
if(event_parameters && !istype(event_parameters))
- return TopicResponse("Invalid or missing [DMAPI5_EVENT_NOTIFICATION_PARAMETERS]!")
+ . = TopicResponse("Invalid or missing [DMAPI5_EVENT_NOTIFICATION_PARAMETERS]!")
+ else
+ var/list/response = TopicResponse()
+ . = response
+ if(event_handler != null)
+ var/list/event_call = list(event_type)
+ if(event_parameters)
+ event_call += event_parameters
+
+ intercepted_message_queue = list()
+ event_handler.HandleEvent(arglist(event_call))
+ response[DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES] = intercepted_message_queue
+ intercepted_message_queue = null
- var/list/event_call = list(event_type)
if (event_type == TGS_EVENT_WATCHDOG_DETACH)
detached = TRUE
chat_channels.Cut() // https://github.com/tgstation/tgstation-server/issues/1490
- if(event_parameters)
- event_call += event_parameters
-
- if(event_handler != null)
- event_handler.HandleEvent(arglist(event_call))
-
- var/list/response = TopicResponse()
- response[DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES] = intercepted_message_queue
- intercepted_message_queue = null
- return response
+ return
if(DMAPI5_TOPIC_COMMAND_CHANGE_PORT)
var/new_port = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_PORT]
@@ -122,8 +129,10 @@
return TopicResponse()
if(DMAPI5_TOPIC_COMMAND_CHAT_CHANNELS_UPDATE)
+ TGS_DEBUG_LOG("ProcessTopicCommand: It's a chat update")
var/list/chat_update_json = topic_parameters[DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE]
if(!istype(chat_update_json))
+ TGS_DEBUG_LOG("ProcessTopicCommand: failed \"[DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE]\" check")
return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE]!")
DecodeChannels(chat_update_json)
@@ -138,7 +147,7 @@
return TopicResponse()
if(DMAPI5_TOPIC_COMMAND_HEALTHCHECK)
- if(event_handler?.receive_health_checks)
+ if(event_handler && event_handler.receive_health_checks)
event_handler.HandleEvent(TGS_EVENT_HEALTH_CHECK)
return TopicResponse()
diff --git a/code/modules/tgui/modules/camera.dm b/code/modules/tgui/modules/camera.dm
index 5af6bcf43df2..6a3d774fc592 100644
--- a/code/modules/tgui/modules/camera.dm
+++ b/code/modules/tgui/modules/camera.dm
@@ -73,7 +73,7 @@
if(isnull(planes))
planes = new(map_name)
if(isnull(parallax))
- parallax = new(secondary_map = map_name, forced_eye = src)
+ parallax = new(secondary_map = map_name, forced_eye = host)
/datum/tgui_module_old/camera/ui_interact(mob/user, datum/tgui/ui = null)
// Update UI
diff --git a/icons/clothing/suit/jackets/varsity.dmi b/icons/clothing/suit/jackets/varsity.dmi
new file mode 100644
index 000000000000..0c0ee857ed87
Binary files /dev/null and b/icons/clothing/suit/jackets/varsity.dmi differ
diff --git a/icons/mob/clothing/suits.dmi b/icons/mob/clothing/suits.dmi
index 64fd5d9b9c87..b346f0956a13 100644
Binary files a/icons/mob/clothing/suits.dmi and b/icons/mob/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index e6df2fd4a2e6..6c3b3a26b7ae 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/stacks.dmi b/icons/obj/stacks.dmi
index ca7381a8d36a..ed3caf031ea1 100644
Binary files a/icons/obj/stacks.dmi and b/icons/obj/stacks.dmi differ
diff --git a/icons/screen/actions/actions.dmi b/icons/screen/actions/actions.dmi
index 34745da5dd54..e5b965bf4378 100644
Binary files a/icons/screen/actions/actions.dmi and b/icons/screen/actions/actions.dmi differ
diff --git a/icons/screen/actions/xenomorph.dmi b/icons/screen/actions/xenomorph.dmi
new file mode 100644
index 000000000000..0fba88bfd723
Binary files /dev/null and b/icons/screen/actions/xenomorph.dmi differ
diff --git a/icons/turf/flooring/carpet.dmi b/icons/turf/flooring/carpet.dmi
index 98ba4d823915..6ebcc179a280 100644
Binary files a/icons/turf/flooring/carpet.dmi and b/icons/turf/flooring/carpet.dmi differ
diff --git a/icons/turf/flooring/decals.dmi b/icons/turf/flooring/decals.dmi
index e55a080e4355..16641b94864c 100644
Binary files a/icons/turf/flooring/decals.dmi and b/icons/turf/flooring/decals.dmi differ
diff --git a/maps/rift/levels/rift-05-surface2.dmm b/maps/rift/levels/rift-05-surface2.dmm
index 0fac3ec7df86..e2b1d1b66b94 100644
--- a/maps/rift/levels/rift-05-surface2.dmm
+++ b/maps/rift/levels/rift-05-surface2.dmm
@@ -11707,6 +11707,12 @@
pixel_x = -5;
pixel_y = 10
},
+/obj/item/clothing/accessory/storage/pouches/large/navy{
+ pixel_y = 3
+ },
+/obj/item/clothing/accessory/storage/pouches/large/navy{
+ pixel_y = 4
+ },
/turf/simulated/floor/tiled/dark,
/area/security/armory/blue)
"hBp" = (
@@ -37315,6 +37321,20 @@
/obj/item/clothing/accessory/armor/armguards{
pixel_y = 4
},
+/obj/item/clothing/accessory/armor/legguards/navy{
+ pixel_y = -1;
+ pixel_x = -4
+ },
+/obj/item/clothing/accessory/armor/legguards/navy{
+ pixel_y = -1;
+ pixel_x = 7
+ },
+/obj/item/clothing/accessory/armor/armguards/navy,
+/obj/item/clothing/accessory/armor/armguards/navy,
+/obj/item/clothing/accessory/armor/legguards/navy{
+ pixel_y = -1;
+ pixel_x = -4
+ },
/turf/simulated/floor/tiled/dark,
/area/security/armory/blue)
"xHT" = (
diff --git a/maps/rift/levels/rift-06-surface3.dmm b/maps/rift/levels/rift-06-surface3.dmm
index b809b260383a..aac68e0f2bc8 100644
--- a/maps/rift/levels/rift-06-surface3.dmm
+++ b/maps/rift/levels/rift-06-surface3.dmm
@@ -9960,25 +9960,10 @@
/turf/simulated/floor/tiled/steel,
/area/crew_quarters/heads/hop)
"aBw" = (
-/obj/machinery/holopad,
-/obj/machinery/ai_slipper,
-/obj/machinery/button/remote/blast_door{
- dir = 4;
- id = "AILockdown";
- name = "AI Upload Lockdown";
- pixel_x = -26;
- pixel_y = 6
- },
-/obj/machinery/button/remote/blast_door{
- dir = 4;
- id = "AICore";
- name = "AI Bunker Lockdown";
- pixel_x = -26;
- pixel_y = -6
- },
/obj/machinery/light{
dir = 8
},
+/obj/machinery/media/jukebox,
/turf/simulated/floor/tiled/techfloor/grid,
/area/ai)
"aBy" = (
@@ -20178,6 +20163,11 @@
/obj/structure/railing,
/turf/simulated/open,
/area/maintenance/station/exploration)
+"fax" = (
+/obj/structure/foamedmetal,
+/obj/structure/grille,
+/turf/space/basic,
+/area/rift/surfacebase/outside/outside3)
"fbX" = (
/obj/machinery/door/blast/regular,
/turf/simulated/floor/reinforced,
@@ -21591,6 +21581,11 @@
},
/turf/simulated/floor/tiled/steel_grid,
/area/exploration/explorer_prep)
+"iKl" = (
+/obj/structure/foamedmetal,
+/obj/structure/grille,
+/turf/simulated/floor/plating,
+/area/rift/surfacebase/outside/outside3)
"iLh" = (
/obj/structure/cable{
icon_state = "1-4"
@@ -23313,6 +23308,24 @@
},
/turf/simulated/floor/tiled/steel,
/area/hallway/secondary/docking_hallway)
+"neL" = (
+/obj/machinery/holopad,
+/obj/machinery/ai_slipper,
+/obj/machinery/button/remote/blast_door{
+ id = "AILockdown";
+ name = "AI Upload Lockdown";
+ pixel_x = -26;
+ pixel_y = 30
+ },
+/obj/machinery/button/remote/blast_door{
+ dir = 1;
+ id = "AICore";
+ name = "AI Bunker Lockdown";
+ pixel_x = -26;
+ pixel_y = -30
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/ai)
"nfJ" = (
/turf/simulated/wall/prepainted,
/area/hallway/primary/surfacethree)
@@ -24527,6 +24540,11 @@
/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/rift/trade_shop/landing_pad)
+"quy" = (
+/obj/structure/grille,
+/obj/structure/foamedmetal,
+/turf/simulated/wall/prepainted,
+/area/rift/surfacebase/outside/outside3)
"qvL" = (
/obj/effect/floor_decal/borderfloor{
dir = 8
@@ -27323,6 +27341,11 @@
},
/turf/simulated/floor/tiled/steel,
/area/hallway/secondary/docking_hallway2)
+"xUe" = (
+/obj/structure/foamedmetal,
+/obj/structure/grille,
+/turf/space/basic,
+/area/ai)
"xVh" = (
/obj/effect/floor_decal/borderfloor{
dir = 8
@@ -54161,23 +54184,23 @@ hNS
hNS
aBL
bWN
-aXk
-aCI
+fax
+xUe
eod
-aCa
-aAi
-aAi
+eod
+aTG
+aTG
aSo
-aNN
+aza
aBw
-aNN
-aEW
-akH
-akH
-aVl
-uom
-huX
-aXk
+aza
+aAi
+aTG
+aTG
+eod
+eod
+eod
+fax
cYF
afq
afq
@@ -54355,23 +54378,23 @@ alx
hNS
aBL
bWN
-aXk
+iKl
aCI
eod
-eod
-awN
-aTG
+aCa
+aAi
+aAi
aSo
-aza
-aOb
-aza
-agK
-aTG
-awN
-eod
-eod
-eod
-aXk
+aNN
+neL
+aNN
+aEW
+akH
+akH
+aVl
+uom
+huX
+iKl
cYF
afq
afq
@@ -54550,22 +54573,22 @@ hNS
aBL
bWN
aXk
-aXk
-eod
+aCI
eod
eod
+awN
aTG
-acv
-aza
+aSo
aza
+aOb
aza
-aFj
+agK
aTG
+awN
eod
eod
eod
-aXk
-aXk
+quy
cYF
afq
afq
@@ -54748,19 +54771,19 @@ aXk
eod
eod
eod
-awN
-aOw
-atr
-aAi
-aEW
-anS
-awN
+aTG
+acv
+aza
+aza
+aza
+aFj
+aTG
+eod
eod
eod
aXk
aXk
cYF
-cYF
afq
afq
afq
@@ -54939,19 +54962,20 @@ aBL
bWN
aXk
aXk
-aXk
-eod
-eod
eod
eod
-ahF
-aQU
-aWy
-eod
eod
+awN
+aOw
+atr
+aAi
+aEW
+anS
+awN
eod
eod
aXk
+aXk
cYF
cYF
afq
@@ -55029,7 +55053,6 @@ afq
afq
afq
afq
-afq
aXj
"}
(143,1,1) = {"
@@ -55131,23 +55154,23 @@ mEN
aBL
bWN
bWN
-cYF
-cYF
+aXk
aXk
aXk
eod
eod
eod
eod
-eod
+ahF
+aQU
+aWy
eod
eod
eod
eod
aXk
-aXk
cYF
-afq
+cYF
afq
afq
afq
@@ -55325,7 +55348,6 @@ mEN
aBL
bWN
bWN
-afq
cYF
cYF
aXk
@@ -55336,11 +55358,12 @@ eod
eod
eod
eod
-aXk
+eod
+eod
+eod
aXk
aXk
cYF
-cYF
afq
afq
afq
@@ -55520,21 +55543,21 @@ aBL
aBL
bWN
afq
-afq
cYF
cYF
aXk
aXk
-aXk
-aXk
-aXk
+eod
+eod
+eod
+eod
+eod
+eod
aXk
aXk
aXk
cYF
cYF
-cYF
-afq
afq
afq
afq
@@ -55715,14 +55738,16 @@ aBL
bWN
afq
afq
-afq
-cYF
-cYF
-cYF
-cYF
-cYF
cYF
cYF
+aXk
+aXk
+aXk
+aXk
+aXk
+aXk
+aXk
+aXk
cYF
cYF
cYF
@@ -55804,8 +55829,6 @@ afq
afq
afq
afq
-afq
-afq
aXj
"}
(147,1,1) = {"
@@ -55910,16 +55933,16 @@ bWN
afq
afq
afq
-afq
-afq
-afq
-afq
-afq
-afq
-afq
-afq
-afq
-afq
+cYF
+cYF
+cYF
+cYF
+cYF
+cYF
+cYF
+cYF
+cYF
+cYF
afq
afq
afq
diff --git a/maps/tether/levels/station1.dmm b/maps/tether/levels/station1.dmm
index 128d52ebe0ab..18ac7eb7cfcc 100644
--- a/maps/tether/levels/station1.dmm
+++ b/maps/tether/levels/station1.dmm
@@ -11329,24 +11329,6 @@
/obj/machinery/door/airlock/glass,
/turf/simulated/floor/tiled,
/area/hallway/station/atrium)
-"aAx" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,
-/obj/effect/floor_decal/borderfloor,
-/obj/effect/floor_decal/steeldecal/steel_decals7{
- dir = 8
- },
-/obj/effect/floor_decal/steeldecal/steel_decals7{
- dir = 1
- },
-/obj/effect/floor_decal/corner/lightgrey/border,
-/turf/simulated/floor/tiled,
-/area/hallway/station/atrium)
"aAy" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -14661,7 +14643,7 @@
frequency = 1443;
level = 3;
name = "Distribution and Waste Monitor";
- sensors = list("dist_main_meter"="Surface - Distribution Loop","scrub_main_meter"="Surface - Scrubbers Loop","mair_main_meter"="Surface - Mixed Air Tank","dist_aux_meter"="Station - Distribution Loop","scrub_aux_meter"="Station - Scrubbers Loop","mair_aux_meter"="Station - Mixed Air Tank","mair_mining_meter"="Mining Outpost - Mixed Air Tank")
+ sensors = list("dist_main_meter"="Surface - Distribution Loop","scrub_main_meter"="Surface - Scrubbers Loop","mair_main_meter"="Surface - Mixed Air Tank","dist_aux_meter"="Station - Distribution Loop","scrub_aux_meter"="Station - Scrubbers Loop","mair_aux_meter"="Station - Mixed Air Tank","mair_mining_meter"="Mining Outpost - Mixed Air Tank")
},
/turf/simulated/floor/tiled,
/area/engineering/engineering_monitoring)
@@ -21406,6 +21388,7 @@
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
dir = 1
},
+/obj/machinery/holopad/ship,
/turf/simulated/floor/tiled/white,
/area/shuttle/medivac/general)
"nSf" = (
@@ -21675,9 +21658,6 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/hidden,
-/obj/machinery/door/firedoor/{
- dir = 1
- },
/turf/simulated/floor/tiled/steel_grid,
/area/hallway/station/docks)
"ozk" = (
@@ -36210,7 +36190,7 @@ afo
afo
ahI
ais
-aAx
+afW
aun
aun
aun
diff --git a/maps/tether/levels/station2.dmm b/maps/tether/levels/station2.dmm
index f96d53f0fd87..009d1d0e59cf 100644
--- a/maps/tether/levels/station2.dmm
+++ b/maps/tether/levels/station2.dmm
@@ -17526,6 +17526,19 @@
/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
/turf/simulated/floor/plating,
/area/maintenance/station/eng_upper)
+"iKU" = (
+/obj/structure/cable/cyan{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/holopad/ship,
+/turf/simulated/floor/tiled/techmaint,
+/area/shuttle/excursion/general)
"iMR" = (
/obj/machinery/door/firedoor/glass,
/obj/structure/grille,
@@ -39356,7 +39369,7 @@ wOr
vSZ
pGy
vvg
-hfq
+iKU
ekt
wPf
arr
diff --git a/maps/tether/levels/surface3.dmm b/maps/tether/levels/surface3.dmm
index 407ce590c801..92e391a7f36e 100644
--- a/maps/tether/levels/surface3.dmm
+++ b/maps/tether/levels/surface3.dmm
@@ -13115,28 +13115,6 @@
},
/turf/simulated/floor/tiled,
/area/rnd/research)
-"axb" = (
-/obj/structure/disposalpipe/segment,
-/obj/effect/floor_decal/borderfloor{
- dir = 8
- },
-/obj/effect/floor_decal/steeldecal/steel_decals7{
- dir = 5
- },
-/obj/effect/floor_decal/steeldecal/steel_decals7{
- dir = 6
- },
-/obj/effect/floor_decal/corner/blue/border{
- dir = 8
- },
-/obj/effect/floor_decal/borderfloor/corner2{
- dir = 8
- },
-/obj/effect/floor_decal/corner/blue/bordercorner2{
- dir = 8
- },
-/turf/simulated/floor/tiled,
-/area/tether/surfacebase/surface_three_hall)
"axc" = (
/obj/structure/disposalpipe/segment,
/obj/effect/floor_decal/borderfloor{
@@ -14877,7 +14855,7 @@
/turf/simulated/floor/plating,
/area/rnd/xenobiology/xenoflora)
"aAi" = (
-/obj/machinery/holopad,
+/obj/machinery/holopad/ship,
/turf/simulated/floor/wood,
/area/library)
"aAk" = (
@@ -27288,7 +27266,6 @@
/turf/simulated/floor/wood,
/area/crew_quarters/captain)
"aYo" = (
-/obj/machinery/holopad,
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
@@ -27301,6 +27278,7 @@
/obj/structure/cable/green{
icon_state = "1-2"
},
+/obj/machinery/holopad/ship,
/turf/simulated/floor/tiled/dark,
/area/bridge)
"aYp" = (
@@ -30030,10 +30008,10 @@
/turf/simulated/floor/lino,
/area/crew_quarters/bar)
"bdw" = (
-/obj/machinery/holopad,
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/machinery/holopad/ship,
/turf/simulated/floor/wood,
/area/crew_quarters/bar)
"bdx" = (
@@ -37259,6 +37237,7 @@
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/holopad/ship,
/turf/simulated/floor/tiled/dark,
/area/shuttle/tourbus/general)
"kdx" = (
@@ -56569,7 +56548,7 @@ aqR
aZS
aZZ
anL
-axb
+vvA
viF
vKm
nlf
diff --git a/maps/triumph/engines.dm b/maps/triumph/engines.dm
index fa6824395162..b60a1920b55c 100644
--- a/maps/triumph/engines.dm
+++ b/maps/triumph/engines.dm
@@ -21,8 +21,10 @@
suffix = "burn.dmm"
display_name = list("Toxins Lab", "We Knew You Liked Tether Fires, so we Brought One in a Box", "100 Solarmoths", "Teshari's Bane")
+/*
/datum/map_template/engine/triumph/fission
name = "ProcEngine_Triumph_Fission"
desc = "The Fission Reactor"
suffix = "fission.dmm"
display_name = list("Chernobyl", "Not as Cool as the Stormdrive", "Radiation Rework", "Spicy Sticks")
+*/
diff --git a/maps/triumph/engines/rust.dmm b/maps/triumph/engines/rust.dmm
index 2b69a29a0b27..e8795297c645 100644
--- a/maps/triumph/engines/rust.dmm
+++ b/maps/triumph/engines/rust.dmm
@@ -896,9 +896,10 @@
/turf/simulated/floor/tiled/techfloor/grid,
/area/engineering/engine_room)
"Gf" = (
+/obj/fiftyspawner/tritium,
/obj/structure/table/reinforced,
/obj/fiftyspawner/deuterium,
-/obj/fiftyspawner/tritium,
+/obj/fiftyspawner/deuterium,
/turf/simulated/floor/tiled/techfloor/grid,
/area/engineering/engine_room)
"Gq" = (
diff --git a/maps/triumph/levels/deck2.dmm b/maps/triumph/levels/deck2.dmm
index 1fbb8bfcc785..0bfec7bf9826 100644
--- a/maps/triumph/levels/deck2.dmm
+++ b/maps/triumph/levels/deck2.dmm
@@ -12014,7 +12014,7 @@
/turf/simulated/floor/tiled/white,
/area/crew_quarters/sleep/Dorm_11)
"Km" = (
-/obj/machinery/holopad,
+/obj/machinery/holopad/ship,
/turf/simulated/floor/tiled/dark,
/area/crew_quarters/bar)
"Ko" = (
@@ -15915,6 +15915,7 @@
/obj/structure/cable{
icon_state = "1-4"
},
+/obj/machinery/holopad/ship,
/turf/simulated/floor/tiled/steel,
/area/shuttle/mining_ship/general)
"We" = (
diff --git a/maps/triumph/levels/deck3.dmm b/maps/triumph/levels/deck3.dmm
index 8a96fef650f3..34cc63926399 100644
--- a/maps/triumph/levels/deck3.dmm
+++ b/maps/triumph/levels/deck3.dmm
@@ -4550,6 +4550,10 @@
},
/turf/simulated/floor/bluegrid,
/area/rnd/xenobiology)
+"dWe" = (
+/obj/landmark/spawnpoint/latejoin/station/cyborg,
+/turf/simulated/floor/tiled/old_cargo/gray,
+/area/assembly/robotics)
"dWq" = (
/obj/machinery/atmospherics/pipe/simple/hidden/black,
/obj/structure/cable/green{
@@ -4791,6 +4795,7 @@
/obj/structure/cable/green{
icon_state = "1-8"
},
+/obj/machinery/holopad/ship,
/turf/simulated/floor/tiled/white,
/area/shuttle/emt/general)
"eeE" = (
@@ -6647,7 +6652,7 @@
"fJP" = (
/obj/machinery/camera/network/research{
dir = 8;
- network = list("Research","Toxins Test Area")
+ network = list("Research","Toxins Test Area")
},
/turf/simulated/floor/tiled/old_cargo/gray,
/area/assembly/robotics/surgery)
@@ -8624,7 +8629,7 @@
/obj/effect/floor_decal/industrial/warning/full,
/obj/machinery/camera/network/research{
dir = 6;
- network = list("Research","Toxins Test Area")
+ network = list("Research","Toxins Test Area")
},
/obj/structure/closet/hydrant{
pixel_y = 32
@@ -9049,7 +9054,7 @@
/obj/machinery/transhuman/synthprinter,
/obj/machinery/camera/network/research{
dir = 8;
- network = list("Research","Toxins Test Area")
+ network = list("Research","Toxins Test Area")
},
/turf/simulated/floor/tiled/old_cargo/purple,
/area/assembly/robotics)
@@ -9582,7 +9587,7 @@
"iiV" = (
/obj/machinery/camera/network/research{
dir = 8;
- network = list("Research","Toxins Test Area")
+ network = list("Research","Toxins Test Area")
},
/obj/effect/floor_decal/borderfloor{
dir = 4
@@ -14381,7 +14386,7 @@
"mrJ" = (
/obj/machinery/camera/network/research{
dir = 8;
- network = list("Research","Toxins Test Area")
+ network = list("Research","Toxins Test Area")
},
/obj/structure/closet/secure_closet/guncabinet/robotics,
/turf/simulated/floor/tiled/techfloor,
@@ -15073,7 +15078,7 @@
},
/obj/machinery/camera/network/research{
dir = 8;
- network = list("Research","Toxins Test Area")
+ network = list("Research","Toxins Test Area")
},
/turf/simulated/floor/tiled,
/area/rnd/test_area)
@@ -18011,7 +18016,7 @@
"pmN" = (
/obj/machinery/camera/network/research{
dir = 8;
- network = list("Research","Toxins Test Area")
+ network = list("Research","Toxins Test Area")
},
/obj/effect/floor_decal/borderfloor{
dir = 4
@@ -18978,7 +18983,7 @@
name = "Burn Chamber Air Control";
output_tag = "burn_out";
pressure_setting = 0;
- sensors = list("burn_sensor"="Burn Chamber")
+ sensors = list("burn_sensor"="Burn Chamber")
},
/obj/machinery/button/ignition{
id = "burn_chamber";
@@ -26133,7 +26138,7 @@
/obj/item/suit_cooling_unit,
/obj/machinery/camera/network/research{
dir = 8;
- network = list("Research","Toxins Test Area")
+ network = list("Research","Toxins Test Area")
},
/turf/simulated/floor/tiled,
/area/rnd/anomaly_lab)
@@ -26959,6 +26964,10 @@
},
/turf/simulated/floor/tiled/white,
/area/medical/psych_ward)
+"whU" = (
+/obj/landmark/spawnpoint/job/cyborg,
+/turf/simulated/floor/tiled/techfloor,
+/area/assembly/chargebay)
"whY" = (
/obj/machinery/light{
dir = 1
@@ -34688,7 +34697,7 @@ ixf
vGq
wLK
vGq
-vGq
+dWe
wgM
wor
fUO
@@ -36105,7 +36114,7 @@ biL
jgu
wQJ
dXc
-jEz
+whU
rLt
sGT
oYT
@@ -36247,7 +36256,7 @@ fJP
afy
sGT
mrJ
-jEz
+whU
rLt
sGT
vQV
diff --git a/maps/triumph/levels/deck4.dmm b/maps/triumph/levels/deck4.dmm
index ffde4d85dd17..6751b5dbe1f3 100644
--- a/maps/triumph/levels/deck4.dmm
+++ b/maps/triumph/levels/deck4.dmm
@@ -907,8 +907,6 @@
/turf/simulated/floor/tiled,
/area/bridge/hallway)
"aMe" = (
-/obj/machinery/door/firedoor/glass,
-/obj/structure/grille,
/obj/machinery/door/blast/regular{
density = 0;
icon_state = "pdoor0";
@@ -922,16 +920,10 @@
/obj/structure/cable/green{
icon_state = "2-4"
},
-/obj/structure/window/phoronreinforced{
- dir = 8
- },
-/obj/structure/window/phoronreinforced{
- dir = 4
- },
-/obj/structure/window/phoronreinforced/full,
/obj/structure/curtain/black{
anchored = 1
},
+/obj/spawner/window/low_wall/borosillicate/reinforced/full/firelocks,
/turf/simulated/floor,
/area/security/brig)
"aME" = (
@@ -1084,13 +1076,13 @@
/turf/simulated/floor/tiled,
/area/security/warden)
"aTx" = (
-/obj/machinery/holopad,
/obj/machinery/turretid/lethal{
pixel_x = -35
},
/obj/machinery/light{
dir = 8
},
+/obj/machinery/holopad/ship,
/turf/simulated/floor/tiled/dark,
/area/bridge)
"aUx" = (
@@ -1479,12 +1471,10 @@
/turf/simulated/floor/plating,
/area/maintenance/security/starboard)
"bkw" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green{
icon_state = "0-4"
},
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/security/breakroom)
"bky" = (
@@ -2430,12 +2420,10 @@
/turf/simulated/floor/tiled/dark,
/area/security/warden)
"bSB" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green{
icon_state = "0-8"
},
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/security/range)
"bTf" = (
@@ -2469,6 +2457,7 @@
/obj/machinery/recharger/wallcharger{
pixel_x = -22
},
+/obj/machinery/camera/network/security,
/turf/simulated/floor/tiled/dark,
/area/security/riot_control)
"bVh" = (
@@ -2529,6 +2518,9 @@
/obj/effect/floor_decal/corner/red{
dir = 9
},
+/obj/machinery/light{
+ dir = 8
+ },
/turf/simulated/floor/tiled/dark,
/area/security/riot_control)
"bWp" = (
@@ -2729,6 +2721,13 @@
/obj/item/flashlight/lamp,
/turf/simulated/floor/tiled/dark,
/area/bridge)
+"cdE" = (
+/obj/structure/cable/cyan{
+ icon_state = "4-8"
+ },
+/obj/machinery/holopad/ship,
+/turf/simulated/floor/tiled,
+/area/shuttle/excursion/general)
"ceg" = (
/obj/machinery/shield_diffuser,
/turf/simulated/floor/airless/ceiling,
@@ -2966,8 +2965,6 @@
/turf/simulated/floor/tiled/dark,
/area/gateway)
"cnI" = (
-/obj/machinery/door/firedoor/glass,
-/obj/structure/grille,
/obj/machinery/door/blast/regular{
density = 0;
icon_state = "pdoor0";
@@ -2976,13 +2973,7 @@
opacity = 0
},
/obj/structure/cable/green,
-/obj/structure/window/phoronreinforced{
- dir = 8
- },
-/obj/structure/window/phoronreinforced{
- dir = 4
- },
-/obj/structure/window/phoronreinforced/full,
+/obj/spawner/window/low_wall/borosillicate/reinforced/full/firelocks,
/turf/simulated/floor,
/area/security/brig)
"cnK" = (
@@ -4923,6 +4914,14 @@
/obj/effect/floor_decal/corner/red{
dir = 6
},
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/machinery/firealarm{
+ dir = 4;
+ layer = 3.3;
+ pixel_x = 26
+ },
/turf/simulated/floor/tiled/dark,
/area/security/riot_control)
"dOp" = (
@@ -5032,6 +5031,24 @@
/obj/effect/floor_decal/corner/red{
dir = 6
},
+/obj/item/cell/device/weapon{
+ pixel_x = 3
+ },
+/obj/item/cell/device/weapon{
+ pixel_x = 3
+ },
+/obj/item/cell/device/weapon{
+ pixel_x = 3
+ },
+/obj/item/cell/device/weapon{
+ pixel_x = 3
+ },
+/obj/item/cell/device/weapon{
+ pixel_x = 3
+ },
+/obj/item/cell/device/weapon{
+ pixel_x = 3
+ },
/turf/simulated/floor/tiled/dark,
/area/security/security_equiptment_storage)
"dSN" = (
@@ -6192,6 +6209,94 @@
/obj/machinery/atmospherics/pipe/simple/hidden,
/turf/simulated/floor/tiled/dark,
/area/hallway/secondary/docking_hallway)
+"eGF" = (
+/obj/effect/floor_decal/industrial/outline/blue,
+/obj/structure/table/rack/shelf/steel,
+/obj/item/clothing/accessory/armor/armorplate/medium{
+ pixel_x = 5;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/medium{
+ pixel_x = 5;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/medium{
+ pixel_x = 5;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/medium{
+ pixel_x = 5;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/medium{
+ pixel_x = 5;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/medium{
+ pixel_x = -4;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/medium{
+ pixel_x = -4;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/medium{
+ pixel_x = -4;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/medium{
+ pixel_x = -4;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/medium{
+ pixel_x = -4;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/mediumtreated{
+ pixel_x = -4;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate/mediumtreated{
+ pixel_x = -4;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate/mediumtreated{
+ pixel_x = -4;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate/mediumtreated{
+ pixel_x = -4;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate/mediumtreated{
+ pixel_x = -4;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate/mediumtreated{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate/mediumtreated{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate/mediumtreated{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate/mediumtreated{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate/mediumtreated{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/dark,
+/area/security/armoury)
"eGK" = (
/obj/structure/table/woodentable,
/obj/item/radio/off,
@@ -6543,8 +6648,6 @@
/turf/simulated/floor/tiled/dark,
/area/security/armoury)
"ePd" = (
-/obj/machinery/door/firedoor/glass,
-/obj/structure/grille,
/obj/machinery/door/blast/regular{
density = 0;
icon_state = "pdoor0";
@@ -6553,16 +6656,10 @@
opacity = 0
},
/obj/structure/cable/green,
-/obj/structure/window/phoronreinforced{
- dir = 8
- },
-/obj/structure/window/phoronreinforced{
- dir = 4
- },
-/obj/structure/window/phoronreinforced/full,
/obj/structure/curtain/black{
anchored = 1
},
+/obj/spawner/window/low_wall/borosillicate/reinforced/full/firelocks,
/turf/simulated/floor,
/area/security/brig)
"ePg" = (
@@ -6734,16 +6831,6 @@
/turf/simulated/floor/tiled/dark,
/area/hallway/secondary/docking_hallway)
"eWD" = (
-/obj/machinery/door/firedoor/glass,
-/obj/structure/grille,
-/obj/structure/window/reinforced/polarized{
- dir = 10;
- icon_state = "fwindow";
- id = "sec_processing"
- },
-/obj/structure/window/reinforced{
- dir = 1
- },
/obj/structure/cable/green{
icon_state = "0-2"
},
@@ -6757,6 +6844,9 @@
name = "Security Blast Doors";
opacity = 0
},
+/obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks{
+ id = "sec_processing"
+ },
/turf/simulated/floor/plating,
/area/security/lobby)
"eWF" = (
@@ -6784,22 +6874,9 @@
/turf/simulated/floor/carpet,
/area/maintenance/security/starboard)
"eWL" = (
-/obj/machinery/door/firedoor/glass,
-/obj/structure/grille,
-/obj/structure/window/reinforced/polarized{
- dir = 10;
- icon_state = "fwindow";
- id = "sec_processing"
- },
-/obj/structure/window/reinforced{
- dir = 1
- },
/obj/structure/cable/green{
icon_state = "0-8"
},
-/obj/structure/window/reinforced{
- dir = 4
- },
/obj/machinery/door/blast/regular{
density = 0;
icon_state = "pdoor0";
@@ -6807,6 +6884,9 @@
name = "Security Blast Doors";
opacity = 0
},
+/obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks{
+ id = "sec_processing"
+ },
/turf/simulated/floor/plating,
/area/security/lobby)
"eXf" = (
@@ -8831,30 +8911,30 @@
/turf/simulated/floor/tiled,
/area/hallway/primary/aft)
"gzM" = (
-/obj/structure/table/rack/steel,
+/obj/structure/table/rack/shelf/steel,
/obj/structure/window/reinforced{
dir = 1
},
-/obj/item/clothing/shoes/leg_guard/riot,
-/obj/item/clothing/gloves/arm_guard/riot,
-/obj/item/clothing/mask/balaclava,
-/obj/item/clothing/suit/armor/riot,
-/obj/item/clothing/head/helmet/riot,
-/obj/item/shield/riot,
-/obj/item/melee/baton/loaded,
-/obj/effect/floor_decal/borderfloorblack{
- dir = 1
+/obj/effect/floor_decal/industrial/outline/red,
+/obj/item/clothing/suit/armor/pcarrier/ballistic{
+ pixel_x = -5;
+ pixel_y = -2
},
-/obj/effect/floor_decal/corner/blue/border{
- dir = 1
+/obj/item/clothing/suit/armor/pcarrier/ballistic{
+ pixel_x = -5;
+ pixel_y = -2
+ },
+/obj/item/clothing/suit/armor/pcarrier/ballistic{
+ pixel_x = 5;
+ pixel_y = -2
+ },
+/obj/item/clothing/suit/armor/pcarrier/ballistic{
+ pixel_x = 5;
+ pixel_y = -2
},
/obj/effect/floor_decal/corner/red{
dir = 5
},
-/obj/effect/floor_decal/industrial/outline/red,
-/obj/machinery/light{
- dir = 1
- },
/turf/simulated/floor/tiled/dark,
/area/security/riot_control)
"gzW" = (
@@ -9582,12 +9662,10 @@
/turf/simulated/floor/tiled,
/area/triumph/surfacebase/sauna)
"heB" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green{
icon_state = "0-8"
},
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/security/forensics)
"heR" = (
@@ -9705,13 +9783,11 @@
/turf/simulated/floor/tiled,
/area/exploration/excursion_dock)
"hhJ" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green,
/obj/structure/cable/green{
icon_state = "1-8"
},
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/security/breakroom)
"hhP" = (
@@ -10060,9 +10136,7 @@
/turf/simulated/floor/tiled/dark,
/area/hallway/primary/aft)
"hvN" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/security/brig)
"hvO" = (
@@ -10662,8 +10736,6 @@
/area/exploration/explorer_prep)
"hOa" = (
/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green,
/obj/machinery/door/blast/regular{
density = 0;
@@ -10672,6 +10744,7 @@
name = "Security Blast Doors";
opacity = 0
},
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/prison/cell_block)
"hOO" = (
@@ -11631,12 +11704,10 @@
/turf/simulated/floor/tiled,
/area/hallway/primary/aft)
"ity" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green{
icon_state = "0-2"
},
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/security/lobby)
"itM" = (
@@ -11988,12 +12059,6 @@
/turf/simulated/floor/tiled/old_cargo/red,
/area/security/security_processing)
"iGE" = (
-/obj/effect/floor_decal/corner/black{
- dir = 9
- },
-/obj/effect/floor_decal/corner/black{
- dir = 6
- },
/obj/structure/cable/green{
icon_state = "2-8"
},
@@ -12141,6 +12206,33 @@
},
/turf/simulated/floor/tiled,
/area/security/lobby)
+"iOd" = (
+/obj/structure/table/rack/shelf/steel,
+/obj/effect/floor_decal/corner/red{
+ dir = 6
+ },
+/obj/effect/floor_decal/corner/red{
+ dir = 9
+ },
+/obj/effect/floor_decal/industrial/outline/yellow,
+/obj/item/storage/box/survival_knife{
+ pixel_x = -4;
+ pixel_y = 4
+ },
+/obj/item/storage/box/survival_knife{
+ pixel_x = 4;
+ pixel_y = -4
+ },
+/obj/item/storage/box/survival_knife{
+ pixel_x = 4;
+ pixel_y = 4
+ },
+/obj/item/storage/box/survival_knife{
+ pixel_x = -4;
+ pixel_y = -4
+ },
+/turf/simulated/floor/tiled/dark,
+/area/security/security_equiptment_storage)
"iOF" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 9
@@ -12443,12 +12535,10 @@
/turf/simulated/floor/carpet,
/area/security/detectives_office)
"jao" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green{
icon_state = "0-4"
},
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/security/brig)
"jaC" = (
@@ -12648,16 +12738,6 @@
/turf/simulated/floor/tiled/white,
/area/crew_quarters/heads/hos)
"jik" = (
-/obj/machinery/door/firedoor/glass,
-/obj/structure/grille,
-/obj/structure/window/reinforced/polarized{
- dir = 10;
- icon_state = "fwindow";
- id = "sec_processing"
- },
-/obj/structure/window/reinforced{
- dir = 1
- },
/obj/structure/cable/green{
icon_state = "0-2"
},
@@ -12668,6 +12748,9 @@
name = "Security Blast Doors";
opacity = 0
},
+/obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks{
+ id = "sec_processing"
+ },
/turf/simulated/floor/plating,
/area/security/lobby)
"jiv" = (
@@ -13303,19 +13386,31 @@
/turf/simulated/floor/tiled/dark,
/area/bridge)
"jIK" = (
-/obj/structure/table/rack/steel,
-/obj/structure/window/reinforced,
-/obj/item/clothing/shoes/leg_guard/laserproof,
-/obj/item/clothing/gloves/arm_guard/laserproof,
-/obj/item/clothing/suit/armor/laserproof,
-/obj/item/clothing/head/helmet/ablative,
+/obj/structure/table/rack/shelf/steel,
+/obj/effect/floor_decal/industrial/outline/red,
+/obj/item/clothing/suit/armor/pcarrier/ablative{
+ pixel_x = -5;
+ pixel_y = -2
+ },
+/obj/item/clothing/suit/armor/pcarrier/ablative{
+ pixel_x = -5;
+ pixel_y = -2
+ },
+/obj/item/clothing/suit/armor/pcarrier/ablative{
+ pixel_x = 5;
+ pixel_y = -2
+ },
+/obj/item/clothing/suit/armor/pcarrier/ablative{
+ pixel_x = 5;
+ pixel_y = -2
+ },
/obj/effect/floor_decal/corner/red{
dir = 10
},
-/obj/effect/floor_decal/industrial/outline/red,
/obj/structure/window/reinforced{
dir = 8
},
+/obj/structure/window/reinforced,
/turf/simulated/floor/tiled/dark,
/area/security/riot_control)
"jJc" = (
@@ -15942,20 +16037,64 @@
/turf/simulated/floor/plating,
/area/maintenance/central)
"lDQ" = (
-/obj/structure/table/rack/steel,
/obj/machinery/atmospherics/component/unary/vent_scrubber/on{
dir = 1
},
-/obj/item/clothing/shoes/leg_guard/combat,
-/obj/item/clothing/gloves/arm_guard/combat,
-/obj/item/clothing/suit/armor/combat,
-/obj/item/clothing/head/helmet/combat,
/obj/effect/floor_decal/corner/black/full,
/obj/effect/floor_decal/industrial/outline/grey,
/obj/machinery/alarm{
dir = 1;
pixel_y = -22
},
+/obj/structure/table/rack/shelf/steel,
+/obj/item/clothing/accessory/armor/armorplate/heavy{
+ pixel_x = -4;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/heavy{
+ pixel_x = -4;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/heavy{
+ pixel_x = -4;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/ballistic{
+ pixel_x = -4;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate/ballistic{
+ pixel_x = -4;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate/ballistic{
+ pixel_x = -4;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate/combat{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate/combat{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate/combat{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate/tactical{
+ pixel_x = 5;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/tactical{
+ pixel_x = 5;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/tactical{
+ pixel_x = 5;
+ pixel_y = -3
+ },
/turf/simulated/floor/tiled/dark,
/area/security/tactical)
"lEt" = (
@@ -16098,10 +16237,8 @@
/turf/simulated/floor/tiled,
/area/security/eva)
"lIz" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green,
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/prison/cell_block)
"lIC" = (
@@ -16481,7 +16618,7 @@
"lWJ" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/holopad,
+/obj/machinery/holopad/ship,
/turf/simulated/floor/wood,
/area/library)
"lXk" = (
@@ -16734,6 +16871,9 @@
/obj/effect/floor_decal/corner/red{
dir = 9
},
+/obj/machinery/light{
+ dir = 8
+ },
/turf/simulated/floor/tiled/dark,
/area/security/riot_control)
"mhX" = (
@@ -17771,8 +17911,6 @@
/turf/simulated/floor/tiled,
/area/security/brig)
"mWQ" = (
-/obj/machinery/door/firedoor/glass,
-/obj/structure/grille,
/obj/machinery/door/blast/regular{
density = 0;
icon_state = "pdoor0";
@@ -17786,13 +17924,7 @@
/obj/structure/cable/green{
icon_state = "2-4"
},
-/obj/structure/window/phoronreinforced{
- dir = 8
- },
-/obj/structure/window/phoronreinforced{
- dir = 4
- },
-/obj/structure/window/phoronreinforced/full,
+/obj/spawner/window/low_wall/borosillicate/reinforced/full/firelocks,
/turf/simulated/floor,
/area/security/brig)
"mWX" = (
@@ -18570,12 +18702,10 @@
/turf/simulated/floor/carpet/tealcarpet,
/area/maintenance/central)
"nBV" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green{
icon_state = "0-2"
},
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/security/warden)
"nBX" = (
@@ -19328,6 +19458,9 @@
/obj/item/ammo_magazine/m762,
/obj/item/gun/ballistic/automatic/z8,
/obj/effect/floor_decal/industrial/outline/grey,
+/obj/machinery/light{
+ dir = 4
+ },
/turf/simulated/floor/tiled/dark,
/area/security/tactical)
"ois" = (
@@ -19594,9 +19727,7 @@
/turf/simulated/floor/carpet/bcarpet,
/area/library)
"ooz" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/security/breakroom)
"ooF" = (
@@ -19777,6 +19908,9 @@
},
/turf/simulated/floor/carpet/bcarpet,
/area/crew_quarters/mimeoffice)
+"ovC" = (
+/turf/space/basic,
+/area/space)
"ovY" = (
/obj/structure/catwalk,
/obj/structure/cable{
@@ -20016,7 +20150,6 @@
/turf/simulated/floor/plating,
/area/maintenance/security/starboard)
"oFW" = (
-/obj/mecha/working/hoverpod/shuttlecraft,
/obj/effect/floor_decal/industrial/danger{
dir = 10
},
@@ -20024,6 +20157,7 @@
dir = 8
},
/obj/machinery/mech_recharger,
+/obj/mecha/combat/fighter/baron/sec/loaded,
/turf/simulated/floor/tiled/old_cargo/gray,
/area/security/hanger)
"oFY" = (
@@ -20097,14 +20231,12 @@
/turf/simulated/floor/tiled/dark,
/area/exploration/courser_dock)
"oIi" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/polarized/full{
- id = "hos_office"
- },
/obj/structure/cable/green{
icon_state = "0-2"
},
+/obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks{
+ id = "hos_office"
+ },
/turf/simulated/floor/plating,
/area/crew_quarters/heads/hos)
"oIP" = (
@@ -20338,8 +20470,6 @@
/turf/simulated/open,
/area/medical/patient_wing)
"oRJ" = (
-/obj/machinery/door/firedoor/glass,
-/obj/structure/grille,
/obj/machinery/door/blast/regular{
density = 0;
icon_state = "pdoor0";
@@ -20347,11 +20477,7 @@
name = "Security Blast Doors";
opacity = 0
},
-/obj/structure/window/phoronreinforced,
-/obj/structure/window/phoronreinforced{
- dir = 1
- },
-/obj/structure/window/phoronreinforced/full,
+/obj/spawner/window/low_wall/borosillicate/reinforced/full/firelocks,
/turf/simulated/floor,
/area/security/hanger)
"oRN" = (
@@ -20383,12 +20509,10 @@
/turf/simulated/floor/tiled/dark,
/area/hallway/primary/aft)
"oTf" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green{
icon_state = "0-2"
},
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/security/prison)
"oTs" = (
@@ -21045,10 +21169,8 @@
/turf/simulated/shuttle/wall/voidcraft/hard_corner,
/area/shuttle/civvie/general)
"pkC" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green,
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/security/range)
"plC" = (
@@ -21993,6 +22115,10 @@
},
/turf/simulated/floor/tiled,
/area/exploration/explorer_prep)
+"pXk" = (
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
+/turf/simulated/floor/plating,
+/area/security/lobby)
"pXl" = (
/obj/effect/floor_decal/techfloor,
/obj/landmark/spawnpoint/latejoin/station/shuttle_dock,
@@ -22646,6 +22772,7 @@
icon_state = "1-2"
},
/obj/structure/catwalk,
+/obj/machinery/holopad/ship,
/turf/simulated/floor/plating,
/area/shuttle/courser/cockpit)
"qpA" = (
@@ -22653,13 +22780,11 @@
/turf/simulated/floor/carpet/bcarpet,
/area/security/breakroom)
"qpW" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green,
/obj/structure/cable/green{
icon_state = "1-2"
},
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/security/lobby)
"qpZ" = (
@@ -23091,17 +23216,15 @@
/turf/simulated/floor/tiled/dark,
/area/security/armoury)
"qEu" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/polarized/full{
- id = "hos_office"
- },
/obj/structure/cable/green{
icon_state = "0-2"
},
/obj/structure/cable/green{
icon_state = "2-4"
},
+/obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks{
+ id = "hos_office"
+ },
/turf/simulated/floor/plating,
/area/crew_quarters/heads/hos)
"qFh" = (
@@ -23420,11 +23543,10 @@
/area/hallway/secondary/docking_hallway)
"qPg" = (
/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green{
icon_state = "0-8"
},
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/prison/cell_block)
"qPI" = (
@@ -23446,12 +23568,10 @@
/turf/simulated/floor/tiled,
/area/exploration/explorer_prep)
"qQW" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green{
icon_state = "0-2"
},
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/security/security_lockerroom)
"qRg" = (
@@ -23462,11 +23582,6 @@
/turf/simulated/floor/wood,
/area/bridge/meeting_room)
"qRE" = (
-/obj/structure/table/rack/steel,
-/obj/item/clothing/shoes/leg_guard/combat,
-/obj/item/clothing/gloves/arm_guard/combat,
-/obj/item/clothing/suit/armor/combat,
-/obj/item/clothing/head/helmet/combat,
/obj/machinery/light,
/obj/effect/floor_decal/corner/black/full{
dir = 4
@@ -23478,6 +23593,40 @@
name = "east bump";
pixel_x = 24
},
+/obj/structure/table/rack/shelf/steel,
+/obj/item/clothing/head/helmet/ballistic{
+ pixel_x = -5;
+ pixel_y = 5
+ },
+/obj/item/clothing/head/helmet/combat{
+ pixel_x = -5;
+ pixel_y = -7
+ },
+/obj/item/clothing/head/helmet/ballistic{
+ pixel_x = -5;
+ pixel_y = 5
+ },
+/obj/item/clothing/head/helmet/ballistic{
+ pixel_x = -5;
+ pixel_y = 5
+ },
+/obj/item/clothing/head/helmet/combat{
+ pixel_x = -5;
+ pixel_y = -7
+ },
+/obj/item/clothing/head/helmet/combat{
+ pixel_x = -5;
+ pixel_y = -7
+ },
+/obj/item/shield/riot/tower/swat{
+ pixel_x = 4
+ },
+/obj/item/shield/riot/tower/swat{
+ pixel_x = 4
+ },
+/obj/item/shield/riot/tower/swat{
+ pixel_x = 4
+ },
/turf/simulated/floor/tiled/dark,
/area/security/tactical)
"qRG" = (
@@ -23739,14 +23888,6 @@
/area/bridge)
"qZL" = (
/obj/structure/table/rack/shelf/steel,
-/obj/item/clothing/suit/armor/vest/wolftaur{
- pixel_x = -16;
- pixel_y = 4
- },
-/obj/item/clothing/suit/armor/vest/wolftaur{
- pixel_x = -12;
- pixel_y = 9
- },
/obj/effect/floor_decal/corner/red{
dir = 6
},
@@ -23754,6 +23895,198 @@
dir = 9
},
/obj/effect/floor_decal/industrial/outline/yellow,
+/obj/item/clothing/accessory/armor/armorplate{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/item/clothing/accessory/armor/armorplate/stab{
+ pixel_x = 5;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/stab{
+ pixel_x = 5;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/stab{
+ pixel_x = 5;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/stab{
+ pixel_x = 5;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/stab{
+ pixel_x = 5;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/stab{
+ pixel_x = 5;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/stab{
+ pixel_x = 5;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/stab{
+ pixel_x = 5;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/stab{
+ pixel_x = 5;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/stab{
+ pixel_x = 5;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/stab{
+ pixel_x = 5;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/armorplate/stab{
+ pixel_x = 5;
+ pixel_y = -3
+ },
+/obj/item/clothing/accessory/armor/tag/nts{
+ pixel_x = -5;
+ pixel_y = 9
+ },
+/obj/item/clothing/accessory/armor/tag/nts{
+ pixel_x = -5;
+ pixel_y = 6
+ },
+/obj/item/clothing/accessory/armor/tag/nts{
+ pixel_x = -5;
+ pixel_y = 9
+ },
+/obj/item/clothing/accessory/armor/tag/nts{
+ pixel_x = -5;
+ pixel_y = 6
+ },
+/obj/item/clothing/accessory/armor/tag/nts{
+ pixel_x = -5;
+ pixel_y = 9
+ },
+/obj/item/clothing/accessory/armor/tag/nts{
+ pixel_x = -5;
+ pixel_y = 6
+ },
+/obj/item/clothing/accessory/armor/tag/nts{
+ pixel_x = -5;
+ pixel_y = 9
+ },
+/obj/item/clothing/accessory/armor/tag/nts{
+ pixel_x = -5;
+ pixel_y = 6
+ },
+/obj/item/clothing/accessory/armor/tag/nts{
+ pixel_x = -5;
+ pixel_y = 9
+ },
+/obj/item/clothing/accessory/armor/tag/nts{
+ pixel_x = -5;
+ pixel_y = 6
+ },
+/obj/item/clothing/accessory/armor/tag/nts{
+ pixel_x = -5;
+ pixel_y = 9
+ },
+/obj/item/clothing/accessory/armor/tag/nts{
+ pixel_x = -5;
+ pixel_y = 6
+ },
+/obj/item/clothing/accessory/armor/tag/ntc{
+ pixel_y = 3;
+ pixel_x = -5
+ },
+/obj/item/clothing/accessory/armor/tag/ntc{
+ pixel_y = 3;
+ pixel_x = -5
+ },
+/obj/item/clothing/head/helmet{
+ pixel_x = -6;
+ pixel_y = -6
+ },
+/obj/item/clothing/head/helmet{
+ pixel_x = -6;
+ pixel_y = -6
+ },
+/obj/item/clothing/head/helmet{
+ pixel_x = -6;
+ pixel_y = -6
+ },
+/obj/item/clothing/head/helmet{
+ pixel_x = -6;
+ pixel_y = -6
+ },
+/obj/item/clothing/head/helmet{
+ pixel_x = -6;
+ pixel_y = -6
+ },
+/obj/item/clothing/head/helmet{
+ pixel_x = -6;
+ pixel_y = -6
+ },
+/obj/item/clothing/head/helmet{
+ pixel_x = -6;
+ pixel_y = -6
+ },
+/obj/item/clothing/head/helmet{
+ pixel_x = -6;
+ pixel_y = -6
+ },
+/obj/item/clothing/head/helmet{
+ pixel_x = -6;
+ pixel_y = -6
+ },
+/obj/item/clothing/head/helmet{
+ pixel_x = -6;
+ pixel_y = -6
+ },
/turf/simulated/floor/tiled/dark,
/area/security/security_equiptment_storage)
"qZU" = (
@@ -24440,10 +24773,8 @@
/turf/simulated/floor/plating,
/area/exploration/explorer_prep)
"rzp" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green,
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/security/security_processing)
"rzr" = (
@@ -24953,18 +25284,66 @@
/turf/simulated/floor/grass,
/area/hydroponics/garden)
"rSC" = (
-/obj/structure/table/steel,
-/obj/structure/window/reinforced,
-/obj/structure/window/reinforced{
- dir = 4
+/obj/structure/table/rack/shelf/steel,
+/obj/effect/floor_decal/industrial/outline/red,
+/obj/machinery/light{
+ dir = 1
},
-/obj/item/storage/box/empslite{
- pixel_y = 3
+/obj/item/clothing/accessory/armor/armguards/ablative{
+ pixel_x = -4;
+ pixel_y = -5
+ },
+/obj/item/clothing/accessory/armor/armguards/ablative{
+ pixel_x = -4;
+ pixel_y = -5
+ },
+/obj/item/clothing/accessory/armor/armguards/ablative{
+ pixel_x = -4;
+ pixel_y = -5
+ },
+/obj/item/clothing/accessory/armor/armguards/ablative{
+ pixel_x = -4;
+ pixel_y = -5
+ },
+/obj/item/clothing/accessory/armor/legguards/ablative{
+ pixel_x = 5;
+ pixel_y = -7
+ },
+/obj/item/clothing/accessory/armor/legguards/ablative{
+ pixel_x = 5;
+ pixel_y = -7
+ },
+/obj/item/clothing/accessory/armor/legguards/ablative{
+ pixel_x = 5;
+ pixel_y = -7
+ },
+/obj/item/clothing/accessory/armor/legguards/ablative{
+ pixel_x = 5;
+ pixel_y = -7
+ },
+/obj/item/clothing/head/helmet/ablative{
+ pixel_x = 5;
+ pixel_y = 4
+ },
+/obj/item/clothing/head/helmet/ablative{
+ pixel_x = 5;
+ pixel_y = 4
+ },
+/obj/item/clothing/head/helmet/ablative{
+ pixel_x = -5;
+ pixel_y = 4
+ },
+/obj/item/clothing/head/helmet/ablative{
+ pixel_x = -5;
+ pixel_y = 4
},
/obj/effect/floor_decal/corner/red/full{
dir = 4
},
-/obj/effect/floor_decal/industrial/outline/red,
+/obj/structure/window/reinforced,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
/turf/simulated/floor/tiled/dark,
/area/security/riot_control)
"rTa" = (
@@ -25803,12 +26182,10 @@
/turf/simulated/floor/tiled/monotile,
/area/security/prison)
"sAd" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green{
icon_state = "0-4"
},
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/security/security_processing)
"sAi" = (
@@ -25852,11 +26229,56 @@
/turf/simulated/floor/tiled/dark,
/area/bridge)
"sBq" = (
-/obj/effect/floor_decal/corner/blue{
- dir = 9
+/obj/structure/table/rack/shelf/steel,
+/obj/effect/floor_decal/industrial/outline/blue,
+/obj/item/clothing/accessory/storage/pouches/large{
+ pixel_y = -2
+ },
+/obj/item/clothing/accessory/storage/pouches/large{
+ pixel_y = -2
+ },
+/obj/item/clothing/accessory/storage/pouches/large{
+ pixel_y = -2
+ },
+/obj/item/clothing/accessory/storage/pouches/large{
+ pixel_y = -2
+ },
+/obj/item/clothing/accessory/storage/pouches/large{
+ pixel_y = -2
+ },
+/obj/item/clothing/accessory/storage/pouches/large{
+ pixel_y = -2
+ },
+/obj/item/clothing/accessory/storage/pouches{
+ pixel_x = 6;
+ pixel_y = 10
+ },
+/obj/item/clothing/accessory/storage/pouches{
+ pixel_x = 6;
+ pixel_y = 10
+ },
+/obj/item/clothing/accessory/storage/pouches{
+ pixel_x = 6;
+ pixel_y = 10
+ },
+/obj/item/clothing/accessory/storage/pouches{
+ pixel_x = -5;
+ pixel_y = 10
+ },
+/obj/item/clothing/accessory/storage/pouches{
+ pixel_x = -5;
+ pixel_y = 10
+ },
+/obj/item/clothing/accessory/storage/pouches{
+ pixel_x = -5;
+ pixel_y = 10
+ },
+/obj/item/clothing/accessory/storage/pouches/large/navy{
+ pixel_y = 3
+ },
+/obj/item/clothing/accessory/storage/pouches/large/navy{
+ pixel_y = 4
},
-/obj/effect/floor_decal/industrial/hatch/yellow,
-/obj/machinery/deployable/barrier,
/turf/simulated/floor/tiled/dark,
/area/security/armoury)
"sBU" = (
@@ -26279,28 +26701,46 @@
/turf/simulated/floor/tiled/techfloor/grid,
/area/exploration/excursion_dock)
"sNZ" = (
+/obj/structure/table/rack/shelf/steel,
/obj/structure/window/reinforced{
dir = 1
},
-/obj/effect/floor_decal/borderfloorblack{
- dir = 1
+/obj/effect/floor_decal/industrial/outline/red,
+/obj/item/clothing/suit/armor/pcarrier/riot{
+ pixel_x = 5;
+ pixel_y = -2
},
-/obj/effect/floor_decal/corner/blue/border{
- dir = 1
+/obj/item/clothing/suit/armor/pcarrier/riot{
+ pixel_x = 5;
+ pixel_y = -2
+ },
+/obj/item/clothing/suit/armor/pcarrier/riot{
+ pixel_x = -5;
+ pixel_y = -2
+ },
+/obj/item/clothing/suit/armor/pcarrier/riot{
+ pixel_x = -5;
+ pixel_y = -2
},
/obj/effect/floor_decal/corner/red{
dir = 5
},
-/obj/effect/floor_decal/industrial/outline/red,
-/obj/machinery/camera/network/security,
-/obj/structure/table/rack/steel,
-/obj/item/clothing/shoes/leg_guard/riot,
-/obj/item/clothing/gloves/arm_guard/riot,
-/obj/item/clothing/mask/balaclava,
-/obj/item/clothing/suit/armor/riot,
-/obj/item/clothing/head/helmet/riot,
-/obj/item/shield/riot,
-/obj/item/melee/baton/loaded,
+/obj/item/shield/riot{
+ pixel_x = 11;
+ pixel_y = -3
+ },
+/obj/item/shield/riot{
+ pixel_x = 11;
+ pixel_y = -3
+ },
+/obj/item/shield/riot{
+ pixel_x = 11;
+ pixel_y = -3
+ },
+/obj/item/shield/riot{
+ pixel_x = 11;
+ pixel_y = -3
+ },
/turf/simulated/floor/tiled/dark,
/area/security/riot_control)
"sOc" = (
@@ -26764,11 +27204,11 @@
/turf/simulated/floor/tiled/old_tile/red,
/area/maintenance/security/starboard)
"ted" = (
-/obj/mecha/working/hoverpod/shuttlecraft,
/obj/effect/floor_decal/industrial/danger{
dir = 10
},
/obj/machinery/mech_recharger,
+/obj/mecha/combat/fighter/baron/sec/loaded,
/turf/simulated/floor/tiled/old_cargo/gray,
/area/security/hanger)
"teu" = (
@@ -27086,15 +27526,7 @@
/turf/simulated/floor/tiled,
/area/hallway/primary/aft)
"trW" = (
-/obj/machinery/door/firedoor/glass,
-/obj/structure/grille,
-/obj/structure/window/phoronreinforced{
- dir = 4
- },
-/obj/structure/window/phoronreinforced{
- dir = 8
- },
-/obj/structure/window/phoronreinforced/full,
+/obj/spawner/window/low_wall/borosillicate/reinforced/full/firelocks,
/turf/simulated/floor,
/area/security/hanger)
"tsv" = (
@@ -27182,6 +27614,7 @@
/obj/machinery/light{
dir = 4
},
+/obj/machinery/holopad/ship,
/turf/simulated/floor/tiled/old_tile/green,
/area/shuttle/civvie/general)
"tuN" = (
@@ -27358,11 +27791,56 @@
/turf/simulated/floor/carpet/bcarpet,
/area/chapel/main)
"tCO" = (
-/obj/machinery/deployable/barrier,
-/obj/effect/floor_decal/corner/blue{
- dir = 9
+/obj/effect/floor_decal/industrial/outline/blue,
+/obj/structure/table/rack/shelf/steel,
+/obj/item/clothing/head/helmet/combat{
+ pixel_x = 5;
+ pixel_y = -6
+ },
+/obj/item/clothing/head/helmet/combat{
+ pixel_x = -6;
+ pixel_y = -6
+ },
+/obj/item/clothing/head/helmet/combat{
+ pixel_x = -6;
+ pixel_y = 5
+ },
+/obj/item/clothing/head/helmet/combat{
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/item/clothing/head/helmet/combat{
+ pixel_x = -6;
+ pixel_y = -6
+ },
+/obj/item/clothing/head/helmet/combat{
+ pixel_x = -6;
+ pixel_y = -6
+ },
+/obj/item/clothing/head/helmet/combat{
+ pixel_x = 5;
+ pixel_y = -6
+ },
+/obj/item/clothing/head/helmet/combat{
+ pixel_x = 5;
+ pixel_y = -6
+ },
+/obj/item/clothing/head/helmet/combat{
+ pixel_x = -6;
+ pixel_y = 5
+ },
+/obj/item/clothing/head/helmet/combat{
+ pixel_x = -6;
+ pixel_y = 5
+ },
+/obj/item/clothing/head/helmet/combat{
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/item/clothing/head/helmet/combat{
+ pixel_x = 5;
+ pixel_y = 5
},
-/obj/effect/floor_decal/industrial/hatch/yellow,
/turf/simulated/floor/tiled/dark,
/area/security/armoury)
"tDb" = (
@@ -27687,14 +28165,12 @@
/turf/simulated/floor/plating,
/area/security/brig)
"tSR" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/polarized/full{
- id = "hos_office"
- },
/obj/structure/cable/green{
icon_state = "0-8"
},
+/obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks{
+ id = "hos_office"
+ },
/turf/simulated/floor/plating,
/area/crew_quarters/heads/hos)
"tTk" = (
@@ -28078,11 +28554,10 @@
/area/maintenance/security/starboard)
"ugB" = (
/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green{
icon_state = "0-2"
},
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/prison/cell_block)
"ugO" = (
@@ -28929,6 +29404,97 @@
/obj/fiftyspawner/steel,
/turf/simulated/floor/tiled,
/area/maintenance/tool_storage)
+"uOC" = (
+/obj/structure/table/rack/shelf/steel,
+/obj/effect/floor_decal/industrial/outline/blue,
+/obj/item/clothing/accessory/armor/legguards{
+ pixel_x = -3;
+ pixel_y = -4
+ },
+/obj/item/clothing/accessory/armor/legguards{
+ pixel_x = -3;
+ pixel_y = -4
+ },
+/obj/item/clothing/accessory/armor/legguards{
+ pixel_x = -3;
+ pixel_y = -4
+ },
+/obj/item/clothing/accessory/armor/legguards{
+ pixel_x = -3;
+ pixel_y = -4
+ },
+/obj/item/clothing/accessory/armor/legguards{
+ pixel_x = -3;
+ pixel_y = -4
+ },
+/obj/item/clothing/accessory/armor/legguards{
+ pixel_x = -3;
+ pixel_y = -4
+ },
+/obj/item/clothing/accessory/armor/legguards{
+ pixel_x = 7;
+ pixel_y = -4
+ },
+/obj/item/clothing/accessory/armor/legguards{
+ pixel_x = 7;
+ pixel_y = -4
+ },
+/obj/item/clothing/accessory/armor/legguards{
+ pixel_x = 7;
+ pixel_y = -4
+ },
+/obj/item/clothing/accessory/armor/legguards{
+ pixel_x = 7;
+ pixel_y = -4
+ },
+/obj/item/clothing/accessory/armor/legguards{
+ pixel_x = 7;
+ pixel_y = -4
+ },
+/obj/item/clothing/accessory/armor/legguards{
+ pixel_x = 7;
+ pixel_y = -4
+ },
+/obj/item/clothing/accessory/armor/armguards,
+/obj/item/clothing/accessory/armor/armguards,
+/obj/item/clothing/accessory/armor/armguards,
+/obj/item/clothing/accessory/armor/armguards,
+/obj/item/clothing/accessory/armor/armguards,
+/obj/item/clothing/accessory/armor/armguards,
+/obj/item/clothing/accessory/armor/armguards{
+ pixel_y = 4
+ },
+/obj/item/clothing/accessory/armor/armguards{
+ pixel_y = 4
+ },
+/obj/item/clothing/accessory/armor/armguards{
+ pixel_y = 4
+ },
+/obj/item/clothing/accessory/armor/armguards{
+ pixel_y = 4
+ },
+/obj/item/clothing/accessory/armor/armguards{
+ pixel_y = 4
+ },
+/obj/item/clothing/accessory/armor/armguards{
+ pixel_y = 4
+ },
+/obj/item/clothing/accessory/armor/legguards/navy{
+ pixel_y = -1;
+ pixel_x = -4
+ },
+/obj/item/clothing/accessory/armor/legguards/navy{
+ pixel_y = -1;
+ pixel_x = 7
+ },
+/obj/item/clothing/accessory/armor/armguards/navy,
+/obj/item/clothing/accessory/armor/armguards/navy,
+/obj/item/clothing/accessory/armor/legguards/navy{
+ pixel_y = -1;
+ pixel_x = -4
+ },
+/turf/simulated/floor/tiled/dark,
+/area/security/armoury)
"uOJ" = (
/turf/simulated/floor/tiled/monotile,
/area/security/brig)
@@ -29274,6 +29840,10 @@
/obj/structure/reagent_dispensers/beerkeg,
/turf/simulated/floor/plating,
/area/maintenance/central)
+"vbT" = (
+/obj/landmark/spawnpoint/overflow/station,
+/turf/simulated/floor/tiled/dark,
+/area/hallway/primary/aft)
"vbU" = (
/obj/machinery/power/smes/buildable{
charge = 5000;
@@ -30149,15 +30719,13 @@
/turf/simulated/floor/wood,
/area/crew_quarters/captain)
"vFo" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green{
icon_state = "0-2"
},
/obj/structure/cable/green{
icon_state = "2-4"
},
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/security/forensics)
"vFH" = (
@@ -30212,12 +30780,10 @@
/turf/simulated/floor/tiled,
/area/bridge/hallway)
"vGB" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green{
icon_state = "0-4"
},
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/security/security_lockerroom)
"vGG" = (
@@ -30301,30 +30867,66 @@
/turf/simulated/floor/tiled/monotile,
/area/security/security_lockerroom)
"vJe" = (
-/obj/structure/table/rack/steel,
-/obj/structure/window/reinforced{
- dir = 8
- },
+/obj/structure/table/rack/shelf/steel,
/obj/structure/window/reinforced{
dir = 1
},
-/obj/item/clothing/shoes/leg_guard/riot,
-/obj/item/clothing/gloves/arm_guard/riot,
-/obj/item/clothing/mask/balaclava,
-/obj/item/clothing/suit/armor/riot,
-/obj/item/clothing/head/helmet/riot,
-/obj/item/shield/riot,
-/obj/item/melee/baton/loaded,
-/obj/effect/floor_decal/borderfloorblack{
- dir = 1
+/obj/effect/floor_decal/industrial/outline/red,
+/obj/item/clothing/accessory/armor/legguards/ballistic{
+ pixel_x = 6;
+ pixel_y = -6
},
-/obj/effect/floor_decal/corner/blue/border{
- dir = 1
+/obj/item/clothing/accessory/armor/legguards/ballistic{
+ pixel_x = 6;
+ pixel_y = -6
+ },
+/obj/item/clothing/accessory/armor/legguards/ballistic{
+ pixel_x = 6;
+ pixel_y = -6
+ },
+/obj/item/clothing/accessory/armor/legguards/ballistic{
+ pixel_x = 6;
+ pixel_y = -6
+ },
+/obj/item/clothing/accessory/armor/armguards/ballistic{
+ pixel_x = -4;
+ pixel_y = -6
+ },
+/obj/item/clothing/accessory/armor/armguards/ballistic{
+ pixel_x = -4;
+ pixel_y = -6
+ },
+/obj/item/clothing/accessory/armor/armguards/ballistic{
+ pixel_x = -4;
+ pixel_y = -6
+ },
+/obj/item/clothing/accessory/armor/armguards/ballistic{
+ pixel_x = -4;
+ pixel_y = -6
+ },
+/obj/item/clothing/head/helmet/ballistic{
+ pixel_x = -5;
+ pixel_y = 4
+ },
+/obj/item/clothing/head/helmet/ballistic{
+ pixel_x = -5;
+ pixel_y = 4
+ },
+/obj/item/clothing/head/helmet/ballistic{
+ pixel_x = 5;
+ pixel_y = 4
+ },
+/obj/item/clothing/head/helmet/ballistic{
+ pixel_x = 5;
+ pixel_y = 4
+ },
+/obj/structure/window/reinforced{
+ dir = 8;
+ health = 1e+006
},
/obj/effect/floor_decal/corner/red{
dir = 5
},
-/obj/effect/floor_decal/industrial/outline/red,
/turf/simulated/floor/tiled/dark,
/area/security/riot_control)
"vJi" = (
@@ -30410,9 +31012,6 @@
/turf/simulated/floor/tiled,
/area/hallway/primary/aft)
"vLR" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/machinery/door/blast/regular{
density = 0;
icon_state = "pdoor0";
@@ -30420,6 +31019,7 @@
name = "Security Blast Doors";
opacity = 0
},
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/security/lobby)
"vMk" = (
@@ -30533,10 +31133,6 @@
"vOb" = (
/obj/structure/table/rack/steel,
/obj/structure/window/reinforced,
-/obj/item/clothing/shoes/leg_guard/bulletproof,
-/obj/item/clothing/gloves/arm_guard/bulletproof,
-/obj/item/clothing/suit/armor/bulletproof/alt,
-/obj/item/clothing/head/helmet/ballistic,
/obj/machinery/light,
/obj/effect/floor_decal/corner/red{
dir = 10
@@ -30545,6 +31141,10 @@
/obj/structure/window/reinforced{
dir = 4
},
+/obj/effect/floor_decal/corner/red{
+ dir = 10
+ },
+/obj/item/storage/toolbox/syndicate,
/turf/simulated/floor/tiled/dark,
/area/security/riot_control)
"vPg" = (
@@ -31300,44 +31900,88 @@
/turf/simulated/floor/lino,
/area/security/detectives_office)
"wmC" = (
-/obj/structure/table/rack/steel,
-/obj/item/clothing/shoes/leg_guard/riot,
-/obj/item/clothing/gloves/arm_guard/riot,
-/obj/item/clothing/mask/balaclava,
-/obj/item/clothing/suit/armor/riot,
-/obj/item/clothing/head/helmet/riot,
-/obj/item/shield/riot,
-/obj/item/melee/baton/loaded,
-/obj/effect/floor_decal/borderfloorblack{
- dir = 5
- },
+/obj/structure/table/rack/shelf/steel,
/obj/structure/window/reinforced{
dir = 1
},
+/obj/effect/floor_decal/industrial/outline/red,
/obj/structure/window/reinforced{
dir = 4
},
-/obj/effect/floor_decal/corner/blue/border{
- dir = 5
+/obj/item/clothing/mask/balaclava{
+ pixel_x = -4;
+ pixel_y = 7
},
-/obj/machinery/firealarm{
- dir = 4;
- layer = 3.3;
- pixel_x = 26
+/obj/item/clothing/mask/balaclava{
+ pixel_x = -4;
+ pixel_y = 7
+ },
+/obj/item/clothing/mask/balaclava{
+ pixel_x = -4;
+ pixel_y = 7
+ },
+/obj/item/clothing/mask/balaclava{
+ pixel_x = -4;
+ pixel_y = 7
+ },
+/obj/item/clothing/head/helmet/riot{
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/item/clothing/head/helmet/riot{
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/item/clothing/head/helmet/riot{
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/item/clothing/head/helmet/riot{
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/item/clothing/accessory/armor/legguards/riot{
+ pixel_x = 5;
+ pixel_y = -7
+ },
+/obj/item/clothing/accessory/armor/legguards/riot{
+ pixel_x = 5;
+ pixel_y = -7
+ },
+/obj/item/clothing/accessory/armor/legguards/riot{
+ pixel_x = 5;
+ pixel_y = -7
+ },
+/obj/item/clothing/accessory/armor/legguards/riot{
+ pixel_x = 5;
+ pixel_y = -7
+ },
+/obj/item/clothing/accessory/armor/armguards/riot{
+ pixel_x = -4;
+ pixel_y = -7
+ },
+/obj/item/clothing/accessory/armor/armguards/riot{
+ pixel_x = -4;
+ pixel_y = -7
+ },
+/obj/item/clothing/accessory/armor/armguards/riot{
+ pixel_x = -4;
+ pixel_y = -7
+ },
+/obj/item/clothing/accessory/armor/armguards/riot{
+ pixel_x = -4;
+ pixel_y = -7
},
/obj/effect/floor_decal/corner/red/full{
dir = 1
},
-/obj/effect/floor_decal/industrial/outline/red,
/turf/simulated/floor/tiled/dark,
/area/security/riot_control)
"wne" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green{
icon_state = "0-4"
},
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/security/prison)
"wns" = (
@@ -31849,8 +32493,27 @@
dir = 8
},
/obj/machinery/camera/network/security,
-/obj/structure/closet/wardrobe/tactical,
/obj/effect/floor_decal/industrial/outline/grey,
+/obj/structure/table/rack/shelf/steel,
+/obj/item/gun/ballistic/automatic/wt550{
+ pixel_y = 7
+ },
+/obj/item/gun/ballistic/automatic/wt550{
+ pixel_y = -7
+ },
+/obj/item/gun/ballistic/automatic/wt550,
+/obj/item/ammo_magazine/m9mmt,
+/obj/item/ammo_magazine/m9mmt,
+/obj/item/ammo_magazine/m9mmt,
+/obj/item/ammo_magazine/m9mmt,
+/obj/item/ammo_magazine/m9mmt,
+/obj/item/ammo_magazine/m9mmt,
+/obj/item/ammo_magazine/m9mmt,
+/obj/item/ammo_magazine/m9mmt,
+/obj/item/ammo_magazine/m9mmt,
+/obj/item/ammo_magazine/m9mmt,
+/obj/item/ammo_magazine/m9mmt,
+/obj/item/ammo_magazine/m9mmt,
/turf/simulated/floor/tiled/dark,
/area/security/tactical)
"wGK" = (
@@ -31880,7 +32543,6 @@
/obj/machinery/light{
dir = 1
},
-/obj/structure/closet/wardrobe/tactical,
/obj/effect/floor_decal/corner/black/full{
dir = 1
},
@@ -31890,6 +32552,19 @@
layer = 3.3;
pixel_x = 26
},
+/obj/structure/table/rack/shelf/steel,
+/obj/item/gun/ballistic/fiveseven,
+/obj/item/gun/ballistic/fiveseven,
+/obj/item/gun/ballistic/fiveseven,
+/obj/item/ammo_magazine/m57x28mm/fiveseven/ap,
+/obj/item/ammo_magazine/m57x28mm/fiveseven/ap,
+/obj/item/ammo_magazine/m57x28mm/fiveseven/ap,
+/obj/item/ammo_magazine/m57x28mm/fiveseven/ap,
+/obj/item/ammo_magazine/m57x28mm/fiveseven/ap,
+/obj/item/ammo_magazine/m57x28mm/fiveseven/ap,
+/obj/item/ammo_magazine/m57x28mm/fiveseven/ap,
+/obj/item/ammo_magazine/m57x28mm/fiveseven/ap,
+/obj/item/ammo_magazine/m57x28mm/fiveseven/ap,
/turf/simulated/floor/tiled/dark,
/area/security/tactical)
"wIf" = (
@@ -31962,12 +32637,10 @@
/turf/simulated/floor/airless/ceiling,
/area/security/hanger)
"wKb" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green{
icon_state = "0-8"
},
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/security/warden)
"wMH" = (
@@ -32065,32 +32738,144 @@
/area/security/eva)
"wPq" = (
/obj/structure/table/rack/shelf/steel,
-/obj/item/clothing/suit/armor/vest/alt{
- pixel_x = -4;
- pixel_y = -6
+/obj/structure/cable/green{
+ icon_state = "4-8"
+ },
+/obj/effect/floor_decal/corner/red{
+ dir = 6
},
-/obj/item/clothing/suit/armor/vest/alt{
+/obj/effect/floor_decal/corner/red{
+ dir = 9
+ },
+/obj/effect/floor_decal/industrial/outline/yellow,
+/obj/item/clothing/suit/armor/pcarrier{
pixel_x = 6;
- pixel_y = -6
+ pixel_y = 6
},
-/obj/item/clothing/suit/armor/vest/alt{
- pixel_x = -4;
+/obj/item/clothing/suit/armor/pcarrier{
+ pixel_x = 6;
pixel_y = 6
},
-/obj/item/clothing/suit/armor/vest/alt{
+/obj/item/clothing/suit/armor/pcarrier{
pixel_x = 6;
pixel_y = 6
},
-/obj/structure/cable/green{
- icon_state = "4-8"
+/obj/item/clothing/suit/armor/pcarrier{
+ pixel_x = 6;
+ pixel_y = 6
},
-/obj/effect/floor_decal/corner/red{
- dir = 6
+/obj/item/clothing/suit/armor/pcarrier{
+ pixel_x = 6;
+ pixel_y = 6
},
-/obj/effect/floor_decal/corner/red{
- dir = 9
+/obj/item/clothing/suit/armor/pcarrier{
+ pixel_x = 6;
+ pixel_y = 6
+ },
+/obj/item/clothing/suit/armor/pcarrier{
+ pixel_x = 6;
+ pixel_y = 6
+ },
+/obj/item/clothing/suit/armor/pcarrier{
+ pixel_x = 6;
+ pixel_y = 6
+ },
+/obj/item/clothing/suit/armor/pcarrier/navy{
+ pixel_x = 6;
+ pixel_y = -5
+ },
+/obj/item/clothing/suit/armor/pcarrier/navy{
+ pixel_x = 6;
+ pixel_y = -5
+ },
+/obj/item/clothing/suit/armor/pcarrier/navy{
+ pixel_x = 6;
+ pixel_y = -5
+ },
+/obj/item/clothing/suit/armor/pcarrier/navy{
+ pixel_x = 6;
+ pixel_y = -5
+ },
+/obj/item/clothing/suit/armor/pcarrier/navy{
+ pixel_x = 6;
+ pixel_y = -5
+ },
+/obj/item/clothing/suit/armor/pcarrier/navy{
+ pixel_x = 6;
+ pixel_y = -5
+ },
+/obj/item/clothing/suit/armor/pcarrier/navy{
+ pixel_x = 6;
+ pixel_y = -5
+ },
+/obj/item/clothing/suit/armor/pcarrier/navy{
+ pixel_x = 6;
+ pixel_y = -5
+ },
+/obj/item/clothing/accessory/storage/pouches{
+ pixel_x = -5;
+ pixel_y = 10
+ },
+/obj/item/clothing/accessory/storage/pouches{
+ pixel_x = -5;
+ pixel_y = 10
+ },
+/obj/item/clothing/accessory/storage/pouches{
+ pixel_x = -5;
+ pixel_y = 10
+ },
+/obj/item/clothing/accessory/storage/pouches{
+ pixel_x = -5;
+ pixel_y = 10
+ },
+/obj/item/clothing/accessory/storage/pouches{
+ pixel_x = -5;
+ pixel_y = 10
+ },
+/obj/item/clothing/accessory/storage/pouches{
+ pixel_x = -5;
+ pixel_y = 10
+ },
+/obj/item/clothing/accessory/storage/pouches{
+ pixel_x = -5;
+ pixel_y = 10
+ },
+/obj/item/clothing/accessory/storage/pouches{
+ pixel_x = -5;
+ pixel_y = 10
+ },
+/obj/item/clothing/accessory/storage/pouches/navy{
+ pixel_x = -5;
+ pixel_y = -2
+ },
+/obj/item/clothing/accessory/storage/pouches/navy{
+ pixel_x = -5;
+ pixel_y = -2
+ },
+/obj/item/clothing/accessory/storage/pouches/navy{
+ pixel_x = -5;
+ pixel_y = -2
+ },
+/obj/item/clothing/accessory/storage/pouches/navy{
+ pixel_x = -5;
+ pixel_y = -2
+ },
+/obj/item/clothing/accessory/storage/pouches/navy{
+ pixel_x = -5;
+ pixel_y = -2
+ },
+/obj/item/clothing/accessory/storage/pouches/navy{
+ pixel_x = -5;
+ pixel_y = -2
+ },
+/obj/item/clothing/accessory/storage/pouches/navy{
+ pixel_x = -5;
+ pixel_y = -2
+ },
+/obj/item/clothing/accessory/storage/pouches/navy{
+ pixel_x = -5;
+ pixel_y = -2
},
-/obj/effect/floor_decal/industrial/outline/yellow,
/turf/simulated/floor/tiled/dark,
/area/security/security_equiptment_storage)
"wPX" = (
@@ -32707,6 +33492,30 @@
dir = 6
},
/obj/effect/floor_decal/industrial/outline/yellow,
+/obj/item/clothing/accessory/armor/helmcover/navy{
+ pixel_y = 5
+ },
+/obj/item/clothing/accessory/armor/helmcover/navy{
+ pixel_y = 5
+ },
+/obj/item/clothing/accessory/armor/helmcover/navy{
+ pixel_y = 5
+ },
+/obj/item/clothing/accessory/armor/helmcover/navy{
+ pixel_y = 5
+ },
+/obj/item/clothing/accessory/armor/helmcover/navy{
+ pixel_y = 5
+ },
+/obj/item/clothing/accessory/armor/helmcover/navy{
+ pixel_y = 5
+ },
+/obj/item/clothing/accessory/armor/helmcover/navy{
+ pixel_y = 5
+ },
+/obj/item/clothing/accessory/armor/helmcover/navy{
+ pixel_y = 5
+ },
/turf/simulated/floor/tiled/dark,
/area/security/security_equiptment_storage)
"xoa" = (
@@ -32767,12 +33576,10 @@
/turf/simulated/floor/wood,
/area/crew_quarters/lounge)
"xqv" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/structure/cable/green{
icon_state = "0-8"
},
+/obj/spawner/window/low_wall/reinforced/full/firelocks,
/turf/simulated/floor/plating,
/area/security/security_lockerroom)
"xqQ" = (
@@ -36707,7 +37514,7 @@ ahf
nmi
ieD
ieD
-qsk
+cdE
ieD
nmi
hBX
@@ -39728,7 +40535,7 @@ vIl
sfo
sfo
sfo
-sfo
+iOd
npe
npe
nIK
@@ -40273,7 +41080,7 @@ jIb
nWX
jIb
lrZ
-xxQ
+pXk
qjp
tJG
wEy
@@ -40410,7 +41217,7 @@ mSI
psD
psD
psD
-psD
+vbT
opV
psD
byi
@@ -42422,9 +43229,9 @@ rsu
plC
lUE
eFy
+uOC
sBq
-sBq
-tCO
+eGF
tCO
nzO
plC
@@ -42716,7 +43523,7 @@ plC
nIK
clY
nIK
-nIK
+ovC
nIK
nIK
nIK
diff --git a/maps/triumph/levels/flagship.dmm b/maps/triumph/levels/flagship.dmm
index 86dc1018d75e..aa003e590a3d 100644
--- a/maps/triumph/levels/flagship.dmm
+++ b/maps/triumph/levels/flagship.dmm
@@ -1102,21 +1102,15 @@
name = "hacked Getmore Chocolate Corp";
prices = list()
},
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/specops)
"bL" = (
/obj/structure/closet/wardrobe/ert,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/specops)
"bM" = (
/obj/structure/undies_wardrobe,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/specops)
"bN" = (
/obj/machinery/embedded_controller/radio/simple_docking_controller{
@@ -1160,42 +1154,32 @@
},
/area/centcom/specops)
"bS" = (
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/specops)
"bT" = (
/obj/landmark{
name = "Response Team"
},
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/specops)
"bU" = (
/obj/item/megaphone,
/obj/item/storage/box/trackimp,
/obj/item/storage/box/cdeathalarm_kit,
/obj/structure/table/steel_reinforced,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/specops)
"bV" = (
/obj/structure/table/rack,
/obj/item/clothing/suit/armor/vest/ert/command,
/obj/item/clothing/head/helmet/ert/command,
/obj/item/storage/backpack/ert/commander,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/specops)
"bW" = (
/obj/structure/table/steel_reinforced,
/obj/item/gun/energy/netgun,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/specops)
"bX" = (
/obj/structure/sign/redcross{
@@ -1216,9 +1200,7 @@
/area/centcom/specops)
"bZ" = (
/obj/item/stool/padded,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/specops)
"ca" = (
/obj/machinery/door/firedoor,
@@ -1241,18 +1223,14 @@
/obj/item/pinpointer/advpinpointer,
/obj/item/stamp/centcomm,
/obj/structure/table/steel_reinforced,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/specops)
"cc" = (
/obj/machinery/door/airlock/centcom{
name = "Commander";
req_access = list(103)
},
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/specops)
"cd" = (
/obj/item/clothing/accessory/holster/hip,
@@ -1260,9 +1238,7 @@
/obj/item/ammo_magazine/s44,
/obj/item/gun/ballistic/revolver/combat,
/obj/structure/table/steel_reinforced,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/specops)
"ce" = (
/obj/structure/sign/securearea{
@@ -1276,9 +1252,7 @@
"cf" = (
/obj/item/pda/ert,
/obj/structure/table/steel_reinforced,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/specops)
"cg" = (
/obj/effect/floor_decal/corner/yellow{
@@ -1366,25 +1340,19 @@
/obj/item/clothing/glasses/sunglasses/sechud/tactical,
/obj/item/material/knife/tacknife/combatknife,
/obj/structure/table/steel_reinforced,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/specops)
"cn" = (
/obj/structure/table/rack,
/obj/item/hardsuit/ert,
/obj/item/clothing/accessory/storage/black_vest,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/specops)
"co" = (
/obj/item/gun/energy/gun/nuclear,
/obj/item/hand_tele,
/obj/structure/table/steel_reinforced,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/specops)
"cp" = (
/obj/machinery/vending/engivend,
@@ -1464,18 +1432,14 @@
prices = list();
products = list(/obj/item/storage/fancy/cigarettes=10,/obj/item/storage/box/matches=10,/obj/item/flame/lighter/zippo=4,/obj/item/clothing/mask/smokable/cigarette/cigar/havana=2)
},
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/specops)
"cv" = (
/obj/machinery/vending/cola{
name = "hacked Robust Softdrinks";
prices = list()
},
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/specops)
"cw" = (
/obj/machinery/pipedispenser/orderable,
@@ -3347,11 +3311,6 @@
icon_state = "white"
},
/area/centcom/control)
-"fT" = (
-/turf/unsimulated/floor/steel{
- icon_state = "bcircuit"
- },
-/area/centcom/control)
"fU" = (
/obj/machinery/door/blast/regular{
id = "thunderdomeaxe";
@@ -11271,48 +11230,34 @@
/area/centcom/main_hall)
"vC" = (
/obj/machinery/vending/cigarette,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"vD" = (
/obj/structure/closet/crate/bin,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"vE" = (
/obj/machinery/vending/nifsoft_shop,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"vF" = (
/obj/structure/sign/double/barsign{
dir = 1
},
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"vG" = (
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"vH" = (
/obj/machinery/camera/network/crescent,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"vI" = (
/obj/structure/flora/pottedplant{
icon_state = "plant-22"
},
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"vJ" = (
/obj/structure/sign/directions/elevator{
@@ -11718,17 +11663,13 @@
/obj/machinery/newscaster{
pixel_y = 30
},
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"wp" = (
/obj/machinery/status_display{
pixel_y = 29
},
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"wq" = (
/obj/structure/sink{
@@ -11953,15 +11894,11 @@
/turf/unsimulated/floor/steel,
/area/centcom/main_hall)
"wI" = (
-/turf/unsimulated/floor/steel{
- icon_state = "grass"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/main_hall)
"wJ" = (
/obj/structure/table/bench/wooden,
-/turf/unsimulated/floor/steel{
- icon_state = "grass"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/main_hall)
"wK" = (
/obj/effect/floor_decal/spline/fancy/wood{
@@ -11971,9 +11908,7 @@
/area/centcom/main_hall)
"wL" = (
/obj/structure/bed/chair/wood/wings,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"wM" = (
/obj/machinery/door/airlock{
@@ -12222,15 +12157,11 @@
/area/centcom/main_hall)
"xg" = (
/obj/machinery/light/flamp/noshade,
-/turf/unsimulated/floor/steel{
- icon_state = "grass"
- },
+/turf/simulated/floor/outdoors/grass/heavy/interior/classp,
/area/centcom/main_hall)
"xh" = (
/obj/structure/flora/ausbushes/brflowers,
-/turf/unsimulated/floor/steel{
- icon_state = "grass"
- },
+/turf/simulated/floor/outdoors/grass/heavy/interior/classp,
/area/centcom/main_hall)
"xi" = (
/obj/structure/bed/chair{
@@ -12242,16 +12173,12 @@
/obj/structure/bed/chair/wood/wings{
dir = 4
},
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"xk" = (
/obj/structure/table/woodentable,
/obj/item/reagent_containers/food/snacks/fries,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"xl" = (
/obj/structure/table/woodentable,
@@ -12260,31 +12187,23 @@
pixel_y = 3
},
/obj/item/reagent_containers/food/snacks/cheeseburger,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"xm" = (
/obj/structure/bed/chair/wood/wings{
dir = 8
},
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"xn" = (
/obj/structure/table/woodentable,
/obj/item/reagent_containers/food/snacks/grilledcheese,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"xo" = (
/obj/structure/table/woodentable,
/obj/item/reagent_containers/food/snacks/meatballsoup,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"xp" = (
/obj/structure/sink{
@@ -12561,9 +12480,7 @@
/area/centcom/security)
"xI" = (
/obj/structure/flora/ausbushes/ppflowers,
-/turf/unsimulated/floor/steel{
- icon_state = "grass"
- },
+/turf/simulated/floor/outdoors/grass/heavy/interior/classp,
/area/centcom/main_hall)
"xJ" = (
/obj/structure/table/woodentable,
@@ -12572,30 +12489,22 @@
pixel_x = -5;
pixel_y = -3
},
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"xK" = (
/obj/structure/table/woodentable,
/obj/item/reagent_containers/food/snacks/bigbiteburger,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"xL" = (
/obj/structure/table/woodentable,
/obj/item/reagent_containers/food/snacks/roastbeef,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"xM" = (
/obj/structure/table/woodentable,
/obj/item/reagent_containers/food/snacks/meatsteak,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"xN" = (
/obj/effect/floor_decal/borderfloorwhite{
@@ -12718,9 +12627,7 @@
/obj/structure/bed/chair/wood/wings{
dir = 1
},
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"xZ" = (
/obj/structure/table/woodentable,
@@ -13139,23 +13046,17 @@
/obj/machinery/camera/network/crescent{
dir = 4
},
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"yH" = (
/obj/structure/table/woodentable,
/obj/item/reagent_containers/food/snacks/pastatomato,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"yI" = (
/obj/structure/table/woodentable,
/obj/item/reagent_containers/food/snacks/meatballspagetti,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"yJ" = (
/obj/structure/sign/department/bar,
@@ -13165,9 +13066,7 @@
/obj/machinery/computer/guestpass{
pixel_y = 26
},
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"yL" = (
/obj/structure/table/marble,
@@ -13200,17 +13099,13 @@
pixel_x = -4;
pixel_y = 12
},
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"yM" = (
/obj/structure/table/marble,
/obj/machinery/chemical_dispenser/catering/bar_coffee,
/obj/machinery/camera/network/crescent,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"yN" = (
/obj/structure/table/marble,
@@ -13236,9 +13131,7 @@
pixel_x = -8;
pixel_y = 4
},
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"yO" = (
/obj/effect/floor_decal/borderfloorblack{
@@ -13460,29 +13353,21 @@
/area/centcom/security)
"ze" = (
/obj/structure/flora/ausbushes/ywflowers,
-/turf/unsimulated/floor/steel{
- icon_state = "grass"
- },
+/turf/simulated/floor/outdoors/grass/heavy/interior/classp,
/area/centcom/main_hall)
"zf" = (
/obj/structure/table/woodentable,
/obj/item/reagent_containers/food/snacks/kitsuneudon,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"zg" = (
/obj/structure/table/woodentable,
/obj/item/reagent_containers/food/snacks/lasagna,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"zh" = (
/obj/machinery/door/firedoor,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/steel,
/area/centcom/restaurant)
"zi" = (
/obj/effect/floor_decal/borderfloorblack{
@@ -13852,15 +13737,11 @@
/area/centcom/bar)
"zL" = (
/obj/item/stool/padded,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/bar)
"zM" = (
/obj/structure/table/woodentable,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"zN" = (
/obj/machinery/door/airlock,
@@ -13915,45 +13796,33 @@
"zV" = (
/obj/structure/table/woodentable,
/obj/item/reagent_containers/food/drinks/bottle/grenadine,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/bar)
"zW" = (
/obj/structure/table/woodentable,
/obj/item/reagent_containers/food/drinks/bottle/cola,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/bar)
"zX" = (
/obj/structure/table/woodentable,
/obj/machinery/cash_register/civilian,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/bar)
"zY" = (
/obj/structure/table/woodentable,
/obj/item/reagent_containers/food/drinks/bottle/space_mountain_wind,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/bar)
"zZ" = (
/obj/structure/table/woodentable,
/obj/item/reagent_containers/food/snacks/toastedsandwich{
pixel_y = 10
},
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/bar)
"Aa" = (
/obj/structure/table/woodentable,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/bar)
"Ab" = (
/obj/structure/flora/pottedplant{
@@ -14091,33 +13960,23 @@
/turf/unsimulated/floor/steel,
/area/centcom/main_hall)
"Ap" = (
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/bar)
"Aq" = (
/obj/machinery/vending/coffee,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"Ar" = (
/obj/machinery/vending/sovietsoda,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"As" = (
/obj/machinery/vending/snack,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"At" = (
/obj/machinery/vending/cola,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/restaurant)
"Au" = (
/obj/machinery/atm{
@@ -14155,38 +14014,28 @@
/area/centcom/security)
"Ax" = (
/obj/machinery/smartfridge/drinks,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/bar)
"Ay" = (
/obj/machinery/vending/boozeomat,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/bar)
"Az" = (
/obj/structure/table/reinforced,
/obj/machinery/chemical_dispenser/catering/bar_soft,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/bar)
"AA" = (
/obj/structure/table/reinforced,
/obj/machinery/chemical_dispenser/catering/bar_alc,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/bar)
"AB" = (
/obj/structure/table/reinforced,
/obj/item/reagent_containers/food/drinks/flask/barflask,
/obj/item/reagent_containers/glass/rag,
/obj/item/reagent_containers/food/drinks/flask/vacuumflask,
-/turf/unsimulated/floor/steel{
- icon_state = "wood"
- },
+/turf/unsimulated/floor/wood,
/area/centcom/bar)
"AC" = (
/obj/machinery/door/firedoor,
@@ -16286,6 +16135,9 @@
},
/turf/simulated/floor/tiled/steel,
/area/centcom/security)
+"VT" = (
+/turf/simulated/floor/outdoors/grass/heavy/interior/classp,
+/area/centcom/main_hall)
"VU" = (
/obj/machinery/light,
/turf/simulated/shuttle/floor/black,
@@ -25581,13 +25433,13 @@ dk
wm
wI
xh
-wI
-wI
-wI
-wI
-wI
-wI
-wI
+VT
+VT
+VT
+VT
+VT
+VT
+VT
xh
wI
zS
@@ -25723,13 +25575,13 @@ dk
wm
wJ
xh
-wI
-wI
-wI
+VT
+VT
+VT
KZ
Tb
ze
-wI
+VT
xh
wJ
zS
@@ -25865,13 +25717,13 @@ vA
wm
wI
xh
-wI
-wI
-wI
+VT
+VT
+VT
Pq
Tb
-wI
-wI
+VT
+VT
xh
wI
zS
@@ -26007,12 +25859,12 @@ vB
wm
wI
xh
-wI
-wI
-wI
+VT
+VT
+VT
Tb
Tb
-wI
+VT
ze
xh
wI
@@ -26149,13 +26001,13 @@ dk
wm
wJ
xh
-wI
+VT
xI
-wI
+VT
NO
Tb
-wI
-wI
+VT
+VT
xh
wJ
zS
@@ -26291,13 +26143,13 @@ dk
wm
wI
xh
-wI
-wI
-wI
-wI
-wI
-wI
-wI
+VT
+VT
+VT
+VT
+VT
+VT
+VT
xh
wI
zS
@@ -34339,9 +34191,9 @@ em
em
em
em
-fT
+em
gf
-fT
+em
em
hr
hL
@@ -34481,9 +34333,9 @@ em
em
em
em
-fT
+em
gg
-fT
+em
em
hs
hM
@@ -34623,9 +34475,9 @@ eZ
fs
fD
em
-fT
+em
gf
-fT
+em
em
ht
hN
diff --git a/maps/triumph/triumph.dm b/maps/triumph/triumph.dm
index b32aa359af85..458e1c369652 100644
--- a/maps/triumph/triumph.dm
+++ b/maps/triumph/triumph.dm
@@ -21,7 +21,8 @@
/datum/map/sector/piratebase_140,
/datum/map/sector/tradeport_140,
/datum/map/sector/lavaland_140,
- /datum/map/sector/roguemining_140,
+ /datum/map/sector/roguemining_140/one,
+ /datum/map/sector/mining_140,
)
//* LEGACY BELOW *//
@@ -34,6 +35,7 @@
/datum/shuttle/autodock/overmap/mining/triumph,
/datum/shuttle/autodock/overmap/civvie/triumph,
/datum/shuttle/autodock/overmap/courser/triumph,
+ /datum/shuttle/autodock/ferry/belter,
)
full_name = "NSV Triumph"
diff --git a/tgui/packages/tgui/interfaces/PortableGenerator.js b/tgui/packages/tgui/interfaces/PortableGenerator.js
index 3f3acd4f1f6a..e820281020ea 100644
--- a/tgui/packages/tgui/interfaces/PortableGenerator.js
+++ b/tgui/packages/tgui/interfaces/PortableGenerator.js
@@ -4,9 +4,7 @@ import { Window } from '../layouts';
export const PortableGenerator = (props, context) => {
const { act, data } = useBackend(context);
- const {
- stack_percent,
- } = data;
+ const stack_percent = data.fuel_stored / data.fuel_capacity;
const stackPercentState = (
stack_percent > 50 && 'good'
|| stack_percent > 15 && 'average'
@@ -30,9 +28,9 @@ export const PortableGenerator = (props, context) => {
{data.active ? 'On' : 'Off'}
-
- {data.sheets}
- {data.sheets >= 1 && (
+
+ {Math.round(data.fuel_stored / 2000)}
+ {data.fuel_stored >= 2000 && (
{
}} />
- {data.current_heat < 100 ? (
- Nominal
- ) : (
- data.current_heat < 200 ? (
- Caution
+ {
+ data.temperature_current < data.temperature_max / 2 ? (
+ Nominal
) : (
- DANGER
+ (data.temperature_current < data.temperature_max) && !data.temperature_overheat ? (
+
+ Caution
+
+ ) : (
+ DANGER
+ )
)
- )}
+ }