Port old point defense stuff I rage-closed

Tech-debt repo-man called
https://github.com/CHOMPStation2/CHOMPStation2/pull/1790
This commit is contained in:
Razgriz
2022-10-02 21:39:21 -07:00
parent 8769c3c131
commit 2b204b9194
11 changed files with 123 additions and 121 deletions

View File

@@ -77,6 +77,20 @@
containertype = /obj/structure/closet/crate/focalpoint containertype = /obj/structure/closet/crate/focalpoint
containername = "advanced hull shield generator crate" 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 /datum/supply_pack/eng/electrical
name = "Electrical maintenance crate" name = "Electrical maintenance crate"
contains = list( contains = list(

View File

@@ -109,13 +109,13 @@
desc = "You should probably run instead of gawking at this." desc = "You should probably run instead of gawking at this."
icon = 'icons/obj/meteor.dmi' icon = 'icons/obj/meteor.dmi'
icon_state = "small" icon_state = "small"
density = 1 density = TRUE
anchored = 1 anchored = TRUE
var/hits = 4 var/hits = 4
var/hitpwr = 2 //Level of ex_act to be called on hit. var/hitpwr = 2 //Level of ex_act to be called on hit.
var/dest var/dest
pass_flags = PASSTABLE pass_flags = PASSTABLE
var/heavy = 0 var/heavy = FALSE
var/z_original var/z_original
var/meteordrop = /obj/item/weapon/ore/iron var/meteordrop = /obj/item/weapon/ore/iron
@@ -147,7 +147,7 @@
get_hit() get_hit()
/obj/effect/meteor/Destroy() /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 GLOB.meteor_list -= src
return ..() return ..()
@@ -162,10 +162,10 @@
ram_turf(get_turf(A)) ram_turf(get_turf(A))
get_hit() get_hit()
else else
die(0) die(FALSE)
/obj/effect/meteor/CanPass(atom/movable/mover, turf/target) /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) /obj/effect/meteor/proc/ram_turf(var/turf/T)
//first bust whatever is in the turf //first bust whatever is in the turf
@@ -190,9 +190,9 @@
/obj/effect/meteor/proc/get_hit() /obj/effect/meteor/proc/get_hit()
hits-- hits--
if(hits <= 0) 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() make_debris()
meteor_effect(explode) meteor_effect(explode)
qdel(src) qdel(src)
@@ -206,6 +206,18 @@
return return
..() ..()
/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.
if(wall_power <= 0)
die(FALSE) // If you kill the meteor, then it dies.
return
return
/obj/effect/meteor/proc/make_debris() /obj/effect/meteor/proc/make_debris()
for(var/throws = dropamt, throws > 0, throws--) for(var/throws = dropamt, throws > 0, throws--)
var/obj/item/O = new meteordrop(get_turf(src)) var/obj/item/O = new meteordrop(get_turf(src))

View File

@@ -10,6 +10,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
/obj/machinery/pointdefense_control /obj/machinery/pointdefense_control
name = "fire assist mainframe" name = "fire assist mainframe"
desc = "A specialized computer designed to synchronize a variety of weapon systems and a vessel's astronav data." 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 = 'icons/obj/pointdefense.dmi'
icon_state = "control" icon_state = "control"
power_channel = EQUIP // CHOMPStation Edit Starts power_channel = EQUIP // CHOMPStation Edit Starts
@@ -125,7 +126,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
icon = 'icons/obj/pointdefense.dmi' icon = 'icons/obj/pointdefense.dmi'
icon_state = "pointdefense2" icon_state = "pointdefense2"
desc = "A Kuiper pattern anti-meteor battery. Capable of destroying most threats in a single salvo." 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 density = TRUE
anchored = TRUE anchored = TRUE
circuit = /obj/item/weapon/circuitboard/pointdefense circuit = /obj/item/weapon/circuitboard/pointdefense
@@ -137,7 +138,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
var/last_shot = 0 var/last_shot = 0
var/kill_range = 18 var/kill_range = 18
var/rotation_speed = 4.5 SECONDS //How quickly we turn to face threats var/rotation_speed = 4.5 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 var/id_tag = null
/obj/machinery/pointdefense/Initialize() /obj/machinery/pointdefense/Initialize()
@@ -146,17 +147,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
if(ispath(circuit)) if(ispath(circuit))
circuit = new circuit(src) circuit = new circuit(src)
default_apply_parts() default_apply_parts()
// if(anchored)
// connect_to_network()
update_icon() update_icon()
var/image/I = image(icon, icon_state = "[icon_state]_under")
I.appearance_flags |= RESET_TRANSFORM
underlays += I
// /obj/machinery/pointdefense/examine(mob/user)
// . = ..()
// if(powernet)
// . += "It is connected to a power cable below."
/obj/machinery/pointdefense/get_description_interaction() /obj/machinery/pointdefense/get_description_interaction()
. = ..() . = ..()
@@ -169,38 +160,12 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
else else
icon_state = initial(icon_state) icon_state = initial(icon_state)
/obj/machinery/pointdefense/default_unfasten_wrench(var/mob/user, var/obj/item/weapon/W, var/time)
if((. = ..()))
src.transform = null // Reset rotation if we're anchored/unanchored
////////// This machine is willing to take power from cables OR APCs. Handle NOPOWER stat specially here! ////////
/*
/obj/machinery/pointdefense/connect_to_network()
if((. = ..()))
stat &= ~NOPOWER // We now ignore APC power
update_icon()
/obj/machinery/pointdefense/disconnect_from_network()
if((. = ..()))
power_change() // We're back on APC power.
/obj/machinery/pointdefense/power_change() /obj/machinery/pointdefense/power_change()
if(powernet)
return // We don't care, we are cable powered anyway
var/old_stat = stat var/old_stat = stat
..() ..()
if(old_stat != stat) if(old_stat != stat)
update_icon() update_icon()
// Decide where to get the power to fire from
/obj/machinery/pointdefense/use_power_oneoff(var/amount, var/chan = -1)
if(powernet)
return draw_power(amount)
else if(powered(chan))
use_power(amount, chan)
return amount
return 0 */
// Find controller with the same tag on connected z levels (if any) // Find controller with the same tag on connected z levels (if any)
/obj/machinery/pointdefense/proc/get_controller() /obj/machinery/pointdefense/proc/get_controller()
if(!id_tag) if(!id_tag)
@@ -223,8 +188,6 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
return return
if(default_part_replacement(user, W)) if(default_part_replacement(user, W))
return return
if(default_unfasten_wrench(user, W, 40))
return
return ..() return ..()
//Guns cannot shoot through hull or generally dense turfs. //Guns cannot shoot through hull or generally dense turfs.
@@ -237,8 +200,9 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
/obj/machinery/pointdefense/proc/Shoot(var/weakref/target) /obj/machinery/pointdefense/proc/Shoot(var/weakref/target)
var/obj/effect/meteor/M = target.resolve() var/obj/effect/meteor/M = target.resolve()
if(!istype(M)) if(!istype(M))
engaging = null
return return
engaging = TRUE engaging = target
var/Angle = round(Get_Angle(src,M)) var/Angle = round(Get_Angle(src,M))
var/matrix/rot_matrix = matrix() var/matrix/rot_matrix = matrix()
rot_matrix.Turn(Angle) rot_matrix.Turn(Angle)
@@ -248,47 +212,38 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
set_dir(ATAN2(transform.b, transform.a) > 0 ? NORTH : SOUTH) set_dir(ATAN2(transform.b, transform.a) > 0 ? NORTH : SOUTH)
/obj/machinery/pointdefense/proc/finish_shot(var/weakref/target) /obj/machinery/pointdefense/proc/finish_shot(var/weakref/target)
//Cleanup from list
var/obj/machinery/pointdefense_control/PC = get_controller() var/obj/machinery/pointdefense_control/PC = get_controller()
if(istype(PC)) engaging = null
PC.targets -= target PC.targets -= target
engaging = FALSE
last_shot = world.time last_shot = world.time
var/obj/effect/meteor/M = target.resolve() var/obj/effect/meteor/M = target.resolve()
if(!istype(M)) if(!istype(M))
return return
/*if(use_power_oneoff(active_power_usage) < active_power_usage)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
visible_message("[src] sputters as browns out while attempting to fire.")
flick(src, "[initial(icon_state)]_off")
return */
//We throw a laser but it doesnt have to hit for meteor to explode //We throw a laser but it doesnt have to hit for meteor to explode
var/obj/item/projectile/beam/pointdefense/beam = new(get_turf(src)) var/obj/item/projectile/beam/pointdefense/beam = new(get_turf(src))
playsound(src, 'sound/weapons/mandalorian.ogg', 75, 1) playsound(src, 'sound/weapons/mandalorian.ogg', 75, 1)
use_power_oneoff(idle_power_usage * 10)
beam.launch_projectile(target = M.loc, user = src) beam.launch_projectile(target = M.loc, user = src)
M.make_debris()
qdel(M)
/obj/machinery/pointdefense/process() /obj/machinery/pointdefense/process()
..() ..()
if(!anchored || stat & (BROKEN)) if(stat & (BROKEN))
return return
if(!active) if(!active)
return return
/*
var/desiredir = ATAN2(transform.b, transform.a) > 0 ? NORTH : SOUTH var/desiredir = ATAN2(transform.b, transform.a) > 0 ? NORTH : SOUTH
if(dir != desiredir) if(dir != desiredir)
set_dir(desiredir) set_dir(desiredir)
*/
if(LAZYLEN(GLOB.meteor_list) > 0) if(LAZYLEN(GLOB.meteor_list) > 0)
find_and_shoot() find_and_shoot()
/obj/machinery/pointdefense/proc/find_and_shoot() /obj/machinery/pointdefense/proc/find_and_shoot()
// There ARE meteors to shoot
if(LAZYLEN(GLOB.meteor_list) == 0) if(LAZYLEN(GLOB.meteor_list) == 0)
return return
// We can shoot
if(engaging || ((world.time - last_shot) < charge_cooldown)) if(engaging || ((world.time - last_shot) < charge_cooldown))
return return
@@ -296,30 +251,43 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
if(!istype(PC) || !PC.powered(EQUIP)) if(!istype(PC) || !PC.powered(EQUIP))
return return
var/list/connected_z_levels = GetConnectedZlevels(get_z(src)) // Compile list of known targets
for(var/obj/effect/meteor/M in GLOB.meteor_list) var/list/existing_targets = list()
var/already_targeted = FALSE
for(var/weakref/WR in PC.targets) for(var/weakref/WR in PC.targets)
var/obj/effect/meteor/m = WR.resolve() var/obj/effect/meteor/M = WR.resolve()
if(m == M) existing_targets += M
already_targeted = TRUE
break
if(!istype(m))
PC.targets -= WR
if(already_targeted) // First, try and acquire new targets
continue var/list/potential_targets = GLOB.meteor_list.Copy() - existing_targets
for(var/obj/effect/meteor/M in potential_targets)
if(!(M.z in connected_z_levels)) if(targeting_check(M))
continue
if(get_dist(M, src) > kill_range)
continue
if(!emagged && space_los(M))
var/weakref/target = weakref(M) var/weakref/target = weakref(M)
PC.targets += target PC.targets += target
engaging = target
Shoot(target) Shoot(target)
return 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() /obj/machinery/pointdefense/RefreshParts()
. = ..() . = ..()
// Calculates an average rating of components that affect shooting rate // Calculates an average rating of components that affect shooting rate
@@ -354,32 +322,3 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
active = FALSE active = FALSE
update_icon() update_icon()
return TRUE 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 = 'icons/obj/projectiles_vr.dmi'
icon_state = "beam_pointdef"
/obj/effect/projectile/muzzle/pointdefense
icon = 'icons/obj/projectiles_vr.dmi'
icon_state = "muzzle_pointdef"
/obj/effect/projectile/impact/pointdefense
icon = 'icons/obj/projectiles_vr.dmi'
icon_state = "impact_pointdef"

View File

@@ -903,7 +903,6 @@
var/check_weapons var/check_weapons
var/check_anomalies var/check_anomalies
var/check_all var/check_all
var/check_down
var/ailock var/ailock
/obj/machinery/porta_turret/proc/setState(var/datum/turret_checks/TC) /obj/machinery/porta_turret/proc/setState(var/datum/turret_checks/TC)
@@ -919,7 +918,6 @@
check_weapons = TC.check_weapons check_weapons = TC.check_weapons
check_anomalies = TC.check_anomalies check_anomalies = TC.check_anomalies
check_all = TC.check_all check_all = TC.check_all
check_down = TC.check_down
ailock = TC.ailock ailock = TC.ailock
power_change() power_change()

View File

@@ -194,7 +194,6 @@
TC.check_weapons = check_weapons TC.check_weapons = check_weapons
TC.check_anomalies = check_anomalies TC.check_anomalies = check_anomalies
TC.check_all = check_all TC.check_all = check_all
TC.check_down = check_down
TC.ailock = ailock TC.ailock = ailock
if(istype(control_area)) if(istype(control_area))

View File

@@ -95,3 +95,5 @@
light_power = 0.5 light_power = 0.5
light_color = "#80F5FF" light_color = "#80F5FF"
//VOREStation edit ends //VOREStation edit ends
/obj/effect/projectile/impact/pointdefense
icon_state = "impact_pointdef"

View File

@@ -107,3 +107,5 @@
light_power = 0.5 light_power = 0.5
light_color = "#80F5FF" light_color = "#80F5FF"
//VOREStation edit ends //VOREStation edit ends
/obj/effect/projectile/muzzle/pointdefense
icon_state = "muzzle_pointdef"

View File

@@ -134,3 +134,5 @@
light_power = 0.5 light_power = 0.5
light_color = "#80F5FF" light_color = "#80F5FF"
//VOREStation edit ends //VOREStation edit ends
/obj/effect/projectile/tracer/pointdefense
icon_state = "beam_pointdef"

View File

@@ -7,7 +7,7 @@
board_type = new /datum/frame/frame_types/machine board_type = new /datum/frame/frame_types/machine
desc = "Control systems for a Kuiper pattern point defense battery. Aim away from vessel." desc = "Control systems for a Kuiper pattern point defense battery. Aim away from vessel."
build_path = /obj/machinery/pointdefense build_path = /obj/machinery/pointdefense
origin_tech = list(TECH_ENGINEERING = 3, TECH_COMBAT = 2, TECH_POWER = 2) origin_tech = list(TECH_ENGINEERING = 3, TECH_COMBAT = 2)
req_components = list( req_components = list(
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser = 1, /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser = 1,
/obj/item/weapon/stock_parts/manipulator = 2, /obj/item/weapon/stock_parts/manipulator = 2,

View File

@@ -331,6 +331,26 @@
damage = 5 damage = 5
agony = 10 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
/obj/item/projectile/beam/precursor //CHOMPedit added Precursor beam /obj/item/projectile/beam/precursor //CHOMPedit added Precursor beam
name = "precursor beam" name = "precursor beam"
icon_state = "alien beam" icon_state = "alien beam"

View File

@@ -676,6 +676,20 @@ CIRCUITS BELOW
build_path = /obj/item/weapon/circuitboard/microwave/advanced build_path = /obj/item/weapon/circuitboard/microwave/advanced
sort_string = "HACAA" sort_string = "HACAA"
/datum/design/circuit/pointdefense
name = "point defense battery"
id = "pointdefense"
req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 3, TECH_COMBAT = 4)
build_path = /obj/item/weapon/circuitboard/pointdefense
sort_string = "OAABA"
/datum/design/circuit/pointdefense_control
name = "point defense control"
id = "pointdefense_control"
req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_COMBAT = 2)
build_path = /obj/item/weapon/circuitboard/pointdefense_control
sort_string = "OAABB"
/datum/design/circuit/shield_generator /datum/design/circuit/shield_generator
name = "shield generator" name = "shield generator"
id = "shield_generator" id = "shield_generator"