From 20ed63594dcdc84d27224a14ae0d854d445d6bee Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Tue, 14 Apr 2020 13:19:21 -0400 Subject: [PATCH] Update point defense sprites and power usage --- code/game/machinery/pointdefense.dm | 89 +++++++++++++----- .../weapons/circuitboards/machinery/ships.dm | 4 +- icons/obj/pointdefense.dmi | Bin 1419 -> 8047 bytes 3 files changed, 69 insertions(+), 24 deletions(-) diff --git a/code/game/machinery/pointdefense.dm b/code/game/machinery/pointdefense.dm index 97bde089cd6..3ca0ed601e1 100644 --- a/code/game/machinery/pointdefense.dm +++ b/code/game/machinery/pointdefense.dm @@ -4,7 +4,7 @@ // GLOBAL_LIST_BOILERPLATE(pointdefense_controllers, /obj/machinery/pointdefense_control) -GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) +GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense) /obj/machinery/pointdefense_control name = "fire assist mainframe" @@ -59,7 +59,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) return if(href_list["toggle_active"]) - var/obj/machinery/pointdefense/PD = locate(href_list["toggle_active"]) + var/obj/machinery/power/pointdefense/PD = locate(href_list["toggle_active"]) if(!istype(PD)) return TOPIC_NOACTION @@ -83,7 +83,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) if(id_tag) var/list/connected_z_levels = GetConnectedZlevels(get_z(src)) for(var/i = 1 to LAZYLEN(pointdefense_turrets)) - var/obj/machinery/pointdefense/PD = pointdefense_turrets[i] + var/obj/machinery/power/pointdefense/PD = pointdefense_turrets[i] if(!(PD.id_tag == id_tag && get_z(PD) in connected_z_levels)) continue var/list/turret = list() @@ -124,16 +124,17 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) // The acutal point defense battery // -/obj/machinery/pointdefense +/obj/machinery/power/pointdefense name = "\improper point defense battery" icon = 'icons/obj/pointdefense.dmi' - icon_state = "pointdefense" + 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." 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 @@ -143,33 +144,69 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) var/engaging = FALSE var/id_tag = null -/obj/machinery/pointdefense/Initialize() +/obj/machinery/power/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/pointdefense/get_description_interaction() +/obj/machinery/power/pointdefense/examine(mob/user) + ..() + if(powernet) + to_chat(user, "It is connected to a power cable below.") + +/obj/machinery/power/pointdefense/get_description_interaction() . = ..() if(!id_tag) . += "[desc_panel_image("multitool")]to set ident tag and connect to a mainframe." -/obj/machinery/pointdefense/update_icon() +/obj/machinery/power/pointdefense/update_icon() if(!active || !id_tag || inoperable()) icon_state = "[initial(icon_state)]_off" else icon_state = initial(icon_state) -/obj/machinery/pointdefense/power_change() +/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 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/pointdefense/proc/get_controller() +/obj/machinery/power/pointdefense/proc/get_controller() if(!id_tag) return null var/list/connected_z_levels = GetConnectedZlevels(get_z(src)) @@ -178,7 +215,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) if(PDC.id_tag == id_tag && (get_z(PDC) in connected_z_levels)) return PDC -/obj/machinery/pointdefense/attackby(var/obj/item/W, var/mob/user) +/obj/machinery/power/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, physical_state)) @@ -191,16 +228,18 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/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/pointdefense/proc/space_los(meteor) +/obj/machinery/power/pointdefense/proc/space_los(meteor) for(var/turf/T in getline(src,meteor)) if(T.density) return FALSE return TRUE -/obj/machinery/pointdefense/proc/Shoot(var/weakref/target) +/obj/machinery/power/pointdefense/proc/Shoot(var/weakref/target) var/obj/effect/meteor/M = target.resolve() if(!istype(M)) return @@ -213,7 +252,7 @@ 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) +/obj/machinery/power/pointdefense/proc/finish_shot(var/weakref/target) //Cleanup from list var/obj/machinery/pointdefense_control/PC = get_controller() if(istype(PC)) @@ -224,28 +263,34 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) 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.") + 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/pointdefense/process() +/obj/machinery/power/pointdefense/process() ..() - if(stat & (NOPOWER|BROKEN)) + if(!anchored || 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/pointdefense/proc/find_and_shoot() +/obj/machinery/power/pointdefense/proc/find_and_shoot() if(LAZYLEN(GLOB.meteor_list) == 0) return if(engaging || ((world.time - last_shot) < charge_cooldown)) @@ -279,7 +324,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) Shoot(target) return -/obj/machinery/pointdefense/RefreshParts() +/obj/machinery/power/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) @@ -295,7 +340,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/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/pointdefense/proc/Activate() +/obj/machinery/power/pointdefense/proc/Activate() if(active) return FALSE @@ -305,7 +350,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) update_icon() return TRUE -/obj/machinery/pointdefense/proc/Deactivate() +/obj/machinery/power/pointdefense/proc/Deactivate() if(!active) return FALSE playsound(src, 'sound/machines/apc_nopower.ogg', 50, 0) diff --git a/code/game/objects/items/weapons/circuitboards/machinery/ships.dm b/code/game/objects/items/weapons/circuitboards/machinery/ships.dm index dd37bc2519e..b71e7ce37b9 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/pointdefense - origin_tech = list(TECH_ENGINEERING = 3, TECH_COMBAT = 2) + build_path = /obj/machinery/power/pointdefense + origin_tech = list(TECH_ENGINEERING = 3, TECH_COMBAT = 2, TECH_POWER = 2) req_components = list( /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser = 1, /obj/item/weapon/stock_parts/manipulator = 2, diff --git a/icons/obj/pointdefense.dmi b/icons/obj/pointdefense.dmi index 8b852e69fec8f09ebabde32273c87251ac16d1c6..c0d0e09ffc1d6386d55b6baedc38f821e4ce543b 100644 GIT binary patch literal 8047 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 S#ltxDuL41SVZN;tX3^h)PlV6_