From ca2f68bf145ba85cde4794079e2cd2bc4a6ecad4 Mon Sep 17 00:00:00 2001 From: Mechoid Date: Sun, 5 Mar 2023 05:27:29 -0800 Subject: [PATCH] Adds Planetary Meteors (Again) (For Real) Planetary meteor showers can occur. Hull shield generators made Smarter for planetary use. --- code/__defines/flags.dm | 1 + code/game/gamemodes/meteor/meteors.dm | 4 +- code/game/objects/structures/flora/trees.dm | 4 ++ code/modules/events/meteors.dm | 2 +- .../engineering/planet_meteor_defense.dm | 55 +++++++++++++++++++ code/modules/shieldgen/shield_gen_external.dm | 23 ++++++-- polaris.dme | 1 + 7 files changed, 82 insertions(+), 8 deletions(-) create mode 100644 code/modules/gamemaster/event2/events/engineering/planet_meteor_defense.dm diff --git a/code/__defines/flags.dm b/code/__defines/flags.dm index cc5092b31e..0bad588e67 100644 --- a/code/__defines/flags.dm +++ b/code/__defines/flags.dm @@ -67,6 +67,7 @@ #define PASSGRILLE (1<<2) #define PASSBLOB (1<<3) #define PASSMOB (1<<4) +#define PASSTREE (1<<5) /* -- /obj/effect/shuttle_landmark/var/landmark_flags -- */ diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index a4fb4192c9..94f4205042 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -59,7 +59,7 @@ var/global/list/meteors_catastrophic = list( var/obj/effect/meteor/M = new Me(pickedstart) if(M.planetary && !pickedgoal.outdoors) - var/list/Targ = check_trajectory(pickedgoal, pickedstart, PASSTABLE) + var/list/Targ = check_trajectory(pickedgoal, pickedstart, PASSTABLE|PASSTREE) if(LAZYLEN(Targ)) var/turf/TargetTurf = get_step(get_turf(Targ[1]), get_dir(pickedgoal, pickedstart)) if(get_dist(pickedstart, Targ[1]) < get_dist(pickedstart, pickedgoal)) @@ -239,7 +239,7 @@ var/global/list/meteors_catastrophic = list( Move(EndTurf, delay) if(get_turf(src) == StartTurf) // If it doesn't move, IE, is blocked by something, take a hit. get_hit() - + if(allow_recursion) if(!QDELETED(src)) addtimer(CALLBACK(src, .proc/move_toward, target, delay, allow_recursion), delay) diff --git a/code/game/objects/structures/flora/trees.dm b/code/game/objects/structures/flora/trees.dm index 5d4310c13b..144d81283c 100644 --- a/code/game/objects/structures/flora/trees.dm +++ b/code/game/objects/structures/flora/trees.dm @@ -17,6 +17,10 @@ /obj/structure/flora/tree/CanPass(var/atom/movable/mover, var/turf/target) . = ..() + + if(mover.checkpass(PASSTREE)) + return TRUE + if(ismecha(mover)) var/obj/mecha/Me = mover if(Me.flying) diff --git a/code/modules/events/meteors.dm b/code/modules/events/meteors.dm index c8e2dca06a..4e1dd43476 100644 --- a/code/modules/events/meteors.dm +++ b/code/modules/events/meteors.dm @@ -127,7 +127,7 @@ var/global/list/meteors_major = list( . = round(. * 0.5) if(speed > SHIP_SPEED_FAST) //Sanic stahp . *= 2 - + //Smol ship evasion if(victim.vessel_size < SHIP_SIZE_LARGE && speed < SHIP_SPEED_FAST) var/skill_needed = SKILL_PROF diff --git a/code/modules/gamemaster/event2/events/engineering/planet_meteor_defense.dm b/code/modules/gamemaster/event2/events/engineering/planet_meteor_defense.dm new file mode 100644 index 0000000000..ceda0d82c4 --- /dev/null +++ b/code/modules/gamemaster/event2/events/engineering/planet_meteor_defense.dm @@ -0,0 +1,55 @@ +// This event gives the station an advance warning about meteors, so that they can prepare in various ways. + +/datum/event2/meta/meteor_defense/planetary + name = "meteor defense, planetary" + event_class = "meteor defense" + event_type = /datum/event2/event/meteor_defense/planetary + regions = list(EVENT_REGION_PLANETSURFACE) + +/datum/event2/event/meteor_defense/planetary/set_up() + direction = pick(cardinal) + waves = rand(3, 6) + switch(direction) + if(NORTH) + dir_text = "south" + if(SOUTH) + dir_text = "north" + if(EAST) + dir_text = "west" + if(WEST) + dir_text = "east" + set_meteor_types() + +/datum/event2/event/meteor_defense/planetary/proc/get_personnel() + // Engineers count as 20. + var/engineers = metric.count_people_in_department(DEPARTMENT_ENGINEERING) + if(engineers < 3) // There -must- be at least three engineers for this to be possible. + return 0 + + . = engineers * 20 + + // Cargo and AI/borgs count as 10. + var/cargo = metric.count_people_with_job(/datum/job/cargo_tech) + metric.count_people_with_job(/datum/job/qm) + var/bots = metric.count_people_in_department(DEPARTMENT_SYNTHETIC) + + . += (cargo + bots) * 10 + +/datum/event2/event/meteor_defense/planetary/set_meteor_types() + var/defense_value = get_personnel() + if(defense_value >= 120) + meteor_types = meteors_catastrophic.Copy() + else if(defense_value >= 80) + meteor_types = meteors_threatening.Copy() + else + meteor_types = meteors_normal.Copy() + +/datum/event2/event/meteor_defense/planetary/event_tick() + if(world.time > last_wave_time + wave_delay) + last_wave_time = world.time + waves-- + message_admins("[waves] more wave\s of meteors remain.") + // Dir is reversed because the direction describes where meteors are going, not what side it's gonna hit. + spawn_meteors(rand(wave_upper_bound, wave_lower_bound), meteor_types, reverse_dir[direction], pick(2, 3)) + +/datum/event2/event/meteor_defense/planetary/end() + command_announcement.Announce("The meteor shower over \the [location_name()] will end momentarily.", "Meteor Alert - Update") diff --git a/code/modules/shieldgen/shield_gen_external.dm b/code/modules/shieldgen/shield_gen_external.dm index 2d94eec858..c2dbadf30d 100644 --- a/code/modules/shieldgen/shield_gen_external.dm +++ b/code/modules/shieldgen/shield_gen_external.dm @@ -6,6 +6,7 @@ var/static/list/blockedturfs = list( /turf/space, /turf/simulated/floor/outdoors, + /turf/simulated/open ) /obj/machinery/shield_gen/external/advanced @@ -26,8 +27,20 @@ T = locate(gen_turf.x + x_offset, gen_turf.y + y_offset, gen_turf.z) if (is_type_in_list(T,blockedturfs)) //check neighbors of T - for(var/i in orange(1, T)) - if(istype(i, /turf/simulated) && !is_type_in_list(i,blockedturfs)) - out += T - break - return out \ No newline at end of file + if(istype(T, /turf/simulated/open)) + if((locate(/obj/structure/catwalk) in T) || !T.is_outdoors()) // Don't cover catwalks or indoor turfs. + continue + for(var/turf/simulated/Turf in orange(1, T)) // check adjacent turfs + if(!Turf.is_outdoors() && !is_type_in_list(Turf, blockedturfs)) + out |= T + break + if(Turf.is_outdoors() && (!is_type_in_list(Turf, blockedturfs) || (locate(/obj/structure/catwalk) in Turf))) // Is it outdoors, and not a turf we can shield, or a catwalked turf? + out |= T + break + else + for(var/i in orange(1, T)) + if(istype(i, /turf/simulated) && !is_type_in_list(i,blockedturfs)) + out |= T + break + + return out diff --git a/polaris.dme b/polaris.dme index 438f2a5c5e..dbccf0b338 100644 --- a/polaris.dme +++ b/polaris.dme @@ -1941,6 +1941,7 @@ #include "code\modules\gamemaster\event2\events\engineering\dust.dm" #include "code\modules\gamemaster\event2\events\engineering\gas_leak.dm" #include "code\modules\gamemaster\event2\events\engineering\grid_check.dm" +#include "code\modules\gamemaster\event2\events\engineering\planet_meteor_defense.dm" #include "code\modules\gamemaster\event2\events\engineering\space_meteor_defense.dm" #include "code\modules\gamemaster\event2\events\engineering\spacevine.dm" #include "code\modules\gamemaster\event2\events\engineering\wallrot.dm"