diff --git a/code/datums/supplypacks/engineering.dm b/code/datums/supplypacks/engineering.dm index 28a7431ec16..f295676402b 100644 --- a/code/datums/supplypacks/engineering.dm +++ b/code/datums/supplypacks/engineering.dm @@ -77,13 +77,19 @@ containertype = /obj/structure/closet/crate/focalpoint containername = "advanced hull shield generator crate" -/datum/supply_pack/eng/pointdefense - name = "Point Defense Turret" - contains = list(/obj/machinery/porta_turret/pointdefense/orderable) - cost = 70 - containertype = /obj/structure/closet/crate/large/secure/heph - containername = "point defense crate" - access = access_security +/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" diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index a6ceb219c84..950910fe5fc 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -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 ..() @@ -162,10 +162,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 @@ -190,9 +190,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) @@ -209,16 +209,13 @@ /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) - return + 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() diff --git a/code/game/machinery/pointdefense.dm b/code/game/machinery/pointdefense.dm index 51f48c416b0..705e2892e92 100644 --- a/code/game/machinery/pointdefense.dm +++ b/code/game/machinery/pointdefense.dm @@ -4,11 +4,12 @@ // GLOBAL_LIST_BOILERPLATE(pointdefense_controllers, /obj/machinery/pointdefense_control) -GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense) +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 @@ -53,7 +54,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense) return TRUE if(action == "toggle_active") - var/obj/machinery/power/pointdefense/PD = locate(params["target"]) + var/obj/machinery/pointdefense/PD = locate(params["target"]) if(!istype(PD)) return FALSE @@ -76,7 +77,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense) if(id_tag) var/list/connected_z_levels = GetConnectedZlevels(get_z(src)) for(var/i = 1 to LAZYLEN(pointdefense_turrets)) - var/obj/machinery/power/pointdefense/PD = pointdefense_turrets[i] + var/obj/machinery/pointdefense/PD = pointdefense_turrets[i] if(!(PD.id_tag == id_tag && get_z(PD) in connected_z_levels)) continue var/list/turret = list() @@ -117,89 +118,52 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense) // The acutal point defense battery // -/obj/machinery/power/pointdefense +/obj/machinery/pointdefense name = "\improper point defense battery" icon = 'icons/obj/pointdefense.dmi' icon_state = "pointdefense2" 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 idle_power_usage = 0.1 KILOWATTS - active_power_usage = 1 KILOWATTS appearance_flags = PIXEL_SCALE var/active = TRUE var/charge_cooldown = 1 SECOND //time between it can fire at different targets 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/power/pointdefense/Initialize() +/obj/machinery/pointdefense/Initialize() . = ..() // TODO - Remove this bit once machines are converted to Initialize if(ispath(circuit)) circuit = new circuit(src) default_apply_parts() - if(anchored) - connect_to_network() update_icon() - var/image/I = image(icon, icon_state = "[icon_state]_under") - I.appearance_flags |= RESET_TRANSFORM - underlays += I -/obj/machinery/power/pointdefense/examine(mob/user) - . = ..() - if(powernet) - . += "It is connected to a power cable below." - -/obj/machinery/power/pointdefense/get_description_interaction() +/obj/machinery/pointdefense/get_description_interaction() . = ..() if(!id_tag) . += "[desc_panel_image("multitool")]to set ident tag and connect to a mainframe." -/obj/machinery/power/pointdefense/update_icon() +/obj/machinery/pointdefense/update_icon() if(!active || !id_tag || inoperable()) icon_state = "[initial(icon_state)]_off" else icon_state = initial(icon_state) -/obj/machinery/power/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/power/pointdefense/connect_to_network() - if((. = ..())) - stat &= ~NOPOWER // We now ignore APC power - update_icon() - -/obj/machinery/power/pointdefense/disconnect_from_network() - if((. = ..())) - power_change() // We're back on APC power. - -/obj/machinery/power/pointdefense/power_change() - if(powernet) - return // We don't care, we are cable powered anyway +/obj/machinery/pointdefense/power_change() var/old_stat = stat ..() if(old_stat != stat) update_icon() -// Decide where to get the power to fire from -/obj/machinery/power/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) -/obj/machinery/power/pointdefense/proc/get_controller() +/obj/machinery/pointdefense/proc/get_controller() if(!id_tag) return null var/list/connected_z_levels = GetConnectedZlevels(get_z(src)) @@ -208,7 +172,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense) if(PDC.id_tag == id_tag && (get_z(PDC) in connected_z_levels)) return PDC -/obj/machinery/power/pointdefense/attackby(var/obj/item/W, var/mob/user) +/obj/machinery/pointdefense/attackby(var/obj/item/W, var/mob/user) if(W?.is_multitool()) var/new_ident = input(user, "Enter a new ident tag.", "[src]", id_tag) as null|text if(new_ident && new_ident != id_tag && user.Adjacent(src) && CanInteract(user, GLOB.tgui_physical_state)) @@ -221,22 +185,21 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense) return if(default_part_replacement(user, W)) return - if(default_unfasten_wrench(user, W, 40)) - return return ..() //Guns cannot shoot through hull or generally dense turfs. -/obj/machinery/power/pointdefense/proc/space_los(meteor) +/obj/machinery/pointdefense/proc/space_los(meteor) for(var/turf/T in getline(src,meteor)) if(T.density) return FALSE return TRUE -/obj/machinery/power/pointdefense/proc/Shoot(var/weakref/target) +/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) @@ -245,80 +208,85 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense) set_dir(ATAN2(transform.b, transform.a) > 0 ? NORTH : SOUTH) -/obj/machinery/power/pointdefense/proc/finish_shot(var/weakref/target) - //Cleanup from list - var/obj/machinery/pointdefense_control/PC = get_controller() - if(istype(PC)) - PC.targets -= target +/obj/machinery/pointdefense/proc/finish_shot(var/weakref/target) + + var/obj/machinery/pointdefense_control/PC = get_controller() + engaging = null + PC.targets -= target - engaging = FALSE last_shot = world.time var/obj/effect/meteor/M = target.resolve() if(!istype(M)) 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 var/obj/item/projectile/beam/pointdefense/beam = new(get_turf(src)) playsound(src, 'sound/weapons/mandalorian.ogg', 75, 1) + use_power_oneoff(idle_power_usage * 10) beam.launch_projectile(target = M.loc, user = src) - M.make_debris() - qdel(M) -/obj/machinery/power/pointdefense/process() +/obj/machinery/pointdefense/process() ..() - if(!anchored || stat & (NOPOWER|BROKEN)) + if(stat & (NOPOWER|BROKEN)) return if(!active) return - /* 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/power/pointdefense/proc/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 var/obj/machinery/pointdefense_control/PC = get_controller() if(!istype(PC)) return + + // Compile list of known targets + var/list/existing_targets = list() + for(var/weakref/WR in PC.targets) + var/obj/effect/meteor/M = WR.resolve() + existing_targets += M - var/list/connected_z_levels = GetConnectedZlevels(get_z(src)) - for(var/obj/effect/meteor/M in GLOB.meteor_list) - var/already_targeted = FALSE - 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 - - 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 -/obj/machinery/power/pointdefense/RefreshParts() + // 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 var/shootrate_divisor = total_component_rating_of_type(/obj/item/weapon/stock_parts/capacitor) @@ -334,7 +302,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense) var/rotation_divisor = total_component_rating_of_type(/obj/item/weapon/stock_parts/manipulator) rotation_speed = 0.5 SECONDS / (rotation_divisor ? rotation_divisor : 1) -/obj/machinery/power/pointdefense/proc/Activate() +/obj/machinery/pointdefense/proc/Activate() if(active) return FALSE @@ -344,7 +312,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense) update_icon() return TRUE -/obj/machinery/power/pointdefense/proc/Deactivate() +/obj/machinery/pointdefense/proc/Deactivate() if(!active) return FALSE playsound(src, 'sound/machines/apc_nopower.ogg', 50, 0) @@ -352,32 +320,3 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/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 = '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" diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 8e9e6da8f71..d4068974ae3 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -74,7 +74,6 @@ var/check_anomalies = TRUE //checks if it can shoot at unidentified lifeforms (ie xenos) var/check_synth = FALSE //if active, will shoot at anything not an AI or cyborg var/check_all = FALSE //If active, will fire on anything, including synthetics. - var/fire_at_movement = FALSE // If active, will fire on the most recent thing to move in range, as soon as possible. var/ailock = FALSE // AI cannot use this var/check_down = FALSE //If active, will shoot to kill when lethals are also on var/faction = null //if set, will not fire at people in the same faction for any reason. @@ -96,8 +95,6 @@ var/timeout = 10 // When a turret pops up, then finds nothing to shoot at, this number decrements until 0, when it pops down. var/can_salvage = TRUE // If false, salvaging doesn't give you anything. - var/stay_up = FALSE // If true, the turret will remain open while it is powered. - /obj/machinery/porta_turret/crescent req_one_access = list(access_cent_specops) enabled = FALSE @@ -279,31 +276,6 @@ ) return data -/obj/machinery/porta_turret/pointdefense - name = "point-defense turret" - turret_type = "core" - desc = "A basic ship-mounted rock-breaker." - description_info = "This turret is capable of blasting incoming meteors into gravel, but it is very limited in range." - - installation = /obj/item/weapon/gun/energy/mininglaser - - check_arrest = FALSE - check_records = FALSE - check_weapons = FALSE - check_access = FALSE - check_anomalies = FALSE - check_synth = FALSE - check_all = FALSE - fire_at_movement = TRUE - stay_up = TRUE - ailock = FALSE - check_down = FALSE - -/obj/machinery/porta_turret/pointdefense/orderable - enabled = FALSE - anchored = FALSE - locked = FALSE - /obj/machinery/porta_turret/Initialize() //Sets up a spark system spark_system = new /datum/effect/effect/system/spark_spread @@ -350,8 +322,6 @@ var/obj/item/projectile/P = initial(E.projectile_type) //var/obj/item/ammo_casing/shottype = E.projectile_type - //GLOB.moved_event.register_global(src, /obj/machinery/porta_turret/proc/point_defense) //VOREStation Removal - projectile = P lethal_projectile = projectile shot_sound = initial(P.fire_sound) @@ -407,14 +377,6 @@ lethal_shot_sound = 'sound/weapons/eluger.ogg' shot_sound = 'sound/weapons/Taser.ogg' - if(/obj/item/weapon/gun/energy/mininglaser) - lethal_icon_color = "green" - lethal_projectile = /obj/item/projectile/beam/mininglaser - lethal_shot_sound = 'sound/weapons/eluger.ogg' - icon_color = "red" - projectile = /obj/item/projectile/beam/weaklaser - shot_sound = 'sound/weapons/Laser.ogg' - /obj/machinery/porta_turret/proc/isLocked(mob/user) if(locked && !issilicon(user)) to_chat(user, "Controls locked.") @@ -712,10 +674,6 @@ popDown() return - if(stay_up) - timeout = 10 - popUp() - var/list/targets = list() //list of primary targets var/list/secondarytargets = list() //targets that are least important @@ -738,7 +696,7 @@ if(!tryToShootAt(targets)) if(!tryToShootAt(secondarytargets)) // if no valid targets, go for secondary targets timeout-- - if(timeout <= 0 && !stay_up) + if(timeout <= 0) spawn() popDown() // no valid targets, close the cover @@ -746,14 +704,6 @@ use_power(20000) health = min(health+1, maxhealth) // 1HP for 20kJ -// We're expecting the first arg to be a target, for this we don't care about previous and next turfs. -/obj/machinery/porta_turret/proc/point_defense(var/atom/movable/Targ) - if((stat & (NOPOWER|BROKEN)) || !fire_at_movement) // Are we even able or supposed to fire at non-moving targets? - return - - if((isliving(Targ) && assess_living(Targ)) || ((istype(Targ, /obj/item) || istype(Targ, /obj/effect/meteor)) && Targ.invisibility < INVISIBILITY_LEVEL_ONE && Targ in view(7,src))) // Is the target a living thing, if so, is it a valid target? Or if it's not living, is it in sight? - target(Targ) // Yes? Blast it. - /obj/machinery/porta_turret/proc/assess_and_assign(var/mob/living/L, var/list/targets, var/list/secondarytargets) switch(assess_living(L)) if(TURRET_PRIORITY_TARGET) @@ -780,10 +730,10 @@ if(L.stat == DEAD && !emagged) //if the perp is dead, no need to bother really return TURRET_NOT_TARGET //move onto next potential victim! - if(get_dist(src, get_turf(L)) > 7) //if it's too far away, why bother? + if(get_dist(src, L) > 7) //if it's too far away, why bother? return TURRET_NOT_TARGET - if(!(L in check_trajectory(get_turf(L), src))) //check if we have true line of sight + if(!(L in check_trajectory(L, src))) //check if we have true line of sight return TURRET_NOT_TARGET if(emagged) // If emagged not even the dead get a rest @@ -890,9 +840,8 @@ last_target = target spawn() popUp() //pop the turret up if it's not already up. - if(dir != get_dir(src, target)) - set_dir(get_dir(src, target)) //even if you can't shoot, follow the target - playsound(src, 'sound/machines/turrets/turret_rotate.ogg', 100, 1) // Play rotating sound + set_dir(get_dir(src, target)) //even if you can't shoot, follow the target + playsound(src, 'sound/machines/turrets/turret_rotate.ogg', 100, 1) // Play rotating sound spawn() shootAt(target) return 1 @@ -956,9 +905,6 @@ var/check_weapons var/check_anomalies var/check_all - var/check_down - var/fire_at_movement - var/stay_up var/ailock /obj/machinery/porta_turret/proc/setState(var/datum/turret_checks/TC) @@ -974,9 +920,6 @@ check_weapons = TC.check_weapons check_anomalies = TC.check_anomalies check_all = TC.check_all - check_down = TC.check_down - fire_at_movement = TC.fire_at_movement - stay_up = TC.stay_up ailock = TC.ailock power_change() diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index 7f5a1d8e567..3477eaea5af 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -196,9 +196,6 @@ TC.check_weapons = check_weapons TC.check_anomalies = check_anomalies TC.check_all = check_all - TC.check_down = check_down - TC.stay_up = stay_up - TC.fire_at_movement = fire_at_movement TC.ailock = ailock if(istype(control_area)) diff --git a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm index e48606a2acd..d750cfc70b1 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm @@ -87,4 +87,6 @@ light_range = 2 light_power = 0.5 light_color = "#80F5FF" -//VOREStation edit ends \ No newline at end of file +//VOREStation edit ends +/obj/effect/projectile/impact/pointdefense + icon_state = "impact_pointdef" diff --git a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm index a5c70aab2c2..64afc049512 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm @@ -99,4 +99,6 @@ light_range = 2 light_power = 0.5 light_color = "#80F5FF" -//VOREStation edit ends \ No newline at end of file +//VOREStation edit ends +/obj/effect/projectile/muzzle/pointdefense + icon_state = "muzzle_pointdef" diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm index 4326bc536d6..e3ae63cbad0 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm @@ -129,3 +129,5 @@ light_power = 0.5 light_color = "#80F5FF" //VOREStation edit ends +/obj/effect/projectile/tracer/pointdefense + icon_state = "beam_pointdef" diff --git a/code/game/objects/items/weapons/circuitboards/machinery/ships.dm b/code/game/objects/items/weapons/circuitboards/machinery/ships.dm index b71e7ce37b9..dd37bc2519e 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/ships.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/ships.dm @@ -6,8 +6,8 @@ name = T_BOARD("point defense battery") board_type = new /datum/frame/frame_types/machine desc = "Control systems for a Kuiper pattern point defense battery. Aim away from vessel." - build_path = /obj/machinery/power/pointdefense - origin_tech = list(TECH_ENGINEERING = 3, TECH_COMBAT = 2, TECH_POWER = 2) + build_path = /obj/machinery/pointdefense + origin_tech = list(TECH_ENGINEERING = 3, TECH_COMBAT = 2) req_components = list( /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser = 1, /obj/item/weapon/stock_parts/manipulator = 2, diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 1612e1cab37..12f2cf09e60 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -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 diff --git a/code/modules/research/designs/circuits/circuits.dm b/code/modules/research/designs/circuits/circuits.dm index 017a3010af2..f2cdb7d3898 100644 --- a/code/modules/research/designs/circuits/circuits.dm +++ b/code/modules/research/designs/circuits/circuits.dm @@ -662,6 +662,19 @@ CIRCUITS BELOW build_path = /obj/item/weapon/circuitboard/microwave/advanced 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 name = "shield generator"