Files
Bubberstation/code/game/objects/effects/step_triggers.dm
T
fbe6e2ebba museum away mission (#81208)
## About The Pull Request

adds a new gateway map, the Nanotrasen Museum it is filled with
""""Mannequins"""" and Common Core lore
im not putting the preview here because you really should explore it
yourself but if youre that curious i think the Checks tab in mapdiffbot
would have it
this gateway map contains no combat unless you count falling into chasms
because you did not carry a light
or going into the boarded room with no loot or any incentive with
obvious signs that there is the sole enemy on the map in there
the loot is the lore ok thanks

also makes mines detonate if theyre detonated by a non-mob im pretty
sure this couldnt have been intentional
trams stop chasms
and also the relevant items

<details>
  <summary>on second thought if you want spoilers check this</summary>


![image](https://github.com/tgstation/tgstation/assets/70376633/41ab2db1-55ce-4371-8594-a1d8961c37c3)

</details>

## Why It's Good For The Game

more gateway maps = good

## Changelog
🆑
add: nanotrasen museum gateway map
/🆑

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2024-02-11 03:17:55 +01:00

223 lines
6.4 KiB
Plaintext

/* Simple object type, calls a proc when "stepped" on by something */
/obj/effect/step_trigger
var/affect_ghosts = 0
var/stopper = 1 // stops throwers
var/mobs_only = FALSE
invisibility = INVISIBILITY_ABSTRACT // nope cant see this shit
anchored = TRUE
/obj/effect/step_trigger/Initialize(mapload)
. = ..()
var/static/list/loc_connections = list(
COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
/obj/effect/step_trigger/proc/Trigger(atom/movable/A)
return 0
/obj/effect/step_trigger/proc/on_entered(datum/source, H as mob|obj)
SIGNAL_HANDLER
if(!H || H == src)
return
if(isobserver(H) && !affect_ghosts)
return
if(!ismob(H) && mobs_only)
return
INVOKE_ASYNC(src, PROC_REF(Trigger), H)
/obj/effect/step_trigger/singularity_act()
return
/obj/effect/step_trigger/singularity_pull()
return
/* Sends a message to mob when triggered*/
/obj/effect/step_trigger/message
var/message //the message to give to the mob
var/once = 1
mobs_only = TRUE
/obj/effect/step_trigger/message/Trigger(mob/M)
if(M.client)
to_chat(M, span_info("[message]"))
if(once)
qdel(src)
/* 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
///List of moving atoms mapped to their inital direction
var/list/affecting = list()
/obj/effect/step_trigger/thrower/Trigger(atom/A)
if(!A || !ismovable(A))
return
var/atom/movable/AM = A
for(var/obj/effect/step_trigger/thrower/T in orange(2, src))
if(AM in T.affecting)
return
if(immobilize)
ADD_TRAIT(AM, TRAIT_IMMOBILIZED, REF(src))
affecting[AM] = AM.dir
var/datum/move_loop/loop = SSmove_manager.move(AM, direction, speed, tiles ? tiles * speed : INFINITY)
RegisterSignal(loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move))
RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_move))
RegisterSignal(loop, COMSIG_QDELETING, PROC_REF(set_to_normal))
/obj/effect/step_trigger/thrower/proc/pre_move(datum/move_loop/source)
SIGNAL_HANDLER
var/atom/movable/being_moved = source.moving
affecting[being_moved] = being_moved.dir
/obj/effect/step_trigger/thrower/proc/post_move(datum/move_loop/source)
SIGNAL_HANDLER
var/atom/movable/being_moved = source.moving
if(!facedir)
being_moved.setDir(affecting[being_moved])
if(being_moved.z != z)
qdel(source)
return
if(!nostop)
for(var/obj/effect/step_trigger/T in get_turf(being_moved))
if(T.stopper && T != src)
qdel(source)
return
else
for(var/obj/effect/step_trigger/teleporter/T in get_turf(being_moved))
if(T.stopper)
qdel(source)
return
/obj/effect/step_trigger/thrower/proc/set_to_normal(datum/move_loop/source)
SIGNAL_HANDLER
var/atom/movable/being_moved = source.moving
affecting -= being_moved
REMOVE_TRAIT(being_moved, TRAIT_IMMOBILIZED, REF(src))
/* 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
/obj/effect/step_trigger/teleporter/Trigger(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
/obj/effect/step_trigger/teleporter/random/Trigger(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))
if (T)
A.forceMove(T)
/* Teleports atoms directly to an offset, no randomness, looping hallways! */
/obj/effect/step_trigger/teleporter/offset
var/teleport_x_offset = 0
var/teleport_y_offset = 0
/obj/effect/step_trigger/teleporter/offset/on_entered(datum/source, H as mob|obj, atom/old_loc)
if(!old_loc?.Adjacent(loc)) // prevents looping, if we were teleported into this then the old loc is usually not adjacent
return
return ..()
/obj/effect/step_trigger/teleporter/offset/Trigger(atom/movable/poor_soul)
var/turf/destination = locate(x + teleport_x_offset, y + teleport_y_offset, z)
if(!destination)
return
poor_soul.forceMove(destination)
var/mob/living/living_soul = poor_soul
if(istype(living_soul) && living_soul.client)
living_soul.client.move_delay = 0
/* Fancy teleporter, creates sparks and smokes when used */
/obj/effect/step_trigger/teleport_fancy
var/locationx
var/locationy
var/uses = 1 //0 for infinite uses
var/entersparks = 0
var/exitsparks = 0
var/entersmoke = 0
var/exitsmoke = 0
/obj/effect/step_trigger/teleport_fancy/Trigger(mob/M)
var/dest = locate(locationx, locationy, z)
M.Move(dest)
if(entersparks)
var/datum/effect_system/spark_spread/s = new
s.set_up(4, 1, src)
s.start()
if(exitsparks)
var/datum/effect_system/spark_spread/s = new
s.set_up(4, 1, dest)
s.start()
if(entersmoke)
var/datum/effect_system/fluid_spread/smoke/s = new
s.set_up(4, holder = src, location = src)
s.start()
if(exitsmoke)
var/datum/effect_system/fluid_spread/smoke/s = new
s.set_up(4, holder = src, location = dest)
s.start()
uses--
if(uses == 0)
qdel(src)
/* Simple sound player, Mapper friendly! */
/obj/effect/step_trigger/sound_effect
var/sound //eg. path to the sound, inside '' eg: 'growl.ogg'
var/volume = 100
var/freq_vary = 1 //Should the frequency of the sound vary?
var/extra_range = 0 // eg World.view = 7, extra_range = 1, 7+1 = 8, 8 turfs radius
var/happens_once = 0
var/triggerer_only = 0 //Whether the triggerer is the only person who hears this
/obj/effect/step_trigger/sound_effect/Trigger(atom/movable/A)
var/turf/T = get_turf(A)
if(!T)
return
if(triggerer_only && ismob(A))
var/mob/B = A
B.playsound_local(T, sound, volume, freq_vary)
else
playsound(T, sound, volume, freq_vary, extra_range)
if(happens_once)
qdel(src)