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 && (