mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-14 20:22:42 +00:00
Adds Planetary Meteors (Again) (For Real)
Planetary meteor showers can occur. Hull shield generators made Smarter for planetary use.
This commit is contained in:
@@ -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 -- */
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user