Adds Planetary Meteors (Again) (For Real)

Planetary meteor showers can occur.
Hull shield generators made Smarter for planetary use.
This commit is contained in:
Mechoid
2023-03-05 05:27:29 -08:00
parent 186dc1cdba
commit ca2f68bf14
7 changed files with 82 additions and 8 deletions

View File

@@ -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 -- */

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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")

View File

@@ -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
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

View File

@@ -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"