mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-17 10:08:09 +01:00
## 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>  </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>
223 lines
6.4 KiB
Plaintext
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)
|