/* Simple object type, calls a proc when "stepped" on by something */ /obj/effect/step_trigger var/affect_ghosts = 0 var/stopper = 1 // stops throwers invisibility = 101 // nope cant see this shit anchored = 1 /obj/effect/step_trigger/proc/Trigger(var/atom/movable/A) return 0 /obj/effect/step_trigger/Crossed(H as mob|obj) ..() if(!H) return if(istype(H, /mob/observer) && !affect_ghosts) return Trigger(H) /* Tosses things in a certain direction */ /obj/effect/step_trigger/thrower var/direction = SOUTH // the direction of throw var/tiles = 3 // if 0: forever until atom hits a stopper var/immobilize = 1 // if nonzero: prevents mobs from moving while they're being flung var/speed = 1 // delay of movement var/facedir = 0 // if 1: atom faces the direction of movement var/nostop = 0 // if 1: will only be stopped by teleporters var/list/affecting = list() Trigger(var/atom/A) if(!A || !istype(A, /atom/movable)) return var/atom/movable/AM = A var/curtiles = 0 var/stopthrow = 0 for(var/obj/effect/step_trigger/thrower/T in orange(2, src)) if(AM in T.affecting) return if(ismob(AM)) var/mob/M = AM if(immobilize) M.canmove = 0 affecting.Add(AM) while(AM && !stopthrow) if(tiles) if(curtiles >= tiles) break if(AM.z != src.z) break curtiles++ sleep(speed) // Calculate if we should stop the process if(!nostop) for(var/obj/effect/step_trigger/T in get_step(AM, direction)) if(T.stopper && T != src) stopthrow = 1 else for(var/obj/effect/step_trigger/teleporter/T in get_step(AM, direction)) if(T.stopper) stopthrow = 1 if(AM) var/predir = AM.dir step(AM, direction) if(!facedir) AM.set_dir(predir) affecting.Remove(AM) if(ismob(AM)) var/mob/M = AM if(immobilize) M.canmove = 1 /* Stops things thrown by a thrower, doesn't do anything */ /obj/effect/step_trigger/stopper /* Instant teleporter */ /obj/effect/step_trigger/teleporter var/teleport_x = 0 // teleportation coordinates (if one is null, then no teleport!) var/teleport_y = 0 var/teleport_z = 0 Trigger(var/atom/movable/A) if(teleport_x && teleport_y && teleport_z) var/turf/T = locate(teleport_x, teleport_y, teleport_z) A.forceMove(T) /* Random teleporter, teleports atoms to locations ranging from teleport_x - teleport_x_offset, etc */ /obj/effect/step_trigger/teleporter/random var/teleport_x_offset = 0 var/teleport_y_offset = 0 var/teleport_z_offset = 0 Trigger(var/atom/movable/A) if(teleport_x && teleport_y && teleport_z) if(teleport_x_offset && teleport_y_offset && teleport_z_offset) var/turf/T = locate(rand(teleport_x, teleport_x_offset), rand(teleport_y, teleport_y_offset), rand(teleport_z, teleport_z_offset)) A.forceMove(T) /* Teleporter that sends objects stepping on it to a specific landmark. */ /obj/effect/step_trigger/teleporter/landmark var/obj/effect/landmark/the_landmark = null var/landmark_id = null /obj/effect/step_trigger/teleporter/landmark/initialize() for(var/obj/effect/landmark/teleport_mark/mark in tele_landmarks) if(mark.landmark_id == landmark_id) the_landmark = mark return /obj/effect/step_trigger/teleporter/landmark/Trigger(var/atom/movable/A) if(the_landmark) A.forceMove(get_turf(the_landmark)) var/global/list/tele_landmarks = list() // Terrible, but the alternative is looping through world. /obj/effect/landmark/teleport_mark var/landmark_id = null /obj/effect/landmark/teleport_mark/New() ..() tele_landmarks += src /obj/effect/landmark/teleport_mark/Destroy() tele_landmarks -= src return ..() /* Teleporter which simulates falling out of the sky. */ /obj/effect/step_trigger/teleporter/planetary_fall var/datum/planet/planet = null /obj/effect/step_trigger/teleporter/planetary_fall/sif/initialize() planet = planet_sif /obj/effect/step_trigger/teleporter/planetary_fall/Trigger(var/atom/movable/A) if(planet) if(!planet.planet_floors.len) message_admins("ERROR: planetary_fall step trigger's list of outdoor floors was empty.") return var/turf/simulated/T = null var/safety = 100 // Infinite loop protection. while(!T && safety) var/turf/simulated/candidate = pick(planet.planet_floors) if(!istype(candidate) || istype(candidate, /turf/simulated/sky)) safety-- continue else T = candidate break if(!T) message_admins("ERROR: planetary_fall step trigger could not find a suitable landing turf.") return if(isobserver(A)) A.forceMove(T) // Harmlessly move ghosts. return if(isliving(A)) // Someday, implement parachutes. For now, just turbomurder whoever falls. var/mob/living/L = A for(var/i = 1 to 6) L.adjustBruteLoss(100) message_admins("\The [A] fell out of the sky.") explosion(T, 0, 1, 2) A.forceMove(T) T.visible_message("\A [A] falls out of the sky and crashes into \the [T]!") else message_admins("ERROR: planetary_fall step trigger lacks a planet to fall onto.") return