From 68be76e8178f4fa6c513a52a45d6942aca3b349e Mon Sep 17 00:00:00 2001 From: Time-Green <7501474+Time-Green@users.noreply.github.com> Date: Wed, 2 Oct 2024 09:24:18 +0200 Subject: [PATCH] Journeying Hitchhikers Shuttle Events + Bugfixes (#86655) ## About The Pull Request Adds the following new general shuttle events:_ **Hitchhiker** - 1% chance - A single assistant in an EVA suit and some PBJs in a suitcase **Assistant Wave** - 0.1% chance - Spawns 10 assistants with internals - For clarity, they don't get sent to the shuttle, but get launched at it from space. It's a scuffle of 10 assistants trying to get in without being spaced or succumbing to the cold/pressure **Intern Wave** - Admin only - Unarmed and armed version - Spawns centcom interns, with a little announcement to warn they're coming I've also fixed projectiles bugging out and admin forced shuttle events not activating if they were added after the shuttle launched
Admin only events added **Nukie** Spawns a single nukie, armed with a shotgun, pistol and edagger. Basically the deathmatch nukie loadout, you dont want to fight this **Meaty ores** Meaty-ores meteors. Have a 4% chance to hit the shuttle, posing a potential hazard **3 player controlled fire-sharks** 3 fire sharks controlled by players. Not much to talk about here **Fireball Wave** Shoots a wave of fireballs at the shuttle. I think it's cool but apparently shuttle walls and windows deflect fireballs so it's kind of moot unless you're outside :/
## Why It's Good For The Game The assistant and hitchhiker events are some flavoring that I thought up a while ago. The Hitchhiker is just intentionally a flavor addition, but the assistant wave and intern wave can be used by admins to repopulate or retake the emergency shuttle as well. ## Changelog :cl: add: Adds an assistant and hitchiker shuttle event, replenishing the crew mid flight! admin: Adds two intern wave shuttle events code: You can now supply shuttle events with outfits! code: You can now shoot projectiles with the shuttle events! fix: Fixes projectiles bugging out when fired in shuttle transit space fix: Fixes admin forced shuttle events not activating when added mid transit /:cl: --- code/controllers/subsystem/explosions.dm | 2 +- code/datums/shuttles/emergency.dm | 4 +- code/game/objects/items/storage/briefcase.dm | 9 ++ .../admin/verbs/change_shuttle_events.dm | 2 +- .../antagonists/changeling/changeling.dm | 1 + .../antagonists/heretic/heretic_antag.dm | 1 + .../antagonists/nukeop/datums/operative.dm | 1 + code/modules/antagonists/wizard/wizard.dm | 1 + .../mob/living/basic/heretic/fire_shark.dm | 1 + .../mob/living/carbon/human/_species.dm | 2 +- code/modules/projectiles/projectile.dm | 2 + .../projectiles/projectile/energy/_energy.dm | 6 - code/modules/shuttle/emergency.dm | 11 +- code/modules/shuttle/shuttle.dm | 7 + .../shuttle/shuttle_events/_shuttle_events.dm | 6 +- code/modules/shuttle/shuttle_events/carp.dm | 44 +++++-- code/modules/shuttle/shuttle_events/humans.dm | 122 ++++++++++++++++++ .../modules/shuttle/shuttle_events/meteors.dm | 12 ++ code/modules/shuttle/shuttle_events/misc.dm | 5 +- .../shuttle_events/player_controlled.dm | 14 +- .../shuttle/shuttle_events/projectile.dm | 23 ++++ tgstation.dme | 2 + 22 files changed, 241 insertions(+), 37 deletions(-) create mode 100644 code/modules/shuttle/shuttle_events/humans.dm create mode 100644 code/modules/shuttle/shuttle_events/projectile.dm diff --git a/code/controllers/subsystem/explosions.dm b/code/controllers/subsystem/explosions.dm index 2f678291eb6..20194e66626 100644 --- a/code/controllers/subsystem/explosions.dm +++ b/code/controllers/subsystem/explosions.dm @@ -352,7 +352,7 @@ ADMIN_VERB(check_bomb_impacts, R_DEBUG, "Check Bomb Impact", "See what the effec who_did_it = "\[Projectile firer: [ADMIN_LOOKUPFLW(fired_projectile.firer)]\]" who_did_it_game_log = "\[Projectile firer: [key_name(fired_projectile.firer)]\]" else - who_did_it = "\[Projectile firer: [ADMIN_LOOKUPFLW(fired_projectile.firer.fingerprintslast)]\]" + who_did_it = "\[Projectile firer: [ADMIN_LOOKUPFLW(fired_projectile.firer?.fingerprintslast)]\]" who_did_it_game_log = "\[Projectile firer: [key_name(fired_projectile.firer.fingerprintslast)]\]" // Otherwise if the explosion cause is an atom, try get the fingerprints. else if(istype(explosion_cause)) diff --git a/code/datums/shuttles/emergency.dm b/code/datums/shuttles/emergency.dm index 2af1a238a72..3662727fa5c 100644 --- a/code/datums/shuttles/emergency.dm +++ b/code/datums/shuttles/emergency.dm @@ -31,13 +31,13 @@ mobile.event_list.Cut() if(use_all_events) for(var/path in events) - mobile.event_list.Add(new path(mobile)) + mobile.add_shuttle_event(path) events -= path else for(var/i in 1 to event_amount) var/path = pick_weight(events) events -= path - mobile.event_list.Add(new path(mobile)) + mobile.add_shuttle_event(path) /datum/map_template/shuttle/emergency/backup suffix = "backup" diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm index bd474808446..a0b6e892e05 100644 --- a/code/game/objects/items/storage/briefcase.dm +++ b/code/game/objects/items/storage/briefcase.dm @@ -110,3 +110,12 @@ new /obj/item/clothing/mask/balaclava(src) new /obj/item/bodybag(src) new /obj/item/soap/nanotrasen(src) + +/obj/item/storage/briefcase/hitchiker/PopulateContents() + new /obj/item/food/sandwich/peanut_butter_jelly(src) + new /obj/item/food/sandwich/peanut_butter_jelly(src) + new /obj/item/reagent_containers/cup/glass/waterbottle/large(src) + new /obj/item/soap(src) + new /obj/item/pillow/random(src) + new /obj/item/tank/internals/emergency_oxygen(src) + new /obj/item/tank/internals/emergency_oxygen(src) diff --git a/code/modules/admin/verbs/change_shuttle_events.dm b/code/modules/admin/verbs/change_shuttle_events.dm index 90f7e03672e..258370df3b7 100644 --- a/code/modules/admin/verbs/change_shuttle_events.dm +++ b/code/modules/admin/verbs/change_shuttle_events.dm @@ -27,5 +27,5 @@ ADMIN_VERB(change_shuttle_events, R_ADMIN|R_FUN, "Change Shuttle Events", "Chang port.event_list.Remove(active[options[result]]) message_admins("[key_name_admin(user)] has removed '[active[result]]' from [port].") else - port.event_list.Add(new typepath (port)) message_admins("[key_name_admin(user)] has added '[typepath]' to [port].") + port.add_shuttle_event(typepath) diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index d34f6b88389..a7cecf1f134 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -15,6 +15,7 @@ default_custom_objective = "Consume the station's most valuable genomes." hardcore_random_bonus = TRUE stinger_sound = 'sound/music/antag/ling_alert.ogg' + /// Whether to give this changeling objectives or not var/give_objectives = TRUE /// Weather we assign objectives which compete with other lings diff --git a/code/modules/antagonists/heretic/heretic_antag.dm b/code/modules/antagonists/heretic/heretic_antag.dm index 4c9c25945c9..d6e21bed03b 100644 --- a/code/modules/antagonists/heretic/heretic_antag.dm +++ b/code/modules/antagonists/heretic/heretic_antag.dm @@ -27,6 +27,7 @@ default_custom_objective = "Turn a department into a testament for your dark knowledge." hardcore_random_bonus = TRUE stinger_sound = 'sound/music/antag/heretic/heretic_gain.ogg' + /// Whether we give this antagonist objectives on gain. var/give_objectives = TRUE /// Whether we've ascended! (Completed one of the final rituals) diff --git a/code/modules/antagonists/nukeop/datums/operative.dm b/code/modules/antagonists/nukeop/datums/operative.dm index 8d28bc2a317..ebaaf8692b2 100644 --- a/code/modules/antagonists/nukeop/datums/operative.dm +++ b/code/modules/antagonists/nukeop/datums/operative.dm @@ -9,6 +9,7 @@ hijack_speed = 2 //If you can't take out the station, take the shuttle instead. suicide_cry = "FOR THE SYNDICATE!!" stinger_sound = 'sound/music/antag/ops.ogg' + /// Which nukie team are we on? var/datum/team/nuclear/nuke_team /// If not assigned a team by default ops will try to join existing ones, set this to TRUE to always create new team. diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index 67b9a971bad..d0c99f03bbf 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -15,6 +15,7 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) can_assign_self_objectives = TRUE default_custom_objective = "Demonstrate your incredible and destructive magical powers." hardcore_random_bonus = TRUE + var/give_objectives = TRUE var/strip = TRUE //strip before equipping var/allow_rename = TRUE diff --git a/code/modules/mob/living/basic/heretic/fire_shark.dm b/code/modules/mob/living/basic/heretic/fire_shark.dm index e65fefc235e..1ac4ccb7b23 100644 --- a/code/modules/mob/living/basic/heretic/fire_shark.dm +++ b/code/modules/mob/living/basic/heretic/fire_shark.dm @@ -30,4 +30,5 @@ AddComponent(/datum/component/swarming) AddComponent(/datum/component/regenerator, outline_colour = COLOR_DARK_RED) ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_FREE_HYPERSPACE_MOVEMENT, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index f75e2acf432..4ed67e46bb2 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -1110,7 +1110,7 @@ GLOBAL_LIST_EMPTY(features_by_species) humi.adjust_coretemperature(skin_core_change) // get the enviroment details of where the mob is standing - var/datum/gas_mixture/environment = humi.loc.return_air() + var/datum/gas_mixture/environment = humi.loc?.return_air() if(!environment) // if there is no environment (nullspace) drop out here. return diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index ffccee38680..fa85d41e777 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -224,6 +224,8 @@ AddElement(/datum/element/embed) AddElement(/datum/element/connect_loc, projectile_connections) + add_traits(list(TRAIT_FREE_HYPERSPACE_MOVEMENT, TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT), INNATE_TRAIT) + /obj/projectile/proc/Range() range-- if(wound_bonus != CANT_WOUND) diff --git a/code/modules/projectiles/projectile/energy/_energy.dm b/code/modules/projectiles/projectile/energy/_energy.dm index 86ec80b3b20..8527041e860 100644 --- a/code/modules/projectiles/projectile/energy/_energy.dm +++ b/code/modules/projectiles/projectile/energy/_energy.dm @@ -6,9 +6,3 @@ 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_SOFTCORDON_MOVEMENT, INNATE_TRAIT) diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 8987af97817..35a5222c095 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -539,6 +539,11 @@ areas += E hyperspace_sound(HYPERSPACE_LAUNCH, areas) enterTransit() + + //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) + mode = SHUTTLE_ESCAPE launch_status = ENDGAME_LAUNCHED setTimer(SSshuttle.emergency_escape_time * engine_coeff) @@ -554,10 +559,6 @@ if(!is_reserved_level(z)) CRASH("Emergency shuttle did not move to transit z-level!") - //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) - if(SHUTTLE_STRANDED, SHUTTLE_DISABLED) SSshuttle.checkHostileEnvironment() @@ -624,7 +625,7 @@ 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)) + add_shuttle_event(event) names += initial(event.name) if(LAZYLEN(names)) log_game("[capitalize(name)] has selected the following shuttle events: [english_list(names)].") diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index b5b0965ead9..907d76c575a 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -1204,6 +1204,13 @@ for(var/item in removees) event_list.Remove(item) +/// Give a typepath of a shuttle event to add to the shuttle. If added during endgame transit, will insta start the event +/obj/docking_port/mobile/proc/add_shuttle_event(typepath) + var/datum/shuttle_event/event = new typepath (src) + event_list.Add(event) + if(launch_status == ENDGAME_LAUNCHED) + event.start_up_event(0) + #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 index f809e274dc6..3c6425018aa 100644 --- a/code/modules/shuttle/shuttle_events/_shuttle_events.dm +++ b/code/modules/shuttle/shuttle_events/_shuttle_events.dm @@ -21,7 +21,11 @@ src.port = port /datum/shuttle_event/proc/start_up_event(evacuation_duration) - activate_at = world.time + evacuation_duration * activation_fraction + if(port.launch_status == ENDGAME_LAUNCHED) + active = TRUE //if added during endgame, instant activate + activate() + else + activate_at = world.time + evacuation_duration * activation_fraction ///We got activated /datum/shuttle_event/proc/activate() diff --git a/code/modules/shuttle/shuttle_events/carp.dm b/code/modules/shuttle/shuttle_events/carp.dm index 18529f1c028..c54f3e44716 100644 --- a/code/modules/shuttle/shuttle_events/carp.dm +++ b/code/modules/shuttle/shuttle_events/carp.dm @@ -16,19 +16,6 @@ //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!)" @@ -60,3 +47,34 @@ spawn_probability_per_process = 100 remove_from_list_when_spawned = FALSE + +///CARPTIDE! CARPTIDE! CARPTIDE! Magical carp will attack the shuttle! +/datum/shuttle_event/simple_spawner/carp/magic + name = "Magical Carp Nest! (Very Dangerous!)" + spawning_list = list(/mob/living/basic/carp/magic = 12, /mob/living/basic/carp/magic/chaos = 3) + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE | SHUTTLE_EVENT_MISS_SHUTTLE + + event_probability = 0 + activation_fraction = 0.2 + spawn_probability_per_process = 20 + + remove_from_list_when_spawned = TRUE + self_destruct_when_empty = TRUE + +/// Spawns some player controlled fire sharks +/datum/shuttle_event/simple_spawner/player_controlled/fire_shark + name = "Three player controlled fire sharks! (Dangerous!)" + spawning_list = list(/mob/living/basic/heretic_summon/fire_shark = 3) + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE + + event_probability = 0 + activation_fraction = 0.2 + spawn_probability_per_process = 100 + spawns_per_spawn = 3 + + spawn_anyway_if_no_player = FALSE + ghost_alert_string = "Would you like to be a fire shark attacking the shuttle?" + remove_from_list_when_spawned = TRUE + self_destruct_when_empty = TRUE + + role_type = ROLE_SENTIENCE diff --git a/code/modules/shuttle/shuttle_events/humans.dm b/code/modules/shuttle/shuttle_events/humans.dm new file mode 100644 index 00000000000..99f4006d5bb --- /dev/null +++ b/code/modules/shuttle/shuttle_events/humans.dm @@ -0,0 +1,122 @@ +/// Human spawning events, with the ability to give them outfits! +/datum/shuttle_event/simple_spawner/player_controlled/human + /// Outfits equipped to human mobs we send to the shuttle + var/datum/outfit/outfit = /datum/outfit/job/assistant + +/datum/shuttle_event/simple_spawner/player_controlled/human/post_spawn(atom/movable/spawnee) + ..() + + if(ishuman(spawnee)) + prepare_human(spawnee) + +/datum/shuttle_event/simple_spawner/player_controlled/human/proc/prepare_human(mob/living/carbon/human/human) + human.equipOutfit(new outfit ()) + +/datum/shuttle_event/simple_spawner/player_controlled/human/greytide + name = "Greytide! (10 assistants)" + spawning_list = list(/mob/living/carbon/human = 10) + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE + outfit = /datum/outfit/job/assistant/breath_mask + + event_probability = 0.1 + spawn_probability_per_process = 5 + activation_fraction = 0.05 + spawns_per_spawn = 10 + + spawn_anyway_if_no_player = TRUE + ghost_alert_string = "Would you like to be an assistant shot at the shuttle?" + remove_from_list_when_spawned = TRUE + self_destruct_when_empty = TRUE + + role_type = ROLE_HERMIT + +/datum/outfit/job/assistant/breath_mask + name = "Assistant - Breathmask" + mask = /obj/item/clothing/mask/breath + l_pocket = /obj/item/tank/internals/emergency_oxygen + internals_slot = ITEM_SLOT_LPOCKET + +/datum/shuttle_event/simple_spawner/player_controlled/human/greytide/interns + name = "Intern Wave (Unarmed, 10 interns)" + event_probability = 0 + outfit = /datum/outfit/centcom/centcom_intern/unarmed + + spawn_anyway_if_no_player = FALSE + ghost_alert_string = "Would you like to be a centcom intern shot at the shuttle?" + +/datum/shuttle_event/simple_spawner/player_controlled/human/greytide/interns/activate() + ..() + + minor_announce("We're sending you our bravest interns, please let them in when they arrive.", + title = "Emergency Shuttle", alert = TRUE) + +/datum/shuttle_event/simple_spawner/player_controlled/human/greytide/interns/armed + name = "Intern Wave (Armed, 10 interns)" + event_probability = 0 + outfit = /datum/outfit/centcom/centcom_intern + + spawn_anyway_if_no_player = FALSE + ghost_alert_string = "Would you like to be a centcom intern shot at the shuttle?" + +/datum/shuttle_event/simple_spawner/player_controlled/human/hitchhiker + name = "Hitchhiker! (Harmless, single ghost spawn)" + spawning_list = list(/mob/living/carbon/human = 1) + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE + outfit = /datum/outfit/job/assistant/hitchhiker + + event_probability = 1 + spawn_probability_per_process = 5 + activation_fraction = 0.2 + + spawn_anyway_if_no_player = TRUE + ghost_alert_string = "Would you like to be an assistant shot at the shuttle?" + remove_from_list_when_spawned = TRUE + self_destruct_when_empty = TRUE + + role_type = ROLE_HERMIT + +/datum/outfit/job/assistant/hitchhiker + name = "Assistant - Hitchhiker" + mask = /obj/item/clothing/mask/breath + suit = /obj/item/clothing/suit/space/eva + head = /obj/item/clothing/head/helmet/space/eva + l_pocket = /obj/item/tank/internals/emergency_oxygen + r_hand = /obj/item/storage/briefcase/hitchiker + internals_slot = ITEM_SLOT_LPOCKET + +/datum/shuttle_event/simple_spawner/player_controlled/human/nukie + name = "Nuclear Operative (Dangerous as heck)!" + spawning_list = list(/mob/living/carbon/human = 1) + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE + outfit = /datum/outfit/deathmatch_loadout/nukie + + event_probability = 0 + spawn_probability_per_process = 100 + + spawn_anyway_if_no_player = FALSE + ghost_alert_string = "Would you like to be a nuclear operative to assault the shuttle?" + remove_from_list_when_spawned = TRUE + self_destruct_when_empty = TRUE + + role_type = ROLE_NUCLEAR_OPERATIVE + +/datum/outfit/shuttle_nukie + name = "Shuttle Nuclear Operative" + + uniform = /obj/item/clothing/under/syndicate/tacticool + back = /obj/item/mod/control/pre_equipped/nuclear + r_hand = /obj/item/gun/ballistic/shotgun/bulldog/unrestricted + belt = /obj/item/gun/ballistic/automatic/pistol/clandestine + r_pocket = /obj/item/reagent_containers/hypospray/medipen/stimulants + l_pocket = /obj/item/grenade/syndieminibomb + implants = list(/obj/item/implant/explosive) + suit_store = /obj/item/tank/internals/emergency_oxygen + + internals_slot = ITEM_SLOT_SUITSTORE + + backpack_contents = list( + /obj/item/ammo_box/c10mm, + /obj/item/ammo_box/magazine/m12g = 2, + /obj/item/pen/edagger, + /obj/item/reagent_containers/hypospray/medipen/atropine, + ) diff --git a/code/modules/shuttle/shuttle_events/meteors.dm b/code/modules/shuttle/shuttle_events/meteors.dm index ef0b6002e57..ad3814186ac 100644 --- a/code/modules/shuttle/shuttle_events/meteors.dm +++ b/code/modules/shuttle/shuttle_events/meteors.dm @@ -40,3 +40,15 @@ 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) + +/datum/shuttle_event/simple_spawner/meteor/dust/meaty + name = "Meaty Meteors! (Mostly Safe)" + spawning_list = list(/obj/effect/meteor/meaty = 1) + spawning_flags = SHUTTLE_EVENT_MISS_SHUTTLE | SHUTTLE_EVENT_HIT_SHUTTLE + + event_probability = 0.1 + activation_fraction = 0.1 + spawn_probability_per_process = 100 + spawns_per_spawn = 3 + + hit_the_shuttle_chance = 2 diff --git a/code/modules/shuttle/shuttle_events/misc.dm b/code/modules/shuttle/shuttle_events/misc.dm index f65eddadf7c..4891d5af799 100644 --- a/code/modules/shuttle/shuttle_events/misc.dm +++ b/code/modules/shuttle/shuttle_events/misc.dm @@ -41,7 +41,7 @@ ///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!)" + name = "Black Hole (Oh no! Just one though!)" event_probability = 0 // only admin spawnable spawn_probability_per_process = 10 activation_fraction = 0.35 @@ -53,9 +53,10 @@ ///Kobayashi Maru version /datum/shuttle_event/simple_spawner/black_hole/adminbus - name = "Black Holes (OH GOD!)" + name = "Black Holes (OH GOD! Will literally kill everyone!)" 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 index 86d134f29f7..6954a5eaa78 100644 --- a/code/modules/shuttle/shuttle_events/player_controlled.dm +++ b/code/modules/shuttle/shuttle_events/player_controlled.dm @@ -17,12 +17,16 @@ /// 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/mob/chosen_one = 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, alert_pic = spawn_type, role_name_text = "shot at shuttle", amount_to_pick = 1) - if(isnull(chosen_one) && !spawn_anyway_if_no_player) - return - var/mob/living/new_mob = new spawn_type (get_turf(get_spawn_turf())) - new_mob.ckey = chosen_one.ckey + var/mob/living/new_mob = new spawn_type (null) + ADD_TRAIT(new_mob, TRAIT_STASIS, type) post_spawn(new_mob) + var/mob/chosen_one = 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, alert_pic = new_mob, role_name_text = "shot at shuttle", amount_to_pick = 1) + if(isnull(chosen_one) && !spawn_anyway_if_no_player || !isdead(chosen_one)) //we can get sniped if there's multiple spawns, so check if dead + qdel(new_mob) + return + new_mob.forceMove(get_turf(get_spawn_turf())) + REMOVE_TRAIT(new_mob, TRAIT_STASIS, type) + new_mob.ckey = chosen_one?.ckey ///BACK FOR REVENGE!!! /datum/shuttle_event/simple_spawner/player_controlled/alien_queen diff --git a/code/modules/shuttle/shuttle_events/projectile.dm b/code/modules/shuttle/shuttle_events/projectile.dm new file mode 100644 index 00000000000..940dddb61a7 --- /dev/null +++ b/code/modules/shuttle/shuttle_events/projectile.dm @@ -0,0 +1,23 @@ +/// Spawn projectiles towards the shuttle +/datum/shuttle_event/simple_spawner/projectile + /// Spread of the fired projectiles, to add some flair to it + var/angle_spread = 0 + +/datum/shuttle_event/simple_spawner/projectile/post_spawn(atom/movable/spawnee) + . = ..() + + if(isprojectile(spawnee)) + var/obj/projectile/pew = spawnee + var/angle = dir2angle(REVERSE_DIR(port.preferred_direction)) + rand(-angle_spread, angle_spread) + pew.fire(angle) + +/datum/shuttle_event/simple_spawner/projectile/fireball //bap bap bapaba bap + name = "Fireball Burst (Surprisingly safe!)" + activation_fraction = 0.5 // this doesn't matter for hijack events but just in case its forced + + spawning_list = list(/obj/projectile/magic/fireball = 1) + angle_spread = 10 + spawns_per_spawn = 10 + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE | SHUTTLE_EVENT_HIT_SHUTTLE + spawn_probability_per_process = 2 + self_destruct_when_empty = TRUE diff --git a/tgstation.dme b/tgstation.dme index 54ed095912e..6474322dcb2 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5890,9 +5890,11 @@ #include "code\modules\shuttle\white_ship.dm" #include "code\modules\shuttle\shuttle_events\_shuttle_events.dm" #include "code\modules\shuttle\shuttle_events\carp.dm" +#include "code\modules\shuttle\shuttle_events\humans.dm" #include "code\modules\shuttle\shuttle_events\meteors.dm" #include "code\modules\shuttle\shuttle_events\misc.dm" #include "code\modules\shuttle\shuttle_events\player_controlled.dm" +#include "code\modules\shuttle\shuttle_events\projectile.dm" #include "code\modules\shuttle\shuttle_events\turbulence.dm" #include "code\modules\spatial_grid\cell_tracker.dm" #include "code\modules\spells\spell.dm"