/obj/structure/lattice name = "lattice" desc = "A lightweight support lattice." icon = 'icons/obj/smooth/lattice.dmi' icon_state = "lattice" density = FALSE anchored = TRUE opacity = FALSE w_class = WEIGHT_CLASS_NORMAL layer = ABOVE_TILE_LAYER obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED smoothing_flags = SMOOTH_MORE canSmoothWith = list( /obj/structure/lattice, /turf/simulated/wall, /turf/simulated/floor, /turf/simulated/mineral, /turf/unsimulated/wall, /turf/unsimulated/floor, /obj/structure/grille, /turf/unsimulated/mineral/asteroid ) footstep_sound = SFX_FOOTSTEP_CATWALK /obj/structure/lattice/assembly_hints(mob/user, distance, is_adjacent) . += ..() if(name == "lattice") . += "Add a metal floor tile to build a floor on top of the lattice." . += "Lattices can be made by applying metal rods to a space tile." /obj/structure/lattice/disassembly_hints(mob/user, distance, is_adjacent) . += ..() if(name == "lattice") . += "Lattices can be broken back down into metal rods with a welder." /obj/structure/lattice/Initialize() . = ..() if(check_for_duplicates()) stack_trace("multiple lattices found in ([loc.x], [loc.y], [loc.z])") return INITIALIZE_HINT_QDEL if(isturf(loc)) var/turf/turf = loc turf.is_hole = FALSE /obj/structure/lattice/Destroy() if(isturf(loc)) var/turf/turf = loc turf.is_hole = initial(turf.is_hole) return ..() /obj/structure/lattice/ex_act(severity) switch(severity) if(1.0) qdel(src) if(2.0) qdel(src) return /obj/structure/lattice/proc/check_for_duplicates() for(var/obj/structure/lattice/found_lattice in get_turf(src)) if(found_lattice == src || found_lattice.type != src.type) // if the instance we're comparing is us or a different type, then it's not a duplicate continue return TRUE return FALSE /obj/structure/lattice/attackby(obj/item/attacking_item, mob/user) if (istype(attacking_item, /obj/item/stack/tile/floor)) var/turf/T = get_turf(src) T.attackby(attacking_item, user) //BubbleWrap - hand this off to the underlying turf instead return if (attacking_item.tool_behaviour == TOOL_WELDER) var/obj/item/weldingtool/WT = attacking_item if(WT.use(1, user)) to_chat(user, SPAN_NOTICE("Slicing lattice joints ...")) new /obj/item/stack/rods(src.loc) qdel(src) if (istype(attacking_item, /obj/item/stack/rods)) var/obj/item/stack/rods/R = attacking_item if (R.use(2)) to_chat(user, SPAN_NOTICE("Constructing catwalk ...")) playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) new /obj/structure/lattice/catwalk(src.loc) qdel(src) return /obj/structure/lattice/ceiling layer = ABOVE_ABOVE_HUMAN_LAYER canSmoothWith = list( /obj/structure/lattice/ceiling, /turf/simulated/wall, /turf/simulated/mineral, /turf/unsimulated/wall, /obj/structure/grille, /turf/unsimulated/mineral/asteroid ) /obj/structure/lattice/ceiling/Initialize() . = ..() AddComponent(/datum/component/large_transparency, 0, 0, 0, 0) /obj/structure/lattice/catwalk name = "catwalk" desc = "A catwalk for easier EVA maneuvering." icon = 'icons/obj/smooth/catwalk.dmi' icon_state = "catwalk" smoothing_flags = SMOOTH_TRUE canSmoothWith = list( /obj/structure/lattice/catwalk, /obj/structure/lattice/catwalk/indoor ) var/return_amount = 3 // Special catwalk that can be placed on regular flooring. /obj/structure/lattice/catwalk/indoor desc = "A floor-mounted catwalk designed to protect pipes & station wiring from passing feet." can_be_unanchored = TRUE layer = CATWALK_LAYER /obj/structure/lattice/catwalk/attackby(obj/item/attacking_item, mob/user) if(attacking_item.tool_behaviour == TOOL_WELDER) var/obj/item/weldingtool/WT = attacking_item if(!WT.use(1, user)) to_chat(user, SPAN_WARNING("You need more welding fuel to complete this task.")) return if(attacking_item.use_tool(src, user, 5, volume = 50)) to_chat(user, SPAN_NOTICE("You slice apart [src].")) var/obj/item/stack/rods/R = new /obj/item/stack/rods(get_turf(src)) R.amount = return_amount R.update_icon() qdel(src) /obj/structure/lattice/catwalk/indoor/attackby(obj/item/attacking_item, mob/user) if(attacking_item.tool_behaviour == TOOL_SCREWDRIVER) if(attacking_item.use_tool(src, user, 5, volume = 50)) anchored = !anchored to_chat(user, SPAN_NOTICE("You [anchored ? "" : "un"]anchor [src].")) QUEUE_SMOOTH(src) QUEUE_SMOOTH_NEIGHBORS(src) else ..() /obj/structure/lattice/catwalk/hoist_act(turf/dest) for (var/A in loc) var/atom/movable/AM = A AM.forceMove(dest) ..() /obj/structure/lattice/catwalk/indoor/grate name = "grate" desc = "A metal grate." icon = 'icons/obj/grate.dmi' icon_state = "grate" return_amount = 1 smoothing_flags = null color = COLOR_TILED var/base_icon_state = "grate" var/damaged = FALSE /obj/structure/lattice/catwalk/indoor/grate/attackby(obj/item/attacking_item, mob/user) if(attacking_item.tool_behaviour == TOOL_WELDER && damaged) var/obj/item/weldingtool/WT = attacking_item if(attacking_item.use_tool(src, user, 5, volume = 50) && WT.use(1, user)) user.visible_message( SPAN_NOTICE("\The [user] slices apart \the [src], leaving nothing useful behind."), SPAN_NOTICE("You slice apart \the [src], leaving nothing useful behind."), SPAN_NOTICE("You hear the sound of a welder, slicing apart metal.") ) playsound(src, 'sound/items/welder.ogg', 50, 1) qdel(src) else ..() /obj/structure/lattice/catwalk/indoor/grate/ex_act(severity) switch(severity) if(1.0) qdel(src) if(2.0) if(!damaged) icon_state = "[base_icon_state]_dam[rand(0,3)]" damaged = TRUE else qdel(src) return /obj/structure/lattice/catwalk/indoor/grate/old/Initialize() . = ..() AddOverlays("rust") /obj/structure/lattice/catwalk/indoor/grate/damaged icon_state = "grate_dark_dam0" damaged = TRUE /obj/structure/lattice/catwalk/indoor/grate/damaged/Initialize() . = ..() icon_state = "[base_icon_state]_dam[rand(0,3)]" /obj/structure/lattice/catwalk/indoor/grate/light icon_state = "grate_light" base_icon_state = "grate_light" return_amount = 1 color = COLOR_GRAY50 /obj/structure/lattice/catwalk/indoor/grate/light/old/Initialize() . = ..() AddOverlays("rust") /obj/structure/lattice/catwalk/indoor/grate/light/damaged icon_state = "grate_light_dam0" damaged = TRUE /obj/structure/lattice/catwalk/indoor/grate/light/damaged/Initialize() . = ..() icon_state = "[base_icon_state]_dam[rand(0,3)]" /obj/structure/lattice/catwalk/indoor/grate/dark color = COLOR_DARK_GUNMETAL /obj/structure/lattice/catwalk/indoor/grate/gridded color = COLOR_GRAY40 /obj/structure/lattice/catwalk/indoor/grate/gunmetal color = COLOR_DARK_GUNMETAL /obj/structure/lattice/catwalk/indoor/grate/slate color = COLOR_SLATE /obj/structure/lattice/catwalk/indoor/grate/white color = COLOR_WHITE /obj/structure/lattice/catwalk/indoor/urban name = "grate" desc = "A metal grate." icon = 'icons/obj/structure/over_turf.dmi' icon_state = "city_grate" return_amount = 1 smoothing_flags = null /obj/structure/lattice/catwalk/indoor/tatami name = "tatami spread" desc = "A straw mat rug of some sort, frequently referred to as a tatami." icon = 'icons/obj/structure/over_turf.dmi' icon_state = "tatami" return_amount = null smoothing_flags = null footstep_sound = SFX_FOOTSTEP_CARPET /obj/structure/lattice/catwalk/indoor/planks name = "flooring plank" desc = "A ricket assortment of planks meant to be stood upon." icon = 'icons/obj/structure/urban/wood.dmi' icon_state = "plank" return_amount = null smoothing_flags = null footstep_sound = SFX_FOOTSTEP_WOOD /obj/structure/lattice/catwalk/indoor/planks/opaque icon_state = "plank_dark" /obj/structure/lattice/catwalk/indoor/planks/stairs icon_state = "plank_stairs" /obj/structure/lattice/catwalk/indoor/planks/deep icon_state = "plank_deep"