//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/on_report() //Unlock var/datum/supply_pack/P = SSshuttle.supply_packs[/datum/supply_pack/engineering/shield_sat] P.special_enabled = TRUE P = SSshuttle.supply_packs[/datum/supply_pack/engineering/shield_sat_control] P.special_enabled = TRUE /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 || !is_station_level(A.z)) continue coverage |= view(A.kill_range,A) return coverage.len /obj/machinery/computer/sat_control name = "satellite control" desc = "Used to control the satellite network." circuit = /obj/item/circuitboard/computer/sat_control var/notice /obj/machinery/computer/sat_control/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) ui = new(user, src, ui_key, "sat_control", name, 400, 305, master_ui, state) ui.open() /obj/machinery/computer/sat_control/ui_act(action, params) if(..()) return switch(action) if("toggle") toggle(text2num(params["id"])) . = TRUE /obj/machinery/computer/sat_control/proc/toggle(id) for(var/obj/machinery/satellite/S in GLOB.machines) if(S.id == id && S.z == z) S.toggle() /obj/machinery/computer/sat_control/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 )) 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" 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/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].") active = !active if(active) animate(src, pixel_y = 2, time = 10, loop = -1) anchored = TRUE else animate(src, pixel_y = 0, time = 10) anchored = FALSE update_icon() /obj/machinery/satellite/update_icon() icon_state = active ? "sat_active" : "sat_inactive" /obj/machinery/satellite/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/multitool)) to_chat(user, "// NTSAT-[id] // Mode : [active ? "PRIMARY" : "STANDBY"] //[(obj_flags & EMAGGED) ? "DEBUG_MODE //" : ""]") else return ..() /obj/machinery/satellite/meteor_shield name = "\improper Meteor Shield Satellite" desc = "A meteor point-defense satellite." mode = "M-SHIELD" speed_process = TRUE var/kill_range = 14 /obj/machinery/satellite/meteor_shield/sci name = "\improper Meteor Shield Satellite" desc = "A station made meteor point-defense satellite." mode = "M-SHIELD" /obj/item/disk/meteor name = "Meteor Shield Upgrade Disk" desc = "A floppy disk that allows meteor shields to fire at longer ranges and lowers meteor drawing from gravitational fields.." /obj/machinery/satellite/meteor_shield/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/disk/meteor)) to_chat(user, "The disk uploads better tracking and rang modification software.") kill_range = 17 else return ..() /obj/machinery/satellite/meteor_shield/sci/toggle(user) if(!..(user)) return FALSE if(obj_flags & EMAGGED) if(active) change_meteor_chance(8) else change_meteor_chance(1.25) /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.z != 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(4)