diff --git a/code/__DEFINES/equipment.dm b/code/__DEFINES/equipment.dm index 298063f0fc8d..8633bf8c427b 100644 --- a/code/__DEFINES/equipment.dm +++ b/code/__DEFINES/equipment.dm @@ -52,6 +52,8 @@ #define MAP_COLOR_INDEX (1<<21) /// If an object will fall through open space, use this when dashing \ jumping for example #define NO_ZFALL (1<<22) +/// Allows a non-mob movable to use multi-Z stairs +#define CAN_USE_MULTIZ_STAIRS (1<<23) //========================================================================================== diff --git a/code/game/objects/structures/multiz_stairs.dm b/code/game/objects/structures/multiz_stairs.dm index 4728182bd3ab..7dc9e409afb8 100644 --- a/code/game/objects/structures/multiz_stairs.dm +++ b/code/game/objects/structures/multiz_stairs.dm @@ -25,7 +25,7 @@ /obj/structure/stairs/multiz/proc/on_stairs_moved(turf/source, atom/movable/enterer) SIGNAL_HANDLER - if(!istype(enterer, /mob)) + if(!istype(enterer, /mob) && !(enterer.flags_atom & CAN_USE_MULTIZ_STAIRS)) return RegisterSignal(enterer, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_premove)) diff --git a/code/modules/vehicles/powerloader.dm b/code/modules/vehicles/powerloader.dm index 4936de036cb1..b0e0fe65b39a 100644 --- a/code/modules/vehicles/powerloader.dm +++ b/code/modules/vehicles/powerloader.dm @@ -17,6 +17,7 @@ var/open_state = "powerloader_open" var/overlay_state = "powerloader_overlay" var/wreckage = /obj/structure/powerloader_wreckage + var/crate_hauler_only = FALSE //restricts claws to standard and large crates var/obj/item/powerloader_clamp/PC_left var/obj/item/powerloader_clamp/PC_right @@ -124,7 +125,7 @@ icon_state = base_state overlays += image(icon_state = overlay_state, layer = MOB_LAYER + 0.1) if(M.mind && M.skills) - move_delay = max(4, move_delay - 2 * M.skills.get_skill_level(SKILL_POWERLOADER)) + move_delay -= 2 * M.skills.get_skill_level(SKILL_POWERLOADER) if(!M.put_in_l_hand(PC_left)) PC_left.forceMove(src) unbuckle() @@ -164,13 +165,17 @@ /obj/item/powerloader_clamp/Destroy() if(loaded) - loaded.forceMove(get_turf(src)) + var/turf/drop_turf = get_turf(src) + if(drop_turf) + loaded.forceMove(drop_turf) + loaded = null linked_powerloader = null return ..() /obj/item/powerloader_clamp/dropped(mob/user) - if(!linked_powerloader) + if(!linked_powerloader || QDELETED(linked_powerloader)) qdel(src) + return ..() forceMove(linked_powerloader) if(linked_powerloader.buckled_mob && linked_powerloader.buckled_mob == user) @@ -314,6 +319,16 @@ if(!linked_powerloader) qdel(src) return + if(linked_powerloader.crate_hauler_only && !istype(target, /obj/structure/closet/crate) && !istype(target, /obj/structure/largecrate)) + var/obj/vehicle/powerloader/overloaded_loader = linked_powerloader + overloaded_loader.visible_message(SPAN_DANGER("\The [overloaded_loader]'s frame groans and begins to buckle under the strain of lifting \the [target]!")) + playsound(overloaded_loader.loc, "alien_doorpry", 25, TRUE) + if(!do_after(user, 5 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE, overloaded_loader, INTERRUPT_MOVED, BUSY_ICON_HOSTILE)) + return + if(QDELETED(overloaded_loader) || linked_powerloader != overloaded_loader) + return + overloaded_loader.explode() + return loaded = target loaded.forceMove(src) to_chat(user, SPAN_NOTICE("You grab \the [target] with \the [src].")) @@ -406,3 +421,33 @@ open_state = "powerloader_open_ft" overlay_state = "powerloader_overlay_ft" wreckage = /obj/structure/powerloader_wreckage/ft + +/obj/vehicle/powerloader/ft/lightweight + name = "\improper Ferret Heavy Industries Mk4-L Crate Loader" + desc = "A lightweight crate hauler produced shortly before Ferret Heavy Industries collapsed. Its stripped frame is quicker than a standard Mk4, but the cheap clamps catastrophically break under non-crate loads. A warning label reads: 'NOT FLIGHT RATED - FRAME WILL NOT WITHSTAND DROPSHIP TURBULENCE.'" + flags_atom = FPRINT|CAN_USE_MULTIZ_STAIRS + move_delay = 7 + crate_hauler_only = TRUE + var/dropship_transit = FALSE + +/obj/vehicle/powerloader/ft/lightweight/explode() + var/turf/drop_turf = get_turf(src) + if(drop_turf && PC_left?.loaded) + PC_left.loaded.forceMove(drop_turf) + PC_left.loaded = null + if(drop_turf && PC_right?.loaded) + PC_right.loaded.forceMove(drop_turf) + PC_right.loaded = null + return ..() + +/obj/vehicle/powerloader/ft/lightweight/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) + . = ..() + dropship_transit = istype(moving_dock, /obj/docking_port/mobile/marine_dropship) + +/obj/vehicle/powerloader/ft/lightweight/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) + . = ..() + if(!dropship_transit) + return + dropship_transit = FALSE + visible_message(SPAN_DANGER("Dropship turbulence violently shakes \the [src]'s flimsy frame apart!")) + explode() diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index e0234b532ae4..1e47c49b2688 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -199,6 +199,10 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space) +"aaD" = ( +/obj/vehicle/powerloader/ft/lightweight, +/turf/open/floor/plating, +/area/almayer/maint/lower/constr) "aaE" = ( /obj/effect/decal/cleanable/blood/oil, /turf/open/floor/almayer/plating_striped/south, @@ -36633,7 +36637,7 @@ /turf/open/floor/almayer/orange/north, /area/almayer/engineering/lower) "bLX" = ( -/obj/vehicle/powerloader, +/obj/vehicle/powerloader/ft/lightweight, /turf/open/floor/almayer/cargo, /area/almayer/squads/req) "bLY" = ( @@ -141902,7 +141906,7 @@ bcm uTk tTC tTC -tTC +aaD cyR tTC hOV