//////////////CHASM////////////////// /turf/open/chasm name = "chasm" desc = "Watch your step." baseturf = /turf/open/chasm smooth = SMOOTH_TRUE | SMOOTH_BORDER | SMOOTH_MORE icon = 'icons/turf/floors/Chasms.dmi' icon_state = "smooth" canSmoothWith = list(/turf/open/floor/fakepit, /turf/open/chasm) density = TRUE //This will prevent hostile mobs from pathing into chasms, while the canpass override will still let it function like an open turf var/static/list/falling_atoms = list() //Atoms currently falling into the chasm var/drop_x = 1 var/drop_y = 1 var/drop_z = 1 /turf/open/chasm/MakeSlippery(wet_setting = TURF_WET_WATER, min_wet_time = 0, wet_time_to_add = 0) return /turf/open/chasm/MakeDry(wet_setting = TURF_WET_WATER) return /turf/open/chasm/Entered(atom/movable/AM) START_PROCESSING(SSobj, src) drop_stuff(AM) /turf/open/chasm/process() if(!drop_stuff()) STOP_PROCESSING(SSobj, src) /turf/open/chasm/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) underlay_appearance.icon = 'icons/turf/floors.dmi' underlay_appearance.icon_state = "basalt" return TRUE /turf/open/chasm/attackby(obj/item/C, mob/user, params, area/area_restriction) ..() if(istype(C, /obj/item/stack/rods)) var/obj/item/stack/rods/R = C var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) if(!L) if(R.use(1)) to_chat(user, "You construct a lattice.") playsound(src, 'sound/weapons/genhit.ogg', 50, 1) ReplaceWithLattice() else to_chat(user, "You need one rod to build a lattice.") return if(istype(C, /obj/item/stack/tile/plasteel)) var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) if(L) var/obj/item/stack/tile/plasteel/S = C if(S.use(1)) qdel(L) playsound(src, 'sound/weapons/genhit.ogg', 50, 1) to_chat(user, "You build a floor.") ChangeTurf(/turf/open/floor/plating) else to_chat(user, "You need one floor tile to build a floor!") else to_chat(user, "The plating is going to need some support! Place metal rods first.") /turf/open/chasm/proc/is_safe() //if anything matching this typecache is found in the chasm, we don't drop things var/static/list/chasm_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk, /obj/structure/stone_tile)) var/list/found_safeties = typecache_filter_list(contents, chasm_safeties_typecache) for(var/obj/structure/stone_tile/S in found_safeties) if(S.fallen) LAZYREMOVE(found_safeties, S) return LAZYLEN(found_safeties) /turf/open/chasm/proc/drop_stuff(AM) . = 0 if(is_safe()) return FALSE var/thing_to_check = src if(AM) thing_to_check = list(AM) for(var/thing in thing_to_check) if(droppable(thing)) . = 1 INVOKE_ASYNC(src, .proc/drop, thing) /turf/open/chasm/proc/droppable(atom/movable/AM) if(falling_atoms[AM]) return FALSE if(!isliving(AM) && !isobj(AM)) return FALSE if(istype(AM, /obj/singularity) || istype(AM, /obj/item/projectile) || AM.throwing) return FALSE if(istype(AM, /obj/effect/portal)) //Portals aren't affected by gravity. Probably. return FALSE if(istype(AM, /obj/structure/stone_tile)) return FALSE //Flies right over the chasm if(isliving(AM)) var/mob/M = AM if(M.is_flying()) return FALSE if(ishuman(AM)) var/mob/living/carbon/human/H = AM if(istype(H.belt, /obj/item/device/wormhole_jaunter)) var/obj/item/device/wormhole_jaunter/J = H.belt //To freak out any bystanders visible_message("[H] falls into [src]!") J.chasm_react(H) return FALSE return TRUE /turf/open/chasm/proc/drop(atom/movable/AM) //Make sure the item is still there after our sleep if(!AM || QDELETED(AM)) return falling_atoms[AM] = TRUE var/turf/T = locate(drop_x, drop_y, drop_z) if(T) AM.visible_message("[AM] falls into [src]!", "GAH! Ah... where are you?") T.visible_message("[AM] falls from above!") AM.forceMove(T) if(isliving(AM)) var/mob/living/L = AM L.Knockdown(100) L.adjustBruteLoss(30) falling_atoms -= AM /turf/open/chasm/straight_down/Initialize() ..() drop_x = x drop_y = y if(z+1 <= world.maxz) drop_z = z+1 /turf/open/chasm/straight_down/lava_land_surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS planetary_atmos = TRUE baseturf = /turf/open/chasm/straight_down/lava_land_surface light_range = 1.9 //slightly less range than lava light_power = 0.65 //less bright, too light_color = LIGHT_COLOR_LAVA //let's just say you're falling into lava, that makes sense right /turf/open/chasm/straight_down/lava_land_surface/drop(atom/movable/AM) //Make sure the item is still there after our sleep if(!AM || QDELETED(AM)) return falling_atoms[AM] = TRUE AM.visible_message("[AM] falls into [src]!", "You stumble and stare into an abyss before you. It stares back, and you fall \ into the enveloping dark.") if(isliving(AM)) var/mob/living/L = AM L.notransform = TRUE L.Stun(200) L.resting = TRUE var/oldtransform = AM.transform var/oldcolor = AM.color var/oldalpha = AM.alpha animate(AM, transform = matrix() - matrix(), alpha = 0, color = rgb(0, 0, 0), time = 10) for(var/i in 1 to 5) //Make sure the item is still there after our sleep if(!AM || QDELETED(AM)) return AM.pixel_y-- sleep(2) //Make sure the item is still there after our sleep if(!AM || QDELETED(AM)) return if(iscyborg(AM)) var/mob/living/silicon/robot/S = AM qdel(S.mmi) falling_atoms -= AM qdel(AM) if(AM && !QDELETED(AM)) //It's indestructible visible_message("[src] spits out the [AM]!") AM.alpha = oldalpha AM.color = oldcolor AM.transform = oldtransform AM.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1, 10),rand(1, 10)) /turf/open/chasm/straight_down/lava_land_surface/normal_air initial_gas_mix = "o2=22;n2=82;TEMP=293.15" /turf/open/chasm/CanPass(atom/movable/mover, turf/target) return 1 //Jungle /turf/open/chasm/jungle icon = 'icons/turf/floors/junglechasm.dmi' planetary_atmos = TRUE initial_gas_mix = LAVALAND_DEFAULT_ATMOS /turf/open/chasm/jungle/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) underlay_appearance.icon = 'icons/turf/floors.dmi' underlay_appearance.icon_state = "dirt" return TRUE /turf/open/chasm/straight_down/jungle icon = 'icons/turf/floors/junglechasm.dmi' planetary_atmos = TRUE initial_gas_mix = LAVALAND_DEFAULT_ATMOS