diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 9aece73946cc..07b41a1b2dcb 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -138,10 +138,10 @@ icon_state = "engineering" build_path = /obj/machinery/computer/monitor/secret -/obj/item/circuitboard/computer/sat_control - name = "Satellite Network Control (Computer Board)" +/obj/item/circuitboard/computer/meteor_shield + name = "Meteor Defense Grid Control (Computer Board)" icon_state = "engineering" - build_path = /obj/machinery/computer/sat_control + build_path = /obj/machinery/computer/meteor_shield /obj/item/circuitboard/computer/solar_control name = "Solar Control (Computer Board)" //name fixed 250810 diff --git a/code/modules/cargo/packs/machinery.dm b/code/modules/cargo/packs/machinery.dm index 6e5a12f30f5b..a1f5a9d03052 100644 --- a/code/modules/cargo/packs/machinery.dm +++ b/code/modules/cargo/packs/machinery.dm @@ -219,6 +219,28 @@ crate_name = "laser mining drill crate" crate_type = /obj/structure/closet/crate/engineering +/datum/supply_pack/machinery/meteor_shield + name = "Meteor Shield Kit" + desc = "Contains a control circuit, and four meteor defense turrets. Ideal for the adventerous captain." + cost = 3500 + contains = list( + /obj/machinery/meteor_shield/cargo, + /obj/machinery/meteor_shield/cargo, + /obj/machinery/meteor_shield/cargo, + /obj/machinery/meteor_shield/cargo, + /obj/item/circuitboard/computer/meteor_shield + ) + +/datum/supply_pack/machinery/meteor_shield + name = "Meteor Shield Expansion Kit" + desc = "Contains four meteor defense turrets. Ideal for expanding existing PD grids." + cost = 2500 + contains = list( + /obj/machinery/meteor_shield/cargo, + /obj/machinery/meteor_shield/cargo, + /obj/machinery/meteor_shield/cargo, + /obj/machinery/meteor_shield/cargo, + ) /* Power generation machines diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm index 4c9b3556b6aa..1c188c81ca95 100644 --- a/code/modules/station_goals/shield.dm +++ b/code/modules/station_goals/shield.dm @@ -1,47 +1,119 @@ -//Station Shield -// A chain of satellites encircles the station -// Satellites be actived to generate a shield that will block unorganic matter from passing it. -/datum/station_goal/station_shield - name = "Station Shield" - var/coverage_goal = 500 - -/datum/station_goal/station_shield/get_report() - return {" - The station is located in a zone full of space debris. - We have a prototype shielding system you must deploy to reduce collision-related accidents. - - You can order the satellites and control systems at cargo. - "} - - -/datum/station_goal/station_shield/check_completion() - if(..()) - return TRUE - if(get_coverage() >= coverage_goal) - return TRUE - return FALSE - -/datum/station_goal/proc/get_coverage() - var/list/coverage = list() - for(var/obj/machinery/satellite/meteor_shield/A in GLOB.machines) - if(!A.active) +//It'd be cool if these: +// required a charge to fire + +/obj/machinery/meteor_shield + name = "\improper meteor defense grid" + desc = "" + icon = 'icons/obj/turrets.dmi' + icon_state = "syndie_lethal" + anchored = TRUE + density = TRUE + use_power = FALSE + processing_flags = START_PROCESSING_MANUALLY + subsystem_type = /datum/controller/subsystem/processing/fastprocess + idle_power_usage = 100 + active_power_usage = 1000 + var/id = "" + var/active = TRUE + var/kill_range = 6 + var/fire_delay = 3 SECONDS + COOLDOWN_DECLARE(fire_timer) + +/obj/machinery/meteor_shield/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock) + id = "[REF(port)][id]" + +/obj/machinery/meteor_shield/interact(mob/user) + . = ..() + if(.) + return + if (active) + user.visible_message( + span_notice("[user] deactivated \the [src]."), \ + span_notice("You deactivate \the [src]."), \ + span_hear("The chirps of [src] fade out as it powers down.")) + active = FALSE + STOP_PROCESSING(SSfastprocess, src) + else + if(anchored) + user.visible_message( + span_notice("[user] activated \the [src]."), \ + span_notice("You activate \the [src]."), \ + span_hear("You hear heavy droning.")) + active = TRUE + START_PROCESSING(SSfastprocess, src) + + else + to_chat(user, span_warning("[src] must first be secured to the floor!")) + return + +/obj/machinery/meteor_shield/attackby(obj/item/W, mob/user, params) + if(W.tool_behaviour == TOOL_WRENCH) + if(!anchored && !isinspace()) + W.play_tool_sound(src, 100) + if (W.use_tool(src, user, 20)) + to_chat(user, span_notice("You secure \the [src] to the floor!")) + set_anchored(TRUE) + else if(anchored) + W.play_tool_sound(src, 100) + if (W.use_tool(src, user, 20)) + to_chat(user, span_notice("You unsecure \the [src] from the floor!")) + if(active) + to_chat(user, span_notice("\The [src] shuts off!")) + set_anchored(FALSE) + if(W.tool_behaviour == TOOL_MULTITOOL) + var/a = stripped_input(usr, "Please enter desired ID.", name, id, 20) + if (!a) + return + id = a + . = TRUE + +/obj/machinery/meteor_shield/proc/toggle(mob/user) + if(!anchored) + if(user) + to_chat(user, span_warning("You can only activate [src] while it's secured!.")) + + if(user) + to_chat(user, span_notice("You [active ? "deactivate": "activate"] [src].")) + set_anchored(!anchored) + +/obj/machinery/meteor_shield/update_icon_state() + . = ..() + icon_state = active ? "syndie_lethal" : "syndie_off" + +/obj/machinery/meteor_shield/process() + if(!active) + return + if(COOLDOWN_FINISHED(src, fire_timer)) + for(var/obj/effect/meteor/M in GLOB.meteor_list) + if(M.virtual_z() != virtual_z()) continue - coverage |= view(A.kill_range,A) - return coverage.len + if(get_dist(M,src) > kill_range) + continue + if(!(obj_flags & EMAGGED)) + Beam(get_turf(M),icon_state="sat_beam",time=5,maxdistance=kill_range) + dir = get_dir(src, M) + explosion(M, 0,0,1,5,TRUE,FALSE,3,FALSE,TRUE) + qdel(M) + COOLDOWN_START(src, fire_timer, fire_delay) + return -/obj/machinery/computer/sat_control - name = "satellite control" +/obj/machinery/meteor_shield/cargo + anchored = FALSE + active = FALSE + +/obj/machinery/computer/meteor_shield + name = "Meteor Defense Grid Controller" desc = "Used to control the satellite network." - circuit = /obj/item/circuitboard/computer/sat_control + circuit = /obj/item/circuitboard/computer/meteor_shield var/notice -/obj/machinery/computer/sat_control/ui_interact(mob/user, datum/tgui/ui) +/obj/machinery/computer/meteor_shield/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "SatelliteControl", name) ui.open() -/obj/machinery/computer/sat_control/ui_act(action, params) +/obj/machinery/computer/meteor_shield/ui_act(action, params) . = ..() if(.) return @@ -51,133 +123,21 @@ toggle(text2num(params["id"])) . = TRUE -/obj/machinery/computer/sat_control/proc/toggle(id) - for(var/obj/machinery/satellite/S in GLOB.machines) +/obj/machinery/computer/meteor_shield/proc/toggle(id) + for(var/obj/machinery/meteor_shield/S in GLOB.machines) if(S.id == id && S.virtual_z() == virtual_z()) S.toggle() -/obj/machinery/computer/sat_control/ui_data() +/obj/machinery/computer/meteor_shield/ui_data() var/list/data = list() data["satellites"] = list() - for(var/obj/machinery/satellite/S in GLOB.machines) - data["satellites"] += list(list( - "id" = S.id, - "active" = S.active, - "mode" = S.mode + for(var/obj/machinery/meteor_shield/S in GLOB.machines) + if(id == s.id) + data["satellites"] += list(list( + "id" = S.id, + "active" = S.active, )) data["notice"] = notice - - var/datum/station_goal/station_shield/G = locate() in SSticker.mode.station_goals - if(G) - data["meteor_shield"] = 1 - data["meteor_shield_coverage"] = G.get_coverage() - data["meteor_shield_coverage_max"] = G.coverage_goal return data - - -/obj/machinery/satellite - name = "\improper Defunct Satellite" - desc = "" - icon = 'icons/obj/machines/satellite.dmi' - icon_state = "sat_inactive" - base_icon_state = "sat" - anchored = FALSE - density = TRUE - use_power = FALSE - var/mode = "NTPROBEV0.8" - var/active = FALSE - var/static/gid = 0 - var/id = 0 - -/obj/machinery/satellite/Initialize() - . = ..() - id = gid++ - -/obj/machinery/satellite/interact(mob/user) - toggle(user) - -/obj/machinery/satellite/set_anchored(anchorvalue) - . = ..() - if(isnull(.)) - return //no need to process if we didn't change anything. - active = anchorvalue - if(anchorvalue) - begin_processing() - animate(src, pixel_y = 2, time = 10, loop = -1) - else - end_processing() - animate(src, pixel_y = 0, time = 10) - update_appearance() - -/obj/machinery/satellite/proc/toggle(mob/user) - if(!active && !isinspace()) - if(user) - to_chat(user, "You can only activate [src] in space.") - return FALSE - if(user) - to_chat(user, "You [active ? "deactivate": "activate"] [src].") - set_anchored(!anchored) - -/obj/machinery/satellite/update_icon_state() - icon_state = "[base_icon_state]_[active ? "active" : "inactive"]" - return ..() - -/obj/machinery/satellite/multitool_act(mob/living/user, obj/item/I) - ..() - to_chat(user, "// NTSAT-[id] // Mode : [active ? "PRIMARY" : "STANDBY"] //[(obj_flags & EMAGGED) ? "DEBUG_MODE //" : ""]") - return TRUE - -/obj/machinery/satellite/meteor_shield - name = "\improper Meteor Shield Satellite" - desc = "A meteor point-defense satellite." - mode = "M-SHIELD" - processing_flags = START_PROCESSING_MANUALLY - subsystem_type = /datum/controller/subsystem/processing/fastprocess - var/kill_range = 14 - -/obj/machinery/satellite/meteor_shield/proc/space_los(meteor) - for(var/turf/T in getline(src,meteor)) - if(!isspaceturf(T)) - return FALSE - return TRUE - -/obj/machinery/satellite/meteor_shield/process() - if(!active) - return - for(var/obj/effect/meteor/M in GLOB.meteor_list) - if(M.virtual_z() != virtual_z()) - continue - if(get_dist(M,src) > kill_range) - continue - if(!(obj_flags & EMAGGED) && space_los(M)) - Beam(get_turf(M),icon_state="sat_beam",time=5,maxdistance=kill_range) - qdel(M) - -/obj/machinery/satellite/meteor_shield/toggle(user) - if(!..(user)) - return FALSE - if(obj_flags & EMAGGED) - if(active) - change_meteor_chance(2) - else - change_meteor_chance(0.5) - -/obj/machinery/satellite/meteor_shield/proc/change_meteor_chance(mod) - var/datum/round_event_control/E = locate(/datum/round_event_control/meteor_wave) in SSevents.control - if(E) - E.weight *= mod - -/obj/machinery/satellite/meteor_shield/Destroy() - . = ..() - if(active && (obj_flags & EMAGGED)) - change_meteor_chance(0.5) - -/obj/machinery/satellite/meteor_shield/emag_act(mob/user) - if(obj_flags & EMAGGED) - return - obj_flags |= EMAGGED - to_chat(user, "You access the satellite's debug mode, increasing the chance of meteor strikes.") - if(active) - change_meteor_chance(2)