From 8b7bdc4959f1ad248bdad1f7908c12c840053696 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Sun, 18 Jun 2023 15:02:04 +0200 Subject: [PATCH] [MIRROR] Shuttle events [MDB IGNORE] (#21917) Shuttle events Co-authored-by: Time-Green Co-authored-by: ghost sheep --- code/__DEFINES/shuttles.dm | 10 ++ code/__DEFINES/traits.dm | 4 + code/controllers/subsystem/shuttle.dm | 4 +- code/datums/components/shuttle_cling.dm | 17 ++- .../greyscale_configs/greyscale_mobs.dm | 5 + .../greyscale/json_configs/carp_friend.json | 23 +++ code/game/atoms.dm | 2 +- .../objects/items/devices/transfer_valve.dm | 8 + code/game/objects/structures/lattice.dm | 1 - 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 | 9 +- .../mob/living/basic/space_fauna/carp/carp.dm | 35 ++++- .../space_fauna/carp/carp_controllers.dm | 23 +++ .../projectiles/projectile/energy/_energy.dm | 6 + code/modules/shuttle/emergency.dm | 22 +++ code/modules/shuttle/shuttle.dm | 18 ++- .../shuttle/shuttle_events/_shuttle_events.dm | 138 ++++++++++++++++++ code/modules/shuttle/shuttle_events/carp.dm | 60 ++++++++ .../modules/shuttle/shuttle_events/meteors.dm | 42 ++++++ code/modules/shuttle/shuttle_events/misc.dm | 39 +++++ .../shuttle_events/player_controlled.dm | 68 +++++++++ icons/mob/simple/carp.dmi | Bin 30943 -> 35748 bytes tgstation.dme | 6 + 26 files changed, 598 insertions(+), 14 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 diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm index 5380268e979..c67d9e1a832 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 8ca1e485263..3e4007e1178 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -357,6 +357,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_HYPERSPACED "hyperspaced" ///Gives the movable free hyperspace movement without being pulled during shuttle transit #define TRAIT_FREE_HYPERSPACE_MOVEMENT "free_hyperspace_movement" +///Lets the movable move freely in the soft-cordon area of transit space, which would otherwise teleport them away just before they got to see the true cordon +#define TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT "free_hyperspace_softcordon_movement" +///Deletes the object upon being dumped into space, usually from exiting hyperspace. Useful if you're spawning in a lot of stuff for hyperspace events that dont need to flood the entire game +#define TRAIT_DEL_ON_SPACE_DUMP "del_on_hyperspace_leave" /// Gets double arcade prizes #define TRAIT_GAMERGOD "gamer-god" #define TRAIT_GIANT "giant" diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index d38b32571c6..1ae6965ddfd 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -202,8 +202,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 c3244f9538b..70216bf9f80 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_OUTSIDE_CONTROL) + 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)) @@ -80,7 +93,7 @@ ///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)) 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 0218991f0c2..d247117f3a1 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 00000000000..a5b3ffdf7a4 --- /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/atoms.dm b/code/game/atoms.dm index 32164125c15..42f1b1db80c 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -245,7 +245,7 @@ flags_1 |= INITIALIZED_1 if(loc) - SEND_SIGNAL(loc, COMSIG_ATOM_INITIALIZED_ON, src) /// Sends a signal that the new atom `src`, has been created at `loc` + SEND_SIGNAL(loc, COMSIG_ATOM_INITIALIZED_ON, src, mapload) /// Sends a signal that the new atom `src`, has been created at `loc` SET_PLANE_IMPLICIT(src, plane) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 7dee7378e6f..feeedc5a823 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 82fba11d0e2..3bceaa827f0 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -17,7 +17,6 @@ var/number_of_mats = 1 var/build_material = /obj/item/stack/rods - /datum/armor/structure_lattice melee = 50 fire = 80 diff --git a/code/game/turfs/open/space/transit.dm b/code/game/turfs/open/space/transit.dm index b4c713de751..f754438c2f6 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_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_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)) + 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 && !istype(enterer, /obj/docking_port)) + 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 fcd1d0cb716..9662f38c498 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -50,6 +50,7 @@ GLOBAL_PROTECT(admin_verbs_admin) /datum/admins/proc/trophy_manager, /datum/admins/proc/view_all_circuits, /datum/verbs/menu/Admin/verb/playerpanel, /* It isn't /datum/admin but it fits no less */ + /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 00000000000..a24aa456f23 --- /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 0c6685b1aae..4184f315e21 100644 --- a/code/modules/awaymissions/cordon.dm +++ b/code/modules/awaymissions/cordon.dm @@ -42,6 +42,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 fff31893d0e..7a69c54193d 100644 --- a/code/modules/mapping/space_management/space_reservation.dm +++ b/code/modules/mapping/space_management/space_reservation.dm @@ -94,7 +94,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) ..() @@ -106,6 +106,13 @@ dump_in_space(enterer) +///Only dump if we don't have the hyperspace cordon movement exemption trait +/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) + /datum/turf_reservation/proc/Reserve(width, height, zlevel) src.width = width src.height = height 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 ddeccd93103..93174f7970a 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp.dm @@ -99,9 +99,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) @@ -163,6 +164,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 */ @@ -261,3 +272,25 @@ obj_damage = 15 #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/mob/living/basic/space_fauna/carp/carp_controllers.dm b/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm index 75c915c16a1..f4c446d088b 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm @@ -71,3 +71,26 @@ /datum/ai_planning_subtree/basic_melee_attack_subtree/magicarp, /datum/ai_planning_subtree/carp_migration, ) + +/** + * Carp which bites back, but doesn't look for targets and doesnt do as much damage + * Still migrate and stuff + */ +/datum/ai_controller/basic_controller/carp/passive + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction(), + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends() + ) + ai_traits = STOP_MOVING_WHEN_PULLED + planning_subtrees = list( + /datum/ai_planning_subtree/pet_planning, + /datum/ai_planning_subtree/simple_find_nearest_target_to_flee, + /datum/ai_planning_subtree/make_carp_rift/panic_teleport, + /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/find_food, + /datum/ai_planning_subtree/attack_obstacle_in_path/carp, + /datum/ai_planning_subtree/shortcut_to_target_through_carp_rift, + /datum/ai_planning_subtree/make_carp_rift/aggressive_teleport, + /datum/ai_planning_subtree/basic_melee_attack_subtree/carp, + /datum/ai_planning_subtree/carp_migration, + ) diff --git a/code/modules/projectiles/projectile/energy/_energy.dm b/code/modules/projectiles/projectile/energy/_energy.dm index 8527041e860..6b715fdb74f 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 ac28d380518..b787ed4215a 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -311,6 +311,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 @@ -462,6 +467,7 @@ send2adminchat("Server", "The Emergency Shuttle has docked with the station.") priority_announce("[SSshuttle.emergency] has docked with the station. You have [timeLeft(600)] minutes to board the Emergency Shuttle.", null, ANNOUNCER_SHUTTLEDOCK, "Priority") ShuttleDBStuff() + addtimer(CALLBACK(src, PROC_REF(announce_shuttle_events)), 20 SECONDS) if(SHUTTLE_DOCKED) @@ -515,6 +521,10 @@ priority_announce("The Emergency Shuttle has left the station. Estimate [timeLeft(600)] minutes until the shuttle docks at Central Command.", null, ANNOUNCER_SHUTTLELEFT, "Priority") INVOKE_ASYNC(SSticker, TYPE_PROC_REF(/datum/controller/subsystem/ticker, poll_hearts)) bolt_all_doors() //SKYRAT EDIT ADDITION + //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) @@ -542,6 +552,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) @@ -573,6 +585,16 @@ setTimer(SSshuttle.emergency_escape_time) priority_announce("The Emergency Shuttle is preparing for direct jump. Estimate [timeLeft(600)] minutes until the shuttle docks at Central Command.", null, null, "Priority") +///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 a0ed6160c45..da26466c807 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -476,6 +476,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() var/admin_forced = FALSE //SKYRAT EDIT ADDITION @@ -842,6 +844,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() @@ -1152,13 +1155,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 @@ -1177,6 +1184,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 00000000000..d73fba2282b --- /dev/null +++ b/code/modules/shuttle/shuttle_events/_shuttle_events.dm @@ -0,0 +1,138 @@ +///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 FALSE + + if(!LAZYLEN(spawning_list) && self_destruct_when_empty) + return SHUTTLE_EVENT_CLEAR + + 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 00000000000..ac040bd66e6 --- /dev/null +++ b/code/modules/shuttle/shuttle_events/carp.dm @@ -0,0 +1,60 @@ +///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 + +/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 + +///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 00000000000..d1ded58cbad --- /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 00000000000..c0644f6e491 --- /dev/null +++ b/code/modules/shuttle/shuttle_events/misc.dm @@ -0,0 +1,39 @@ +///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 + +///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 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 00000000000..24513da5b98 --- /dev/null +++ b/code/modules/shuttle/shuttle_events/player_controlled.dm @@ -0,0 +1,68 @@ +///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 + ..() + +/datum/shuttle_event/simple_spawner/player_controlled/proc/try_grant_ghost_control(spawn_type) + var/list/candidates = poll_ghost_candidates(ghost_alert_string + " (Warning: you will not be able to return to your body!)", role_type, FALSE, 10 SECONDS) + var/mob/dead/observer/candidate = pick(candidates) + 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 + + 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 + + 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.Add(pick_weight(spawning_list_copy)) diff --git a/icons/mob/simple/carp.dmi b/icons/mob/simple/carp.dmi index 02aadf91498f756eea5ccef68f380ad9b4eabafa..54b9cb7bee4bfaceceb4deacb7affe73e56a34cb 100644 GIT binary patch literal 35748 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