mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-16 21:22:40 +00:00
Hybridizes PDC systems, Bay turrets deal damage to meteors
This commit is contained in:
@@ -77,6 +77,20 @@
|
||||
containertype = /obj/structure/closet/crate/focalpoint
|
||||
containername = "advanced hull shield generator crate"
|
||||
|
||||
/datum/supply_pack/eng/point_defense_cannon_circuit
|
||||
name = "Point Defense Turret Circuit"
|
||||
contains = list(/obj/item/weapon/circuitboard/pointdefense = 2)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/heph
|
||||
containername = "point defense turret circuit crate"
|
||||
|
||||
/datum/supply_pack/eng/point_defense_control_circuit
|
||||
name = "Point Defense Controller Circuit"
|
||||
contains = list(/obj/item/weapon/circuitboard/pointdefense_control = 1)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/heph
|
||||
containername = "point defense mainframe circuit crate"
|
||||
|
||||
/datum/supply_pack/eng/electrical
|
||||
name = "Electrical maintenance crate"
|
||||
contains = list(
|
||||
|
||||
@@ -109,13 +109,13 @@
|
||||
desc = "You should probably run instead of gawking at this."
|
||||
icon = 'icons/obj/meteor.dmi'
|
||||
icon_state = "small"
|
||||
density = 1
|
||||
anchored = 1
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
var/hits = 4
|
||||
var/hitpwr = 2 //Level of ex_act to be called on hit.
|
||||
var/dest
|
||||
pass_flags = PASSTABLE
|
||||
var/heavy = 0
|
||||
var/heavy = FALSE
|
||||
var/z_original
|
||||
|
||||
var/meteordrop = /obj/item/weapon/ore/iron
|
||||
@@ -147,7 +147,7 @@
|
||||
get_hit()
|
||||
|
||||
/obj/effect/meteor/Destroy()
|
||||
walk(src,0) //this cancels the walk_towards() proc
|
||||
walk(src,FALSE) //this cancels the walk_towards() proc
|
||||
GLOB.meteor_list -= src
|
||||
return ..()
|
||||
|
||||
@@ -161,10 +161,10 @@
|
||||
ram_turf(get_turf(A))
|
||||
get_hit()
|
||||
else
|
||||
die(0)
|
||||
die(FALSE)
|
||||
|
||||
/obj/effect/meteor/CanPass(atom/movable/mover, turf/target)
|
||||
return istype(mover, /obj/effect/meteor) ? 1 : ..()
|
||||
return istype(mover, /obj/effect/meteor) ? TRUE : ..()
|
||||
|
||||
/obj/effect/meteor/proc/ram_turf(var/turf/T)
|
||||
//first bust whatever is in the turf
|
||||
@@ -187,9 +187,9 @@
|
||||
/obj/effect/meteor/proc/get_hit()
|
||||
hits--
|
||||
if(hits <= 0)
|
||||
die(1)
|
||||
die(TRUE)
|
||||
|
||||
/obj/effect/meteor/proc/die(var/explode = 1)
|
||||
/obj/effect/meteor/proc/die(var/explode = TRUE)
|
||||
make_debris()
|
||||
meteor_effect(explode)
|
||||
qdel(src)
|
||||
@@ -206,15 +206,12 @@
|
||||
/obj/effect/meteor/bullet_act(var/obj/item/projectile/Proj)
|
||||
if(Proj.excavation_amount)
|
||||
get_hit()
|
||||
|
||||
if(!QDELETED(src))
|
||||
wall_power -= Proj.excavation_amount + Proj.damage + (Proj.hitscan * 25) // Instant-impact projectiles are inherently better at dealing with meteors.
|
||||
wall_power = max(1, wall_power)
|
||||
|
||||
if(wall_power < Proj.excavation_amount)
|
||||
if(prob(min(90, 100 - Proj.damage)))
|
||||
die(TRUE)
|
||||
else
|
||||
die(FALSE)
|
||||
if(wall_power <= 0)
|
||||
die(FALSE) // If you kill the meteor, then it dies.
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
|
||||
/obj/machinery/pointdefense_control
|
||||
name = "fire assist mainframe"
|
||||
desc = "A specialized computer designed to synchronize a variety of weapon systems and a vessel's astronav data."
|
||||
description_info = "To connect the mainframe to turrets, use a multitool to set the ident tag to that of the turrets."
|
||||
icon = 'icons/obj/pointdefense.dmi'
|
||||
icon_state = "control"
|
||||
density = TRUE
|
||||
@@ -129,7 +130,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
|
||||
icon = 'icons/obj/pointdefense.dmi'
|
||||
icon_state = "pointdefense"
|
||||
desc = "A Kuiper pattern anti-meteor battery. Capable of destroying most threats in a single salvo."
|
||||
description_info = "Must have the same ident tag as a fire assist mainframe on the same facility."
|
||||
description_info = "Must have the same ident tag as a fire assist mainframe on the same facility. Use a multitool to set the ident tag."
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
circuit = /obj/item/weapon/circuitboard/pointdefense
|
||||
@@ -140,7 +141,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
|
||||
var/last_shot = 0
|
||||
var/kill_range = 18
|
||||
var/rotation_speed = 0.25 SECONDS //How quickly we turn to face threats
|
||||
var/engaging = FALSE
|
||||
var/weakref/engaging = null // The meteor we're shooting at
|
||||
var/id_tag = null
|
||||
|
||||
/obj/machinery/pointdefense/Initialize()
|
||||
@@ -203,8 +204,9 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
|
||||
/obj/machinery/pointdefense/proc/Shoot(var/weakref/target)
|
||||
var/obj/effect/meteor/M = target.resolve()
|
||||
if(!istype(M))
|
||||
engaging = null
|
||||
return
|
||||
engaging = TRUE
|
||||
engaging = target
|
||||
var/Angle = round(Get_Angle(src,M))
|
||||
var/matrix/rot_matrix = matrix()
|
||||
rot_matrix.Turn(Angle)
|
||||
@@ -214,12 +216,11 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
|
||||
set_dir(ATAN2(transform.b, transform.a) > 0 ? NORTH : SOUTH)
|
||||
|
||||
/obj/machinery/pointdefense/proc/finish_shot(var/weakref/target)
|
||||
//Cleanup from list
|
||||
|
||||
var/obj/machinery/pointdefense_control/PC = get_controller()
|
||||
if(istype(PC))
|
||||
engaging = null
|
||||
PC.targets -= target
|
||||
|
||||
engaging = FALSE
|
||||
last_shot = world.time
|
||||
var/obj/effect/meteor/M = target.resolve()
|
||||
if(!istype(M))
|
||||
@@ -230,9 +231,6 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
|
||||
use_power_oneoff(idle_power_usage * 10)
|
||||
beam.launch_projectile(target = M.loc, user = src)
|
||||
|
||||
M.make_debris()
|
||||
qdel(M)
|
||||
|
||||
/obj/machinery/pointdefense/process()
|
||||
..()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
@@ -242,12 +240,15 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
|
||||
var/desiredir = ATAN2(transform.b, transform.a) > 0 ? NORTH : SOUTH
|
||||
if(dir != desiredir)
|
||||
set_dir(desiredir)
|
||||
|
||||
if(LAZYLEN(GLOB.meteor_list) > 0)
|
||||
find_and_shoot()
|
||||
|
||||
/obj/machinery/pointdefense/proc/find_and_shoot()
|
||||
// There ARE meteors to shoot
|
||||
if(LAZYLEN(GLOB.meteor_list) == 0)
|
||||
return
|
||||
// We can shoot
|
||||
if(engaging || ((world.time - last_shot) < charge_cooldown))
|
||||
return
|
||||
|
||||
@@ -255,30 +256,43 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
|
||||
if(!istype(PC))
|
||||
return
|
||||
|
||||
var/list/connected_z_levels = GetConnectedZlevels(get_z(src))
|
||||
for(var/obj/effect/meteor/M in GLOB.meteor_list)
|
||||
var/already_targeted = FALSE
|
||||
// Compile list of known targets
|
||||
var/list/existing_targets = list()
|
||||
for(var/weakref/WR in PC.targets)
|
||||
var/obj/effect/meteor/m = WR.resolve()
|
||||
if(m == M)
|
||||
already_targeted = TRUE
|
||||
break
|
||||
if(!istype(m))
|
||||
PC.targets -= WR
|
||||
var/obj/effect/meteor/M = WR.resolve()
|
||||
existing_targets += M
|
||||
|
||||
if(already_targeted)
|
||||
continue
|
||||
|
||||
if(!(M.z in connected_z_levels))
|
||||
continue
|
||||
if(get_dist(M, src) > kill_range)
|
||||
continue
|
||||
if(!emagged && space_los(M))
|
||||
// First, try and acquire new targets
|
||||
var/list/potential_targets = GLOB.meteor_list.Copy() - existing_targets
|
||||
for(var/obj/effect/meteor/M in potential_targets)
|
||||
if(targeting_check(M))
|
||||
var/weakref/target = weakref(M)
|
||||
PC.targets += target
|
||||
engaging = target
|
||||
Shoot(target)
|
||||
return
|
||||
|
||||
// Then, focus fire on existing targets
|
||||
for(var/obj/effect/meteor/M in existing_targets)
|
||||
if(targeting_check(M))
|
||||
var/weakref/target = weakref(M)
|
||||
engaging = target
|
||||
Shoot(target)
|
||||
return
|
||||
|
||||
/obj/machinery/pointdefense/proc/targeting_check(var/obj/effect/meteor/M)
|
||||
// Target in range
|
||||
var/list/connected_z_levels = GetConnectedZlevels(get_z(src))
|
||||
if(!(M.z in connected_z_levels))
|
||||
return FALSE
|
||||
if(get_dist(M, src) > kill_range)
|
||||
return FALSE
|
||||
// If we can shoot it, then shoot
|
||||
if(emagged || !space_los(M))
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/pointdefense/RefreshParts()
|
||||
. = ..()
|
||||
// Calculates an average rating of components that affect shooting rate
|
||||
@@ -313,29 +327,3 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
|
||||
active = FALSE
|
||||
update_icon()
|
||||
return TRUE
|
||||
|
||||
//
|
||||
// Projectile Beam Definitions
|
||||
//
|
||||
|
||||
/obj/item/projectile/beam/pointdefense
|
||||
name = "point defense salvo"
|
||||
icon_state = "laser"
|
||||
damage = 15
|
||||
damage_type = ELECTROCUTE //You should be safe inside a voidsuit
|
||||
sharp = FALSE //"Wide" spectrum beam
|
||||
light_color = COLOR_GOLD
|
||||
|
||||
muzzle_type = /obj/effect/projectile/muzzle/pointdefense
|
||||
tracer_type = /obj/effect/projectile/tracer/pointdefense
|
||||
impact_type = /obj/effect/projectile/impact/pointdefense
|
||||
|
||||
|
||||
/obj/effect/projectile/tracer/pointdefense
|
||||
icon_state = "beam_pointdef"
|
||||
|
||||
/obj/effect/projectile/muzzle/pointdefense
|
||||
icon_state = "muzzle_pointdef"
|
||||
|
||||
/obj/effect/projectile/impact/pointdefense
|
||||
icon_state = "impact_pointdef"
|
||||
|
||||
@@ -79,3 +79,6 @@
|
||||
light_range = 4
|
||||
light_power = 3
|
||||
light_color = "#3300ff"
|
||||
|
||||
/obj/effect/projectile/impact/pointdefense
|
||||
icon_state = "impact_pointdef"
|
||||
|
||||
@@ -91,3 +91,6 @@
|
||||
light_range = 4
|
||||
light_power = 3
|
||||
light_color = "#3300ff"
|
||||
|
||||
/obj/effect/projectile/muzzle/pointdefense
|
||||
icon_state = "muzzle_pointdef"
|
||||
@@ -120,3 +120,6 @@
|
||||
light_range = 1
|
||||
light_power = 0.5
|
||||
light_color = "#f6f2b6"
|
||||
|
||||
/obj/effect/projectile/tracer/pointdefense
|
||||
icon_state = "beam_pointdef"
|
||||
|
||||
@@ -279,3 +279,22 @@
|
||||
/obj/item/projectile/beam/shock/weak
|
||||
damage = 5
|
||||
agony = 10
|
||||
|
||||
|
||||
//
|
||||
// Projectile Beam Definitions
|
||||
//
|
||||
|
||||
/obj/item/projectile/beam/pointdefense
|
||||
name = "point defense salvo"
|
||||
icon_state = "laser"
|
||||
damage = 15
|
||||
damage_type = ELECTROCUTE //You should be safe inside a voidsuit
|
||||
sharp = FALSE //"Wide" spectrum beam
|
||||
light_color = COLOR_GOLD
|
||||
|
||||
excavation_amount = 200 // Good at shooting rocks
|
||||
|
||||
muzzle_type = /obj/effect/projectile/muzzle/pointdefense
|
||||
tracer_type = /obj/effect/projectile/tracer/pointdefense
|
||||
impact_type = /obj/effect/projectile/impact/pointdefense
|
||||
|
||||
Reference in New Issue
Block a user