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"