From aa5c84608a61968250cb66b3ef9b8072f09de547 Mon Sep 17 00:00:00 2001 From: Lucy Date: Fri, 5 Jul 2024 17:27:28 -0400 Subject: [PATCH] [PORT] Shuttle events! (#2473) * Shuttle events (#76008) https://github.com/tgstation/tgstation/assets/7501474/a2d83ce8-eba1-42d9-a1f8-9d73f7c40b21 Adds shuttle events! Stuff can now start to happen outside the shuttle, either benign or spicy (but usually just fun to watch)! The shuttle escape sequence is an important part of the game, uniting about every player surviving player. Recently, #71906 has made the escape sequence more forgiving as well as more interesting by conditionally doubling the playing field. The area outside the shuttle is still mostly empty though, except for the few people being spaced, daredevils and the occasional epic space fight. This PR adds adds some space events to spice up the outside of the shuttle! This both gives people something too look at, making the escape sequence feel less static and more lively, as well as give people a reason to go outside and get the full experience of ~being decapitated by a meteor~ swimming with the fishes!
Shuttle Events **Friendly carp swarm** Spawns a group of carp that flies past the shuttle, completely friendly unless provoked. **Friendly meteors** Spawns a lot of strong meteors, but they all miss the shuttle. Completely safe as long as you don't go EVA **Maintenance debris** Picks random stuff from the maintenance spawn pool and throws it at the shuttle. Completely benign, unless you get hit in the head by a toolbox. Could get you some cool stuff though! **Dust storm** Spawns a bunch of dust meteors. Has a rare chance to hit the shuttle, doing minimal damage but can damage windows and might need inflight maintenance **Alien queen** One in every 250 escapes. Spawns a player controlled alien queen and a ripley mech. RIP AND TEAR!! Really not that dangerous when you realize the entire crew is on the shuttle and the queen is fat as fuck, but can still be fun to throw people around a bit before being torn to shreds. **ANGRY CARP** Once in every 500 escapes. Spawns 12 normal carp and 3 big carps, who may just decide to go through the shuttle or try and bust through the window if you look at them wrong. Somewhat dangerous, you could stay away from the windows and try to hide, or more likely shoot at them and weld the windows **Fake TTV** Lol **Italian Storm** Once in every 2000 rounds. Throws pasta, pizza and meatballs at the shuttle. Definitely not me going off the rails with a testing event **Player controlled carp trio** Once in every 100 escapes. Spawns three player controlled carp to harass the shuttle. May rarely be a magicarp, megacarp or chaos carp. I can't honestly see them do anything other than be annoying for 3 seconds and die There are some other admin only ones: a group of passive carps going directly through the shuttle and just being little shits, and a magic carp swarm
Events are selected seperately, there isn't a crazy weighting system, each just has a chance to run, and multiple could run at once. They also don't immediately trigger, so people can get settled a bit, and to make sure just waiting out the more dangerous ones is still a valid strategy. :cl: add: Adds shuttle events! If shuttle escapes weren't exciting before (doubtful), they definitely are now! I'm joking it's mostly an atmosphere thing. admin: Adds an admin panel to interact with shuttle events, under the Events tab: Change Shuttle Events fix: Objects spawned in hyperspace will properly catch hyperspace drift /:cl: There's a few things I'd like to do later (another PR) (honestly anyone can do them because I suck at follow-ups), because this is too big as is: - Hijack triggered shuttle events - More events (got a lot of cool suggestions, but I'm putting most of them on hold) - Maybe stration announcements if some more dangerous ones get added - Structures appearing next to the escape shuttle??? --------- Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> * Fix anti-breach shields being dragged away (#76859) * [no gbp] Fixes runtimes in shuttle event and shuttle cling (#77343) Fixes no-candidate runtime from pick() on an empty list Fixes spawning null movables if run out of mobs to spawn Fixes shuttle cling qdeling on Initialize due to lattices not counting as hyperspace :cl: runtime: Fixes runtimes in shuttle event and shuttle cling code /:cl: --------- Co-authored-by: Jacquerel * Fixes triple carp shuttle event failing (#76860) * Add admin blackhole(s) shuttle event (#77188) ## About The Pull Request This adds a new **Black Hole** admin shuttle event while the escape shuttle is in transit. The regular version spawns a small 1x1 singularity that falls through the ship. There is also a special adminbus Kobayashi Maru version that spawns multiple black holes rapidly. ## Why It's Good For The Game ![dreamseeker_MxqHmKXXQ8](https://github.com/tgstation/tgstation/assets/5195984/e169669a-fb71-48c5-8314-df82852eef3b) Tell me this doesn't look fun? ## Changelog :cl: add: Add admin blackhole shuttle event with a normal version and suicidal version. fix: Fix several shuttle event runtimes /:cl: --------- Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com> * Shuttle event "Turbulence" (#80358) ## About The Pull Request Adds a new shuttle event: turbulence. The escape shuttle is experiencing subspace turbulence, effectively causing the takeoff/landing buckle check to repeat a couple of times during the duration of the flight. Players will get a two second warning when the screen starts shaking, after which if they are not buckled (or... outside of the shuttle I guess) they will fall over for a few seconds. The presence of turbulence in the shuttle's path will be announced shortly after takeoff, so strap yourself in. ## Why It's Good For The Game I think it adds a bit of flavour and influences what is going on in the shuttle (falling over at the wrong moment can turn a scrum over bridge access on its head) without being quite as disruptive as "there's 13 carp in here now". ## Changelog :cl: add: Adds a new shuttle event, where space shuttles can experience minor turbulance. Keep your belt on while the appropriate cabin light is lit. /:cl: Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> * fix duplicate definition --------- Co-authored-by: Time-Green Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com> Co-authored-by: Jacquerel Co-authored-by: Tim Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> --- code/__DEFINES/shuttles.dm | 10 ++ code/__DEFINES/traits.dm | 2 + code/controllers/subsystem/shuttle.dm | 4 +- code/datums/components/shuttle_cling.dm | 27 +++- .../greyscale_configs/greyscale_mobs.dm | 5 + .../greyscale/json_configs/carp_friend.json | 23 +++ .../objects/items/devices/transfer_valve.dm | 8 + code/game/objects/structures/lattice.dm | 7 +- code/game/turfs/open/space/transit.dm | 23 ++- code/modules/admin/admin_verbs.dm | 1 + .../admin/verbs/change_shuttle_events.dm | 42 ++++++ code/modules/awaymissions/cordon.dm | 6 + .../space_management/space_reservation.dm | 7 +- .../mob/living/basic/space_fauna/carp/carp.dm | 35 ++++- code/modules/power/singularity/singularity.dm | 5 + .../projectiles/projectile/energy/_energy.dm | 6 + code/modules/shuttle/emergency.dm | 22 +++ code/modules/shuttle/shuttle.dm | 18 ++- .../shuttle/shuttle_events/_shuttle_events.dm | 140 ++++++++++++++++++ code/modules/shuttle/shuttle_events/carp.dm | 62 ++++++++ .../modules/shuttle/shuttle_events/meteors.dm | 42 ++++++ code/modules/shuttle/shuttle_events/misc.dm | 61 ++++++++ .../shuttle_events/player_controlled.dm | 77 ++++++++++ .../shuttle/shuttle_events/turbulence.dm | 48 ++++++ icons/mob/simple/carp.dmi | Bin 31658 -> 36030 bytes .../code/modules/blueshift/mobs/misc_pets.dm | 41 ----- tgstation.dme | 7 + 27 files changed, 671 insertions(+), 58 deletions(-) create mode 100644 code/datums/greyscale/json_configs/carp_friend.json create mode 100644 code/modules/admin/verbs/change_shuttle_events.dm create mode 100644 code/modules/shuttle/shuttle_events/_shuttle_events.dm create mode 100644 code/modules/shuttle/shuttle_events/carp.dm create mode 100644 code/modules/shuttle/shuttle_events/meteors.dm create mode 100644 code/modules/shuttle/shuttle_events/misc.dm create mode 100644 code/modules/shuttle/shuttle_events/player_controlled.dm create mode 100644 code/modules/shuttle/shuttle_events/turbulence.dm diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm index 5380268e979c..c67d9e1a8327 100644 --- a/code/__DEFINES/shuttles.dm +++ b/code/__DEFINES/shuttles.dm @@ -94,3 +94,13 @@ #define SHUTTLE_UNLOCK_BUBBLEGUM "bubblegum" #define SHUTTLE_UNLOCK_MEDISIM "holodeck" #define SHUTTLE_UNLOCK_NARNAR "narnar" + +//Shuttle Events + +///Self destruct if this is returned in process +#define SHUTTLE_EVENT_CLEAR 2 + +///spawned stuff should float by the window and not hit the shuttle +#define SHUTTLE_EVENT_MISS_SHUTTLE 1 << 0 +///spawned stuff should hit the shuttle +#define SHUTTLE_EVENT_HIT_SHUTTLE 1 << 1 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 5d7ebb88be40..7ee56e1c372d 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -644,6 +644,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_LAVA_STOPPED "lava_stopped" ///Chasms will be safe to cross while they've this trait. #define TRAIT_CHASM_STOPPED "chasm_stopped" +/// The effects of hyperspace drift are blocked when the tile has this trait +#define TRAIT_HYPERSPACE_STOPPED "hyperspace_stopped" ///Turf slowdown will be ignored when this trait is added to a turf. #define TRAIT_TURF_IGNORE_SLOWDOWN "turf_ignore_slowdown" ///Mobs won't slip on a wet turf while it has this trait diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 3a8ccad63adb..5f7dc3f52b89 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -198,8 +198,8 @@ SUBSYSTEM_DEF(shuttle) if(!thing) mobile_docking_ports.Remove(thing) continue - var/obj/docking_port/mobile/P = thing - P.check() + var/obj/docking_port/mobile/port = thing + port.check() for(var/thing in transit_docking_ports) var/obj/docking_port/stationary/transit/T = thing if(!T.owner) diff --git a/code/datums/components/shuttle_cling.dm b/code/datums/components/shuttle_cling.dm index 57c79e15193a..f686d7103bc8 100644 --- a/code/datums/components/shuttle_cling.dm +++ b/code/datums/components/shuttle_cling.dm @@ -38,15 +38,25 @@ ADD_TRAIT(parent, TRAIT_HYPERSPACED, src) RegisterSignals(parent, list(COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_UNBUCKLE, COMSIG_ATOM_NO_LONGER_PULLED), PROC_REF(update_state)) + RegisterSignal(parent, SIGNAL_REMOVETRAIT(TRAIT_FREE_HYPERSPACE_MOVEMENT), PROC_REF(initialize_loop)) + RegisterSignal(parent, SIGNAL_ADDTRAIT(TRAIT_FREE_HYPERSPACE_MOVEMENT), PROC_REF(clear_loop)) //Items have this cool thing where they're first put on the floor if you grab them from storage, and then into your hand, which isn't caught by movement signals that well if(isitem(parent)) RegisterSignal(parent, COMSIG_ITEM_PICKUP, PROC_REF(do_remove)) - hyperloop = SSmove_manager.move(moving = parent, direction = direction, delay = not_clinging_move_delay, subsystem = SShyperspace_drift, priority = MOVEMENT_ABOVE_SPACE_PRIORITY, flags = MOVEMENT_LOOP_NO_DIR_UPDATE|MOVEMENT_LOOP_DRAGGING) + if(!HAS_TRAIT(parent, TRAIT_FREE_HYPERSPACE_MOVEMENT)) + initialize_loop() update_state(parent) //otherwise we'll get moved 1 tile before we can correct ourselves, which isnt super bad but just looks jank +/datum/component/shuttle_cling/proc/initialize_loop() + hyperloop = SSmove_manager.move(moving = parent, direction = direction, delay = not_clinging_move_delay, subsystem = SShyperspace_drift, priority = MOVEMENT_ABOVE_SPACE_PRIORITY, flags = MOVEMENT_LOOP_NO_DIR_UPDATE|MOVEMENT_LOOP_OUTSIDE_CONTROL) + update_state() + +/datum/component/shuttle_cling/proc/clear_loop() + QDEL_NULL(hyperloop) + ///Check if we're in hyperspace and our state in hyperspace /datum/component/shuttle_cling/proc/update_state() SIGNAL_HANDLER @@ -55,6 +65,9 @@ qdel(src) return + if(!hyperloop) + return + var/should_loop = FALSE switch(is_holding_on(parent)) @@ -72,6 +85,10 @@ if(ALL_GOOD) should_loop = FALSE + // the hyperloop can get reset to null from the above procs + if(!hyperloop) + return + //Do pause/unpause/nothing for the hyperloop if(should_loop && hyperloop.paused) hyperloop.resume_loop() @@ -80,12 +97,16 @@ ///Check if we're "holding on" to the shuttle /datum/component/shuttle_cling/proc/is_holding_on(atom/movable/movee) - if(movee.pulledby || !isturf(movee.loc)) + if(movee.pulledby || !isturf(movee.loc) || HAS_TRAIT(movee, TRAIT_FREE_HYPERSPACE_MOVEMENT)) return ALL_GOOD if(!isliving(movee)) + if(HAS_TRAIT(movee, TRAIT_FORCED_GRAVITY)) // nothing can block the singularity + return SUPER_NOT_HOLDING_ON + if(is_tile_solid(get_step(movee, direction))) //something is blocking us so do the cool drift return CLINGING + return SUPER_NOT_HOLDING_ON var/mob/living/living = movee @@ -108,7 +129,7 @@ ///Are we on a hyperspace tile? There's some special bullshit with lattices so we just wrap this check /datum/component/shuttle_cling/proc/is_on_hyperspace(atom/movable/clinger) - if(istype(clinger.loc, hyperspace_type) && !(locate(/obj/structure/lattice) in clinger.loc)) + if(istype(clinger.loc, hyperspace_type) && !HAS_TRAIT(clinger.loc, TRAIT_HYPERSPACE_STOPPED)) return TRUE return FALSE diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_mobs.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_mobs.dm index f8a0f4a062c6..bbcb44f91754 100644 --- a/code/datums/greyscale/config_types/greyscale_configs/greyscale_mobs.dm +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_mobs.dm @@ -7,6 +7,11 @@ icon_file = 'icons/mob/simple/carp.dmi' json_config = 'code/datums/greyscale/json_configs/carp.json' +/datum/greyscale_config/carp_friend + name = "Friend Carp" + icon_file = 'icons/mob/simple/carp.dmi' + json_config = 'code/datums/greyscale/json_configs/carp_friend.json' + /datum/greyscale_config/carp_magic name = "Magicarp" icon_file = 'icons/mob/simple/carp.dmi' diff --git a/code/datums/greyscale/json_configs/carp_friend.json b/code/datums/greyscale/json_configs/carp_friend.json new file mode 100644 index 000000000000..a5b3ffdf7a47 --- /dev/null +++ b/code/datums/greyscale/json_configs/carp_friend.json @@ -0,0 +1,23 @@ +{ + "base_friend": [ + { + "type": "icon_state", + "icon_state": "base_friend", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "base_friend_mouth", + "blend_mode": "overlay" + } + ], + "base_friend_dead": [ + { + "type": "icon_state", + "icon_state": "base_friend_dead", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 7dee7378e6f1..feeedc5a823b 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -292,3 +292,11 @@ */ /obj/item/transfer_valve/proc/ready() return tank_one && tank_two + +/obj/item/transfer_valve/fake/Initialize(mapload) + . = ..() + + tank_one = new /obj/item/tank/internals/plasma (src) + tank_two = new /obj/item/tank/internals/oxygen (src) + + update_appearance() diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 50f31d76346f..ff71f06497e9 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -16,7 +16,7 @@ canSmoothWith = SMOOTH_GROUP_LATTICE + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_OPEN_FLOOR var/number_of_mats = 1 var/build_material = /obj/item/stack/rods - var/list/give_turf_traits = list(TRAIT_CHASM_STOPPED) + var/list/give_turf_traits = list(TRAIT_CHASM_STOPPED, TRAIT_HYPERSPACE_STOPPED) /obj/structure/lattice/Initialize(mapload) . = ..() @@ -24,7 +24,6 @@ give_turf_traits = string_list(give_turf_traits) AddElement(/datum/element/give_turf_traits, give_turf_traits) - /datum/armor/structure_lattice melee = 50 fire = 80 @@ -100,7 +99,7 @@ smoothing_groups = SMOOTH_GROUP_CATWALK + SMOOTH_GROUP_LATTICE + SMOOTH_GROUP_OPEN_FLOOR canSmoothWith = SMOOTH_GROUP_CATWALK obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP - give_turf_traits = list(TRAIT_TURF_IGNORE_SLOWDOWN, TRAIT_LAVA_STOPPED, TRAIT_CHASM_STOPPED) + give_turf_traits = list(TRAIT_TURF_IGNORE_SLOWDOWN, TRAIT_LAVA_STOPPED, TRAIT_CHASM_STOPPED, TRAIT_HYPERSPACE_STOPPED) /obj/structure/lattice/catwalk/Initialize(mapload) . = ..() @@ -155,7 +154,7 @@ canSmoothWith = SMOOTH_GROUP_LATTICE obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP resistance_flags = FIRE_PROOF | LAVA_PROOF - give_turf_traits = list(TRAIT_LAVA_STOPPED, TRAIT_CHASM_STOPPED) + give_turf_traits = list(TRAIT_LAVA_STOPPED, TRAIT_CHASM_STOPPED, TRAIT_HYPERSPACE_STOPPED) /obj/structure/lattice/lava/deconstruction_hints(mob/user) return span_notice("The rods look like they could be cut, but the heat treatment will shatter off. There's space for a tile.") diff --git a/code/game/turfs/open/space/transit.dm b/code/game/turfs/open/space/transit.dm index 6c58d4872947..8876080830bf 100644 --- a/code/game/turfs/open/space/transit.dm +++ b/code/game/turfs/open/space/transit.dm @@ -11,10 +11,13 @@ . = ..() update_appearance() RegisterSignal(src, COMSIG_TURF_RESERVATION_RELEASED, PROC_REF(launch_contents)) + RegisterSignal(src, COMSIG_ATOM_ENTERED, PROC_REF(initialize_drifting)) + RegisterSignal(src, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, PROC_REF(initialize_drifting_but_from_initialize)) /turf/open/space/transit/Destroy() //Signals are NOT removed from turfs upon replacement, and we get replaced ALOT, so unregister our signal - UnregisterSignal(src, COMSIG_TURF_RESERVATION_RELEASED) + UnregisterSignal(src, list(COMSIG_TURF_RESERVATION_RELEASED, COMSIG_ATOM_ENTERED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON)) + return ..() /turf/open/space/transit/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) @@ -30,11 +33,17 @@ icon_state = "speedspace_ns_[get_transit_state(src)]" return ..() -/turf/open/space/transit/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) - . = ..() +/turf/open/space/transit/proc/initialize_drifting(atom/entered, atom/movable/enterer) + SIGNAL_HANDLER - if(!HAS_TRAIT(arrived, TRAIT_HYPERSPACED) && !HAS_TRAIT(arrived, TRAIT_FREE_HYPERSPACE_MOVEMENT)) - arrived.AddComponent(/datum/component/shuttle_cling, turn(dir, 180), old_loc) + if(enterer && !HAS_TRAIT(enterer, TRAIT_HYPERSPACED) && !HAS_TRAIT(src, TRAIT_HYPERSPACE_STOPPED)) + enterer.AddComponent(/datum/component/shuttle_cling, turn(dir, 180)) + +/turf/open/space/transit/proc/initialize_drifting_but_from_initialize(atom/movable/location, atom/movable/enterer, mapload) + SIGNAL_HANDLER + + if(!mapload && !enterer.anchored) + INVOKE_ASYNC(src, PROC_REF(initialize_drifting), src, enterer) /turf/open/space/transit/Exited(atom/movable/gone, direction) . = ..() @@ -52,6 +61,10 @@ ///Dump a movable in a random valid spacetile /proc/dump_in_space(atom/movable/dumpee) + if(HAS_TRAIT(dumpee, TRAIT_DEL_ON_SPACE_DUMP)) + qdel(dumpee) + return + var/max = world.maxx-TRANSITIONEDGE var/min = 1+TRANSITIONEDGE diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index a6c087f2b074..5f61e2bc7035 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -48,6 +48,7 @@ GLOBAL_PROTECT(admin_verbs_admin) /datum/admins/proc/open_artifactpanel, /datum/verbs/menu/Admin/verb/playerpanel, /* It isn't /datum/admin but it fits no less */ /datum/admins/proc/kick_player_by_ckey, //MONKESTATION ADDITION - kick a player by their ckey + /datum/admins/proc/change_shuttle_events, //allows us to change the shuttle events // Client procs /client/proc/admin_call_shuttle, /*allows us to call the emergency shuttle*/ /client/proc/admin_cancel_shuttle, /*allows us to cancel the emergency shuttle, sending it back to centcom*/ diff --git a/code/modules/admin/verbs/change_shuttle_events.dm b/code/modules/admin/verbs/change_shuttle_events.dm new file mode 100644 index 000000000000..a24aa456f237 --- /dev/null +++ b/code/modules/admin/verbs/change_shuttle_events.dm @@ -0,0 +1,42 @@ +///Manipulate the events that are gonna run/are running on the escape shuttle +/datum/admins/proc/change_shuttle_events() + set category = "Admin.Events" + set name = "Change Shuttle Events" + set desc = "Allows you to change the events on a shuttle." + + if (!istype(src, /datum/admins)) + src = usr.client.holder + if (!istype(src, /datum/admins)) + to_chat(usr, "Error: you are not an admin!", confidential = TRUE) + return + + //At least for now, just letting admins modify the emergency shuttle is fine + var/obj/docking_port/mobile/port = SSshuttle.emergency + + if(!port) + to_chat(usr, span_admin("Uh oh, couldn't find the escape shuttle!")) + + var/list/options = list("Clear"="Clear") + + //Grab the active events so we know which ones we can Add or Remove + var/list/active = list() + for(var/datum/shuttle_event/event in port.event_list) + active[event.type] = event + + for(var/datum/shuttle_event/event as anything in subtypesof(/datum/shuttle_event)) + options[((event in active) ? "(Remove)" : "(Add)") + initial(event.name)] = event + + //Throw up an ugly menu with the shuttle events and the options to add or remove them, or clear them all + var/result = input(usr, "Choose an event to add/remove", "Shuttle Events") as null|anything in sort_list(options) + + if(result == "Clear") + port.event_list.Cut() + log_admin("[key_name_admin(usr)] has cleared the shuttle events on: [port]") + else if(options[result]) + var/typepath = options[result] + if(typepath in active) + port.event_list.Remove(active[options[result]]) + log_admin("[key_name_admin(usr)] has removed '[active[result]]' from [port].") + else + port.event_list.Add(new typepath (port)) + log_admin("[key_name_admin(usr)] has added '[typepath]' to [port].") diff --git a/code/modules/awaymissions/cordon.dm b/code/modules/awaymissions/cordon.dm index 177fc85ba37d..285d0d49e105 100644 --- a/code/modules/awaymissions/cordon.dm +++ b/code/modules/awaymissions/cordon.dm @@ -46,6 +46,12 @@ /turf/cordon/Adjacent(atom/neighbor, atom/target, atom/movable/mover) return FALSE +/turf/cordon/Bumped(atom/movable/bumped_atom) + . = ..() + + if(HAS_TRAIT(bumped_atom, TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT)) //we could feasibly reach the border, so just dont + dump_in_space(bumped_atom) + /// Area used in conjuction with the cordon turf to create a fully functioning world border. /area/misc/cordon name = "CORDON" diff --git a/code/modules/mapping/space_management/space_reservation.dm b/code/modules/mapping/space_management/space_reservation.dm index 8c246699b4eb..b4e933d87d3c 100644 --- a/code/modules/mapping/space_management/space_reservation.dm +++ b/code/modules/mapping/space_management/space_reservation.dm @@ -115,7 +115,7 @@ /datum/turf_reservation/transit/make_repel(turf/pre_cordon_turf) ..() - RegisterSignal(pre_cordon_turf, COMSIG_ATOM_ENTERED, PROC_REF(space_dump)) + RegisterSignal(pre_cordon_turf, COMSIG_ATOM_ENTERED, PROC_REF(space_dump_soft)) /datum/turf_reservation/transit/stop_repel(turf/pre_cordon_turf) ..() @@ -127,6 +127,11 @@ dump_in_space(enterer) +/datum/turf_reservation/transit/proc/space_dump_soft(atom/source, atom/movable/enterer) + SIGNAL_HANDLER + + if(!HAS_TRAIT(enterer, TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT)) + space_dump(source, enterer) /// Internal proc which handles reserving the area for the reservation. /datum/turf_reservation/proc/_reserve_area(width, height, zlevel) diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp.dm b/code/modules/mob/living/basic/space_fauna/carp/carp.dm index b42000f27701..24fb0b582642 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp.dm @@ -100,9 +100,10 @@ ) /mob/living/basic/carp/Initialize(mapload, mob/tamer) + ADD_TRAIT(src, TRAIT_FREE_HYPERSPACE_MOVEMENT, INNATE_TRAIT) //Need to set before init cause if we init in hyperspace we get dragged before the trait can be added . = ..() apply_colour() - add_traits(list(TRAIT_HEALS_FROM_CARP_RIFTS, TRAIT_SPACEWALK, TRAIT_FREE_HYPERSPACE_MOVEMENT), INNATE_TRAIT) + add_traits(list(TRAIT_HEALS_FROM_CARP_RIFTS, TRAIT_SPACEWALK), INNATE_TRAIT) if (cell_line) AddElement(/datum/element/swabable, cell_line, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) @@ -165,6 +166,16 @@ ai_controller.set_blackboard_key(BB_CARP_MIGRATION_PATH, actual_points) +/mob/living/basic/carp/death(gibbed) + . = ..() + + REMOVE_TRAIT(src, TRAIT_FREE_HYPERSPACE_MOVEMENT, INNATE_TRAIT) + +/mob/living/basic/carp/revive(full_heal_flags, excess_healing, force_grab_ghost) + . = ..() + + ADD_TRAIT(src, TRAIT_FREE_HYPERSPACE_MOVEMENT, INNATE_TRAIT) + /** * Holographic carp from the holodeck */ @@ -259,3 +270,25 @@ new_overlays += disk_overlay #undef RARE_CAYENNE_CHANCE + +///Wild carp that just vibe ya know +/mob/living/basic/carp/passive + name = "passive carp" + desc = "A timid, sucker-bearing creature that resembles a fish. " + + icon_state = "base_friend" + icon_living = "base_friend" + icon_dead = "base_friend_dead" + greyscale_config = /datum/greyscale_config/carp_friend + + attack_verb_continuous = "suckers" + attack_verb_simple = "suck" + + melee_damage_lower = 4 + melee_damage_upper = 4 + ai_controller = /datum/ai_controller/basic_controller/carp/passive + +/mob/living/basic/carp/passive/Initialize(mapload) + . = ..() + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/pet_bonus, "bloops happily!") diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 603dc1ffe091..d61573491c51 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -48,6 +48,7 @@ /// What the game tells ghosts when you make one var/ghost_notification_message = "IT'S LOOSE" + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSDOORS flags_1 = SUPERMATTER_IGNORES_1 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF | SHUTTLE_CRUSH_PROOF obj_flags = CAN_BE_HIT | DANGEROUS_POSSESSION @@ -470,3 +471,7 @@ /obj/singularity/deadchat_controlled/Initialize(mapload, starting_energy) . = ..() deadchat_plays(mode = DEMOCRACY_MODE) + +/// Special singularity that spawns for shuttle events only +/obj/singularity/shuttle_event + anchored = FALSE diff --git a/code/modules/projectiles/projectile/energy/_energy.dm b/code/modules/projectiles/projectile/energy/_energy.dm index 8527041e8600..6b715fdb74f5 100644 --- a/code/modules/projectiles/projectile/energy/_energy.dm +++ b/code/modules/projectiles/projectile/energy/_energy.dm @@ -6,3 +6,9 @@ armor_flag = ENERGY reflectable = REFLECT_NORMAL impact_effect_type = /obj/effect/temp_visual/impact_effect/energy + +/obj/projectile/energy/Initialize(mapload) + . = ..() + + ADD_TRAIT(src, TRAIT_FREE_HYPERSPACE_MOVEMENT, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_FREE_HYPERSPACE_MOVEMENT, TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT) diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 3ef25b22e219..97e1a1b0791e 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -313,6 +313,11 @@ var/sound_played = 0 //If the launch sound has been sent to all players on the shuttle itself var/hijack_status = NOT_BEGUN +/obj/docking_port/mobile/emergency/Initialize(mapload) + . = ..() + + setup_shuttle_events() + /obj/docking_port/mobile/emergency/canDock(obj/docking_port/stationary/S) return SHUTTLE_CAN_DOCK //If the emergency shuttle can't move, the whole game breaks, so it will force itself to land even if it has to crush a few departments in the process @@ -480,6 +485,7 @@ color_override = "orange", ) ShuttleDBStuff() + addtimer(CALLBACK(src, PROC_REF(announce_shuttle_events)), 20 SECONDS) if(SHUTTLE_DOCKED) @@ -536,6 +542,10 @@ color_override = "orange", ) INVOKE_ASYNC(SSticker, TYPE_PROC_REF(/datum/controller/subsystem/ticker, poll_hearts)) + //Tell the events we're starting, so they can time their spawns or do some other stuff + for(var/datum/shuttle_event/event as anything in event_list) + event.start_up_event(SSshuttle.emergency_escape_time * engine_coeff) + SSmapping.mapvote() //If no map vote has been run yet, start one. if(SHUTTLE_STRANDED, SHUTTLE_DISABLED) @@ -563,6 +573,8 @@ if(istype(M, /obj/docking_port/mobile/pod)) M.parallax_slowdown() + process_events() + if(time_left <= 0) //move each escape pod to its corresponding escape dock for(var/obj/docking_port/mobile/port as anything in SSshuttle.mobile_docking_ports) @@ -596,6 +608,16 @@ color_override = "orange", ) +///Generate a list of events to run during the departure +/obj/docking_port/mobile/emergency/proc/setup_shuttle_events() + var/list/names = list() + for(var/datum/shuttle_event/event as anything in subtypesof(/datum/shuttle_event)) + if(prob(initial(event.event_probability))) + event_list.Add(new event(src)) + names += initial(event.name) + if(LAZYLEN(names)) + log_game("[capitalize(name)] has selected the following shuttle events: [english_list(names)].") + /obj/docking_port/mobile/monastery name = "monastery pod" shuttle_id = "mining_common" //set so mining can call it down diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 769de2efb336..fdf008c26344 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -488,6 +488,8 @@ ///if this shuttle can move docking ports other than the one it is docked at var/can_move_docking_ports = FALSE var/list/hidden_turfs = list() + ///List of shuttle events that can run or are running + var/list/datum/shuttle_event/event_list = list() #define WORLDMAXX_CUTOFF (world.maxx + 1) #define WORLDMAXY_CUTOFF (world.maxx + 1) @@ -843,6 +845,7 @@ //used by shuttle subsystem to check timers /obj/docking_port/mobile/proc/check() check_effects() + //process_events() if you were to add events to non-escape shuttles, uncomment this if(mode == SHUTTLE_IGNITING) check_transit_zone() @@ -1148,13 +1151,17 @@ return FALSE return ..() - //Called when emergency shuttle leaves the station /obj/docking_port/mobile/proc/on_emergency_launch() if(launch_status == UNLAUNCHED) //Pods will not launch from the mine/planet, and other ships won't launch unless we tell them to. launch_status = ENDGAME_LAUNCHED enterTransit() +///Let people know shits about to go down +/obj/docking_port/mobile/proc/announce_shuttle_events() + for(var/datum/shuttle_event/event as anything in event_list) + notify_ghosts("The [name] has selected: [event.name]") + /obj/docking_port/mobile/emergency/on_emergency_launch() return @@ -1173,6 +1180,15 @@ /obj/docking_port/mobile/emergency/on_emergency_dock() return +///Process all the shuttle events for every shuttle tick we get +/obj/docking_port/mobile/proc/process_events() + var/list/removees + for(var/datum/shuttle_event/event as anything in event_list) + if(event.event_process() == SHUTTLE_EVENT_CLEAR) //if we return SHUTTLE_EVENT_CLEAR, we clean them up + LAZYADD(removees, event) + for(var/item in removees) + event_list.Remove(item) + #ifdef TESTING #undef DOCKING_PORT_HIGHLIGHT #endif diff --git a/code/modules/shuttle/shuttle_events/_shuttle_events.dm b/code/modules/shuttle/shuttle_events/_shuttle_events.dm new file mode 100644 index 000000000000..6736428c02aa --- /dev/null +++ b/code/modules/shuttle/shuttle_events/_shuttle_events.dm @@ -0,0 +1,140 @@ +///An event that can run during shuttle flight, and will run for the duration of it (configurable) +/datum/shuttle_event + ///How we're announced to ghosts and stuff + var/name = "The concept of a shuttle event" + ///probability of this event to run from 0 to 100 + var/event_probability = 0 + ///Track if we're allowed to run, gets turned to TRUE when the activation timer hits + VAR_PRIVATE/active = FALSE + ///fraction of the escape timer at which we activate, 0 means we start running immediately + ///(so if activation timer is 0.2 and shuttle takes 3 minutes to get going, it will activate in 36 seconds) + ///We only care about the timer from the moment of launch, any speed changed afterwards are not worth dealing with + var/activation_fraction = 0 + ///when do we activate? + VAR_PRIVATE/activate_at + ///Our reference to the docking port and thus the shuttle + var/obj/docking_port/mobile/port + +/datum/shuttle_event/New(obj/docking_port/mobile/port) + . = ..() + + src.port = port + +/datum/shuttle_event/proc/start_up_event(evacuation_duration) + activate_at = world.time + evacuation_duration * activation_fraction + +///We got activated +/datum/shuttle_event/proc/activate() + return + +///Process with the SShutle subsystem. Return SHUTTLE_EVENT_CLEAR to self-destruct +/datum/shuttle_event/proc/event_process() + . = TRUE + + if(!active) + if(world.time < activate_at) + return FALSE + active = TRUE + . = activate() + +///Spawns objects, mobs, whatever with all the necessary code to make it hit and/or miss the shuttle +/datum/shuttle_event/simple_spawner + ///behaviour of spawning objects, if we spawn + var/spawning_flags = SHUTTLE_EVENT_MISS_SHUTTLE | SHUTTLE_EVENT_HIT_SHUTTLE + ///List of valid spawning turfs, generated from generate_spawning_turfs(), that will HIT the shuttle + var/list/turf/spawning_turfs_hit + ///List of valid spawning turfs, generated from generate_spawning_turfs(), that will MISS the shuttle + var/list/turf/spawning_turfs_miss + ///Chance, from 0 to 100, for something to spawn + var/spawn_probability_per_process = 0 + ///Increment if you want more stuff to spawn at once + var/spawns_per_spawn = 1 + ///weighted list with spawnable movables + var/list/spawning_list = list() + ///If set to TRUE, every time an object is spawned their weight is decreased untill they are removed + var/remove_from_list_when_spawned = FALSE + ///If set to true, we'll delete ourselves if we cant spawn anything anymore. Useful in conjunction with remove_from_list_when_spawned + var/self_destruct_when_empty = FALSE + +/datum/shuttle_event/simple_spawner/start_up_event(evacuation_duration) + ..() + + generate_spawning_turfs(port.return_coords(), spawning_flags, port.preferred_direction) + +///Bounding coords are list(x0, y0, x1, y1) where x0 and y0 are top-left +/datum/shuttle_event/simple_spawner/proc/generate_spawning_turfs(list/bounding_coords, spawning_behaviour, direction) + spawning_turfs_hit = list() //turfs that will drift its contents to miss the shuttle + spawning_turfs_miss = list() //turfs that will drift its contents to hit the shuttle + var/list/step_dir //vector, either -1, 0 or 1. once we get a corner (lets say top right), in which direction do we 'walk' to get the full side? (this case to the right, so (1, 0) + var/list/target_corner //Top left or bottom right corner + var/list/spawn_offset //bounding_coords is ONLY the shuttle, not the space around it, so offset spawn_tiles or stuff spawns on the walls of the shuttle + + switch(direction) + if(NORTH) //we're travelling north (so people get pushed south) + step_dir = list(1, 0) + target_corner = list(bounding_coords[1], bounding_coords[2]) + spawn_offset = list(0, SHUTTLE_TRANSIT_BORDER) + if(SOUTH) + step_dir = list(-1, 0) + target_corner = list(bounding_coords[3], bounding_coords[4]) + spawn_offset = list(0, -SHUTTLE_TRANSIT_BORDER) + if(EAST) + step_dir = list(0, 1) + target_corner = list(bounding_coords[3], bounding_coords[4]) + spawn_offset = list(SHUTTLE_TRANSIT_BORDER, 0) + if(WEST) + step_dir = list(0, -1) + target_corner = list(bounding_coords[1], bounding_coords[2]) + spawn_offset = list(-SHUTTLE_TRANSIT_BORDER, 0) + + if(spawning_behaviour & SHUTTLE_EVENT_HIT_SHUTTLE) + ///so we get either the horizontal width or vertical width, which would both equal the amount of spawn tiles + var/tile_amount = abs((direction == NORTH || SOUTH) ? bounding_coords[1] - bounding_coords[3] : bounding_coords[2] - bounding_coords[4]) + for(var/i in 0 to tile_amount) + var/list/target_coords = list(target_corner[1] + step_dir[1] * i + spawn_offset[1], target_corner[2] + step_dir[2] * i + spawn_offset[2]) + spawning_turfs_hit.Add(locate(target_coords[1], target_coords[2], port.z)) + if(spawning_behaviour & SHUTTLE_EVENT_MISS_SHUTTLE) + for(var/i in 1 to SHUTTLE_TRANSIT_BORDER) + //Get the corner tile, and move away from the shuttle and towards the cordon + spawning_turfs_miss.Add(locate(target_corner[1] - step_dir[1] * i + spawn_offset[1], target_corner[2] - step_dir[2] * i + spawn_offset[2], port.z)) + var/corner_delta = list(bounding_coords[3] - bounding_coords[1], bounding_coords[2] - bounding_coords[4]) + //Get the corner tile, but jump over the shuttle and then continue unto the cordon + spawning_turfs_miss.Add(locate(target_corner[1] + corner_delta[1] * step_dir[1] + step_dir[1] * i + spawn_offset[1], target_corner[2] + corner_delta[2] * step_dir[2] + step_dir[2] * i + spawn_offset[2], port.z)) + + +/datum/shuttle_event/simple_spawner/event_process() + . = ..() + + if(!.) + return + + if(!LAZYLEN(spawning_list)) + if(self_destruct_when_empty) + return SHUTTLE_EVENT_CLEAR + return + + if(prob(spawn_probability_per_process)) + for(var/i in 1 to spawns_per_spawn) + spawn_movable(get_type_to_spawn()) + +///Pick a random turf from the valid turfs we got. Overwrite if you need some custom picking +/datum/shuttle_event/simple_spawner/proc/get_spawn_turf() + RETURN_TYPE(/turf) + return pick(spawning_turfs_hit + spawning_turfs_miss) + +///Spawn stuff! if you're not using this, don't use the simple_spawner subtype +/datum/shuttle_event/simple_spawner/proc/spawn_movable(spawn_type) + post_spawn(new spawn_type (get_spawn_turf())) + +///Not technically a getter if remove_from_list_when_spawned=TRUE. Otherwise, this returns the type we're going to spawn and throw at the shuttle +/datum/shuttle_event/simple_spawner/proc/get_type_to_spawn() + . = pick_weight(spawning_list) + if(remove_from_list_when_spawned) //if we have this enabled, we decrease the pickweight by 1 till it runs out + spawning_list[.] -= 1 + if(spawning_list[.] < 1) + spawning_list.Remove(.) + +///Do any post-spawn edits you need to do +/datum/shuttle_event/simple_spawner/proc/post_spawn(atom/movable/spawnee) + ADD_TRAIT(spawnee, TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT, REF(src)) //Lets us spawn and move further away from the shuttle without being teleported into space + ADD_TRAIT(spawnee, TRAIT_DEL_ON_SPACE_DUMP, REF(src)) //if we hit the cordon, we get deleted. If the shuttle can make you, it can qdel you diff --git a/code/modules/shuttle/shuttle_events/carp.dm b/code/modules/shuttle/shuttle_events/carp.dm new file mode 100644 index 000000000000..18529f1c0288 --- /dev/null +++ b/code/modules/shuttle/shuttle_events/carp.dm @@ -0,0 +1,62 @@ +///CARPTIDE! CARPTIDE! CARPTIDE! A swarm of carp will pass by and through the shuttle, including consequences of carp going through the shuttle +/datum/shuttle_event/simple_spawner/carp + name = "Carp Nest! (Very Dangerous!)" + event_probability = 0.4 + activation_fraction = 0.2 + + spawning_list = list(/mob/living/basic/carp = 12, /mob/living/basic/carp/mega = 3) + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE | SHUTTLE_EVENT_MISS_SHUTTLE + spawn_probability_per_process = 20 + + remove_from_list_when_spawned = TRUE + self_destruct_when_empty = TRUE + +/datum/shuttle_event/simple_spawner/carp/post_spawn(mob/living/basic/carp/carpee) + . = ..() + //Give the carp the goal to migrate in a straight line so they dont just idle in hyperspace + carpee.migrate_to(list(WEAKREF(get_edge_target_turf(carpee.loc, angle2dir(dir2angle(port.preferred_direction) - 180))))) + +///CARPTIDE! CARPTIDE! CARPTIDE! Magical carp will attack the shuttle! +/datum/shuttle_event/simple_spawner/carp/magic + name = "Magical Carp Nest! (Very Dangerous!)" + event_probability = 0 + activation_fraction = 0.2 + + spawning_list = list(/mob/living/basic/carp/magic = 12, /mob/living/basic/carp/magic/chaos = 1) + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE | SHUTTLE_EVENT_MISS_SHUTTLE + spawn_probability_per_process = 20 + + remove_from_list_when_spawned = TRUE + self_destruct_when_empty = TRUE + +///Spawn a bunch of friendly carp to view from inside the shuttle! May occassionally pass through and nibble some windows, but are otherwise pretty harmless +/datum/shuttle_event/simple_spawner/carp/friendly + name = "Passive Carp Nest! (Mostly Harmless!)" + event_probability = 3 + activation_fraction = 0.1 + + spawning_list = list(/mob/living/basic/carp/passive = 1) + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE | SHUTTLE_EVENT_MISS_SHUTTLE + spawns_per_spawn = 2 + spawn_probability_per_process = 100 + + remove_from_list_when_spawned = FALSE + + ///Chance we hit the shuttle, instead of flying past it (most carp will go through anyway, and we dont want this to be too annoying to take away from the majesty) + var/hit_the_shuttle_chance = 1 + +/datum/shuttle_event/simple_spawner/carp/friendly/get_spawn_turf() + return prob(hit_the_shuttle_chance) ? pick(spawning_turfs_hit) : pick(spawning_turfs_miss) + +///Same as /friendly, but we only go through the shuttle, MUHAHAHAHAHAHA!! They dont actually harm anyone, but itll be a clusterfuck of confusion +/datum/shuttle_event/simple_spawner/carp/friendly_but_no_personal_space + name = "Comfortable Carp Nest going through the shuttle! (Extremely annoying and confusing!)" + event_probability = 0 + activation_fraction = 0.5 + + spawning_list = list(/mob/living/basic/carp/passive = 1) + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE + spawns_per_spawn = 2 + spawn_probability_per_process = 100 + + remove_from_list_when_spawned = FALSE diff --git a/code/modules/shuttle/shuttle_events/meteors.dm b/code/modules/shuttle/shuttle_events/meteors.dm new file mode 100644 index 000000000000..d1ded58cbada --- /dev/null +++ b/code/modules/shuttle/shuttle_events/meteors.dm @@ -0,0 +1,42 @@ +/datum/shuttle_event/simple_spawner/meteor + spawning_list = list(/obj/effect/meteor) + +/datum/shuttle_event/simple_spawner/meteor/post_spawn(atom/movable/spawnee) + ADD_TRAIT(spawnee, TRAIT_FREE_HYPERSPACE_MOVEMENT, src) + ..() + +/datum/shuttle_event/simple_spawner/meteor/spawn_movable(spawn_type) + var/turf/spawn_turf = get_spawn_turf() + //invert the dir cause we shoot in the opposite direction we're flying + if(ispath(spawn_type, /obj/effect/meteor)) + post_spawn(new spawn_type (spawn_turf, get_edge_target_turf(spawn_turf, angle2dir(dir2angle(port.preferred_direction) - 180)))) + else //if you want to spawn some random garbage inbetween, go wild + post_spawn(new spawn_type (get_spawn_turf())) + +///Very weak meteors, but may very rarely actually hit the shuttle! +/datum/shuttle_event/simple_spawner/meteor/dust + name = "Dust Meteors! (Mostly Safe)" + event_probability = 2 + activation_fraction = 0.1 + + spawn_probability_per_process = 100 + spawns_per_spawn = 5 + spawning_list = list(/obj/effect/meteor/dust = 1, /obj/effect/meteor/sand = 1) + spawning_flags = SHUTTLE_EVENT_MISS_SHUTTLE | SHUTTLE_EVENT_HIT_SHUTTLE + ///We can, occassionally, hit the shuttle, but we dont do a lot of damage and should only do so pretty rarely + var/hit_the_shuttle_chance = 1 + +/datum/shuttle_event/simple_spawner/meteor/dust/get_spawn_turf() + return prob(hit_the_shuttle_chance) ? pick(spawning_turfs_hit) : pick(spawning_turfs_miss) + +///Okay this spawns a lot of really bad meteors, but they never hit the shuttle so it's perfectly safe (unless you go outside lol) +/datum/shuttle_event/simple_spawner/meteor/safe + name = "Various Meteors! (Safe)" + event_probability = 5 + activation_fraction = 0.1 + + spawn_probability_per_process = 100 + spawns_per_spawn = 6 + spawning_flags = SHUTTLE_EVENT_MISS_SHUTTLE + spawning_list = list(/obj/effect/meteor/medium = 10, /obj/effect/meteor/big = 5, /obj/effect/meteor/flaming = 3, /obj/effect/meteor/cluster = 1, + /obj/effect/meteor/irradiated = 3, /obj/effect/meteor/bluespace = 2) diff --git a/code/modules/shuttle/shuttle_events/misc.dm b/code/modules/shuttle/shuttle_events/misc.dm new file mode 100644 index 000000000000..f65eddadf7cb --- /dev/null +++ b/code/modules/shuttle/shuttle_events/misc.dm @@ -0,0 +1,61 @@ +///thats amoreeeeee +/datum/shuttle_event/simple_spawner/italian + name = "Italian Storm! (Mama Mia!)" + event_probability = 0.05 + + spawns_per_spawn = 5 + spawning_flags = SHUTTLE_EVENT_MISS_SHUTTLE | SHUTTLE_EVENT_HIT_SHUTTLE + spawn_probability_per_process = 100 + spawning_list = list(/obj/item/food/spaghetti/boiledspaghetti = 5, /obj/item/food/meatball = 1, /obj/item/food/spaghetti/pastatomato = 2, + /obj/item/food/spaghetti/meatballspaghetti = 2, /obj/item/food/pizza/margherita = 1) + +///We do a little bit of tomfoolery +/datum/shuttle_event/simple_spawner/fake_ttv + name = "Fake TTV (Harmless!)" + event_probability = 0.5 + activation_fraction = 0.1 + + spawning_list = list(/obj/item/transfer_valve/fake = 1) + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE + spawn_probability_per_process = 5 + + remove_from_list_when_spawned = TRUE + self_destruct_when_empty = TRUE + +///Just spawn random maint garbage +/datum/shuttle_event/simple_spawner/maintenance + name = "Maintenance Debris (Harmless!)" + event_probability = 3 + activation_fraction = 0.1 + + spawning_list = list() + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE | SHUTTLE_EVENT_MISS_SHUTTLE + spawn_probability_per_process = 100 + spawns_per_spawn = 2 + +/datum/shuttle_event/simple_spawner/maintenance/get_type_to_spawn() + var/list/spawn_list = GLOB.maintenance_loot + while(islist(spawn_list)) + spawn_list = pick_weight(spawn_list) + return spawn_list + +///Sensors indicate that a black hole's gravitational field is affecting the region of space we were headed through +/datum/shuttle_event/simple_spawner/black_hole + name = "Black Hole (Oh no!)" + event_probability = 0 // only admin spawnable + spawn_probability_per_process = 10 + activation_fraction = 0.35 + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE + spawning_list = list(/obj/singularity/shuttle_event = 1) + // only spawn it once + remove_from_list_when_spawned = TRUE + self_destruct_when_empty = TRUE + +///Kobayashi Maru version +/datum/shuttle_event/simple_spawner/black_hole/adminbus + name = "Black Holes (OH GOD!)" + event_probability = 0 + spawn_probability_per_process = 50 + activation_fraction = 0.2 + spawning_list = list(/obj/singularity/shuttle_event = 10) + remove_from_list_when_spawned = TRUE diff --git a/code/modules/shuttle/shuttle_events/player_controlled.dm b/code/modules/shuttle/shuttle_events/player_controlled.dm new file mode 100644 index 000000000000..fb4d6f6945c5 --- /dev/null +++ b/code/modules/shuttle/shuttle_events/player_controlled.dm @@ -0,0 +1,77 @@ +///Mobs spawned with this one are automatically player controlled, if possible +/datum/shuttle_event/simple_spawner/player_controlled + spawning_list = list(/mob/living/basic/carp) + + ///If we cant find a ghost, do we spawn them anyway? Otherwise they go in the garbage bin + var/spawn_anyway_if_no_player = FALSE + + var/ghost_alert_string = "Would you like to be shot at the shuttle?" + + var/role_type = ROLE_SENTIENCE + +/datum/shuttle_event/simple_spawner/player_controlled/spawn_movable(spawn_type) + if(ispath(spawn_type, /mob/living)) + INVOKE_ASYNC(src, PROC_REF(try_grant_ghost_control), spawn_type) + else + ..() + +/// Attempt to grant control of a mob to ghosts before spawning it in. if spawn_anyway_if_no_player = TRUE, we spawn the mob even if there's no ghosts +/datum/shuttle_event/simple_spawner/player_controlled/proc/try_grant_ghost_control(spawn_type) + var/list/candidates = SSpolling.poll_ghost_candidates( + ghost_alert_string + " (Warning: you will not be able to return to your body!)", + check_jobban = role_type, + poll_time = 10 SECONDS, + pic_source = spawn_type, + role_name_text = "shot at shuttle" + ) + var/mob/dead/observer/candidate = length(candidates) ? pick(candidates) : null + if(candidate || spawn_anyway_if_no_player) + var/mob/living/new_mob = new spawn_type (get_turf(get_spawn_turf())) + if(candidate) + new_mob.ckey = candidate.ckey + post_spawn(new_mob) + +///BACK FOR REVENGE!!! +/datum/shuttle_event/simple_spawner/player_controlled/alien_queen + name = "ALIEN QUEEN! (Kinda dangerous!)" + spawning_list = list(/mob/living/carbon/alien/adult/royal/queen = 1, /obj/vehicle/sealed/mecha/working/ripley = 1) + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE + + event_probability = 0.2 + spawn_probability_per_process = 10 + activation_fraction = 0.5 + + spawn_anyway_if_no_player = FALSE + ghost_alert_string = "Would you like to be an alien queen shot at the shuttle?" + remove_from_list_when_spawned = TRUE + self_destruct_when_empty = TRUE + + role_type = ROLE_ALIEN + +///Spawns three player controlled carp!! Deadchats final chance to wreak havoc, probably really not that dangerous if even one person has a laser gun +/datum/shuttle_event/simple_spawner/player_controlled/carp + name = "Three player controlled carp! (Little dangerous!)" + spawning_list = list(/mob/living/basic/carp = 10, /mob/living/basic/carp/mega = 2, /mob/living/basic/carp/magic = 2, /mob/living/basic/carp/magic/chaos = 1) + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE + + event_probability = 1 + spawn_probability_per_process = 10 + activation_fraction = 0.4 + + spawn_anyway_if_no_player = TRUE + ghost_alert_string = "Would you like to be a space carp to pester the emergency shuttle?" + remove_from_list_when_spawned = TRUE + self_destruct_when_empty = TRUE + + role_type = ROLE_SENTIENCE + + ///how many carp can we spawn max? + var/max_carp_spawns = 3 + +/datum/shuttle_event/simple_spawner/player_controlled/carp/New(obj/docking_port/mobile/port) + . = ..() + + var/list/spawning_list_copy = spawning_list.Copy() + spawning_list.Cut() + for(var/i in 1 to max_carp_spawns) + spawning_list[pick_weight(spawning_list_copy)] += 1 diff --git a/code/modules/shuttle/shuttle_events/turbulence.dm b/code/modules/shuttle/shuttle_events/turbulence.dm new file mode 100644 index 000000000000..bbc136397c2a --- /dev/null +++ b/code/modules/shuttle/shuttle_events/turbulence.dm @@ -0,0 +1,48 @@ +/// Repeat the "buckle in or fall over" event a couple times +/datum/shuttle_event/turbulence + name = "Turbulence" + event_probability = 5 + activation_fraction = 0.1 + /// Minimum time to wait between periods of turbulence + var/minimum_interval = 20 SECONDS + /// Maximum time to wait between periods of turbulence + var/maximum_interval = 50 SECONDS + /// Time until we should shake again + COOLDOWN_DECLARE(turbulence_cooldown) + /// How long do we give people to get buckled? + var/warning_interval = 2 SECONDS + +/datum/shuttle_event/turbulence/activate() + . = ..() + minor_announce("Please note, we are entering an area of subspace turbulence. For your own safety, \ + please fasten your belts and remain seated until the vehicle comes to a complete stop.", + title = "Emergency Shuttle", alert = TRUE) + COOLDOWN_START(src, turbulence_cooldown, rand(5 SECONDS, 20 SECONDS)) // Reduced interval after the announcement + +/datum/shuttle_event/turbulence/event_process() + . = ..() + if (!.) + return + if (!COOLDOWN_FINISHED(src, turbulence_cooldown)) + return + COOLDOWN_START(src, turbulence_cooldown, rand(minimum_interval, maximum_interval)) + shake() + addtimer(CALLBACK(src, PROC_REF(knock_down)), warning_interval, TIMER_DELETE_ME) + +/// Warn players to get buckled +/datum/shuttle_event/turbulence/proc/shake() + var/list/mobs = mobs_in_area_type(list(/area/shuttle/escape)) + for(var/mob/living/mob as anything in mobs) + var/shake_intensity = mob.buckled ? 0.25 : 1 + if(mob.client) + shake_camera(mob, 3 SECONDS, shake_intensity) + +/// Knock them down +/datum/shuttle_event/turbulence/proc/knock_down() + if (SSshuttle.emergency.mode != SHUTTLE_ESCAPE) + return // They docked + var/list/mobs = mobs_in_area_type(list(/area/shuttle/escape)) // Not very efficient but check again in case someone was outdoors + for(var/mob/living/mob as anything in mobs) + if(mob.buckled) + continue + mob.Paralyze(3 SECONDS, ignore_canstun = TRUE) diff --git a/icons/mob/simple/carp.dmi b/icons/mob/simple/carp.dmi index 42baa703400f4397f31ead4bb000d4700238271b..d5824509479931424ad7bff028e0e983a279689d 100644 GIT binary patch literal 36030 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

f&~&_IFb{JwZ~&voUq`LSANr0)w>ePQ6V<#Rl zar^479?l3qETs(rJXT@ICL@z^p#i(!^v*Z6lY^UcZ4r8qmD2>zknTI4y6U{^E^YxF zG3#V6+wk8Hn;!;OV@kbMao=hVMh@je9k#h@J=eKJPCERa%jF2{_f7May|9}MQq#Kt zc0pAsR^67sfV&xhhl28>lDA2(&!I~8T5=YZRX zneE9Rw#&UVsa_biM&QaXzzyHtE18??IX%pSQJ4gECc6Hx$)U|`_YGq%7(?P)y~BWA zEy1nd%R@IWS8l=N8*O}goQtZZLg*90;M|M9#S!CC=N@y8zUtwX*v=+Mv)9|y(5^;E zv)s#zN^AY8lN4C3KUZA)Ro!u&AvWo?K`i}!Ty~ge@*PX?M&P9`RE0UH);o@ns{L$d z2m=sSiXtSCNhN`}Ohz5#XKdpTz$VhzkU(svJay<1WSh7?d}xIBhHtJp89sm~HGGm& zAGLn`x`2Z<*3^y3?`BlJBJ)E{#X;kPdbn`DTFnUv95m*8I@~Jl#;shlQa4Gl@k?ff zlwa1I(|_Dn=*J1ecT-byJwiAWo3=S4YdGsh7312~8hv^n0S9>-πw6(^)#vsbeP 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 Sj?xRt?wi+j)XUXu!~O?-Mmn(o literal 31658 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 qhW>YFOmy^p&ot`;>2d7~1h`1v+Ton%B_(hH