From 4e8e5697546a20154c2efb88f1e37c247c0911ac Mon Sep 17 00:00:00 2001 From: Kyep Date: Mon, 8 Jan 2018 01:16:15 -0800 Subject: [PATCH] Refactor computers, outgoing portal, aicore unpushable --- _maps/map_files/cyberiad/z6.dmm | 6 +- code/game/area/Space Station 13 areas.dm | 13 +- code/game/machinery/computer/depot.dm | 206 ++++++++++++++---- .../modules/mob/living/silicon/decoy/decoy.dm | 1 + 4 files changed, 174 insertions(+), 52 deletions(-) diff --git a/_maps/map_files/cyberiad/z6.dmm b/_maps/map_files/cyberiad/z6.dmm index d8599282c66..ca8b53df27f 100644 --- a/_maps/map_files/cyberiad/z6.dmm +++ b/_maps/map_files/cyberiad/z6.dmm @@ -698,7 +698,7 @@ "nv" = (/obj/effect/landmark/corpse/mime{name = "Mime Pilot"},/turf/simulated/floor/plasteel/airless,/area/space) "nw" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot) "nx" = (/obj/machinery/computer/syndicate_depot/teleporter,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot) -"ny" = (/obj/machinery/light{dir = 1; on = 1},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot) +"ny" = (/obj/machinery/light{dir = 1; on = 1},/obj/effect/decal/warning_stripes/blue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot) "nz" = (/obj/machinery/bluespace_beacon/syndicate,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot) "nA" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot/outer) "nB" = (/obj/machinery/navbeacon/invisible{codes_txt = "patrol;next_patrol=SDSW"; invisibility = 100; location = "SDNW"},/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot/outer) @@ -777,7 +777,7 @@ "oW" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot) "oX" = (/obj/item/candle,/obj/structure/table,/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot) "oY" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot) -"oZ" = (/obj/machinery/computer/syndicate_depot,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot) +"oZ" = (/obj/machinery/computer/syndicate_depot/doors,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot) "pa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot) "pb" = (/obj/effect/spawner/random_spawners/syndicate/trap/mine,/obj/item/stack/sheet/metal{layer = 4.1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot) "pc" = (/obj/machinery/door/poddoor{id_tag = "syndi_depot_rear"; name = "Sealed Doors"; protected = 0},/turf/simulated/floor/plating/airless,/area/syndicate_depot) @@ -1006,7 +1006,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamLnnnmncmLaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacznonpaznpnqmJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHlZlZlZlZmfmflZlZlZlZlZlZlZlZlZlZlZmrmjmimimimimimimimjmymzmrmbmblZlZlZmHmHaaaaaamHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHaaaaaaaamInrnomTnsnsnqmMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalZlZmbmbmrmrmBmAmrmrmrmrmrmCmrmrmrmrmrmrmDmimFmvmimimrmymGmrmrmrmombmblZlZmHmHmHaaaamHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHaaaamHmHmHmHmHntnvnumHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHlZlZmlmbmrmAmAmBmSmAmVmrmrnhnjninwnlmrmrmrmrmrmrmrmymrminynxnzmrmbmbmblZlZmHmHmHaamHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmImImHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHlZmbnBnAmrmVnCmBmAmAnDmyminjnhnjnwmimymimimimumimimimrmimimimimrmsmblZlZlZaaaamHmHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmImImHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHlZmbnBnAmrmVnCmBmAmAnDmyminjnhnjnwmimymimimimumimimimrmiminSmimrmsmblZlZlZaaaamHmHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHlZmbmbmbmrmrmrnEnFmimrmrminhnjmrmrmymrminGminHmiminImrminlminlmrmbmblZlZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmImIaaaaczmKmKmLmLmKmKmKmKmJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHlZlZmbmomrmimimimimimrmrmrmrmrmrnJmimrnInImimimiminImrmynKmrmrmrmbmblZlZaaaamHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmIczmKmNmImOazazmPmPmQazmRdlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHlZlZmbmbmrmimimimimimrnHnLnImrnLmimimrmrnMmrmrmymrmrmrminOnNmvmrmbmblZlZlZmHmHaaaaaaaaaaaaaaaaaakVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index c82a563c8de..ac15eb97bbc 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -612,8 +612,7 @@ var/list/ghostteleportlocs = list() /area/syndicate_depot/proc/locker_looted() something_looted = TRUE if(on_peaceful) - peaceful_mode(FALSE) - increase_alert("Nobody steals from the Syndicate!") + increase_alert("Thieves!") /area/syndicate_depot/proc/saw_mech() if(detected_mech) @@ -632,6 +631,9 @@ var/list/ghostteleportlocs = list() L.locked = 1 L.req_access = list(access_syndicate_leader) L.update_icon() + for(var/obj/machinery/computer/syndicate_depot/teleporter/P in src) + if(!P.portal_enabled) + P.toggle_portal() else for(var/obj/machinery/door/airlock/A in src) A.req_access_txt = "[access_syndicate_leader]" @@ -671,6 +673,7 @@ var/list/ghostteleportlocs = list() if(called_backup || used_self_destruct) return called_backup = TRUE + lockout_computers() if(!silent) announce_here("Depot Code RED", reason) for(var/obj/machinery/door/poddoor/P in airlocks) @@ -690,6 +693,8 @@ var/list/ghostteleportlocs = list() used_self_destruct = TRUE local_alarm("", TRUE) activate_lockdown(TRUE) + lockout_computers() + updateicon() if(containment_failure) announce_here("Depot Code DELTA", reason) else @@ -722,6 +727,10 @@ var/list/ghostteleportlocs = list() if(A.density) A.lock() +/area/syndicate_depot/proc/lockout_computers() + for(var/obj/machinery/computer/syndicate_depot/C in src) + C.activate_security_lockout() + /area/syndicate_depot/proc/toggle_door_locks() for(var/obj/machinery/door/airlock/A in src) A.emergency = !A.emergency diff --git a/code/game/machinery/computer/depot.dm b/code/game/machinery/computer/depot.dm index 724190e35d7..efa37efb8ff 100644 --- a/code/game/machinery/computer/depot.dm +++ b/code/game/machinery/computer/depot.dm @@ -3,44 +3,61 @@ #define DEPOT_VISITOR_END 2 #define DEPOT_VISITOR_ADD 3 + +// Generic parent depot computer type + /obj/machinery/computer/syndicate_depot - name = "depot door control computer" + name = "depot computer" icon = 'icons/obj/computer.dmi' icon_keyboard = "syndie_key" icon_screen = "tcboss" light_color = LIGHT_COLOR_PURE_CYAN req_access = list(access_syndicate) - var/activated = FALSE + var/security_lockout = FALSE var/sound_yes = 'sound/machines/twobeep.ogg' var/sound_no = 'sound/machines/buzz-sigh.ogg' var/sound_click = 'sound/machines/click.ogg' var/area/syndicate_depot/depotarea var/alerts_when_broken = TRUE + /obj/machinery/computer/syndicate_depot/New() . = ..() depotarea = areaMaster -/obj/machinery/computer/syndicate_depot/attack_ai(var/mob/user as mob) - if(req_access.len) +/obj/machinery/computer/syndicate_depot/attack_ai(var/mob/user) + if(req_access.len && !("syndicate" in user.faction)) to_chat(user, "A firewall blocks your access.") return 1 - ..() + return ..() /obj/machinery/computer/syndicate_depot/emp_act(severity) return -/obj/machinery/computer/syndicate_depot/attackby(I as obj, user as mob, params) - if(istype(I,/obj/item/weapon/card/emag)) - to_chat(user, "The electronic systems in this console is far too advanced for your primitive hacking peripherals.") - else - return attack_hand(user) +/obj/machinery/computer/syndicate_depot/emag_act(var/mob/user) + to_chat(user, "The electronic systems in this console are far too advanced for your primitive hacking peripherals.") + return /obj/machinery/computer/syndicate_depot/allowed(var/mob/user) - if(user.can_admin_interact()) + if(user.can_advanced_admin_interact()) return 1 + if(!isliving(user)) + return 0 + if(has_security_lockout(user)) + return 0 return ..() +/obj/machinery/computer/syndicate_depot/proc/has_security_lockout(var/mob/user) + if(security_lockout) + playsound(user, 'sound/machines/buzz-sigh.ogg', 50, 0) + to_chat(user, "[src] is under security lockout.") + return TRUE + return FALSE + +/obj/machinery/computer/syndicate_depot/proc/activate_security_lockout() + security_lockout = TRUE + disable_special_functions() + /obj/machinery/computer/syndicate_depot/attack_hand(var/mob/user as mob) if(..()) return @@ -59,7 +76,11 @@ /obj/machinery/computer/syndicate_depot/set_broken() . = ..() if(alerts_when_broken) - raise_alert("[src] destroyed.") + raise_alert("[src] damaged.") + disable_special_functions() + +/obj/machinery/computer/syndicate_depot/proc/disable_special_functions() + return /obj/machinery/computer/syndicate_depot/Topic(href, href_list) if(..()) @@ -74,30 +95,25 @@ updateUsrDialog() return -/obj/machinery/computer/syndicate_depot/proc/summon() - var/area/syndicate_depot/A = areaMaster - if(A) - A.call_backup(src) - /obj/machinery/computer/syndicate_depot/Destroy() - summon() + disable_special_functions() + if(alerts_when_broken) + raise_alert("[src] destroyed.") return ..() + /obj/machinery/computer/syndicate_depot/proc/get_menu(var/mob/user) - return {"Syndicate Depot Door Control Computer
-

Toggle Airlocks -

Toggle Hidden Doors -
"} + return "" /obj/machinery/computer/syndicate_depot/proc/primary(var/mob/user) - if(depotarea) - depotarea.toggle_door_locks(src) - to_chat(user, "Door locks toggled.") + if(!allowed(user)) + return 1 + return 0 /obj/machinery/computer/syndicate_depot/proc/secondary(var/mob/user, var/subcommand) - if(depotarea) - depotarea.toggle_falsewalls(src) - to_chat(user, "False walls toggled.") + if(!allowed(user)) + return 1 + return 0 /obj/machinery/computer/syndicate_depot/proc/raise_alert(var/reason) if(depotarea) @@ -105,6 +121,34 @@ +// Door Control Computer + +/obj/machinery/computer/syndicate_depot/doors + name = "depot door control computer" + +/obj/machinery/computer/syndicate_depot/doors/get_menu(var/mob/user) + return {"Syndicate Depot Door Control Computer
+

Toggle Airlocks +

Toggle Hidden Doors +
"} + +/obj/machinery/computer/syndicate_depot/doors/primary(var/mob/user) + if(..()) + return + if(depotarea) + depotarea.toggle_door_locks(src) + to_chat(user, "Door locks toggled.") + +/obj/machinery/computer/syndicate_depot/doors/secondary(var/mob/user, var/subcommand) + if(..()) + return + if(depotarea) + depotarea.toggle_falsewalls(src) + to_chat(user, "False walls toggled.") + + +// Engineering AKA self destruct computer, no useful functions, just a trap for the people who can't resist pushing dangerous-sounding buttons. + /obj/machinery/computer/syndicate_depot/selfdestruct name = "reactor control computer" icon_screen = "explosive" @@ -116,25 +160,31 @@
"} /obj/machinery/computer/syndicate_depot/selfdestruct/primary(var/mob/user) - if(activated) + if(..()) + return + if(depotarea.used_self_destruct) playsound(user, sound_no, 50, 0) return - activated = TRUE playsound(user, sound_click, 20, 1) if(depotarea) depotarea.activate_self_destruct("Fusion reactor containment failure. All hands, evacuate. All hands, evacuate. Core breach imminent!", TRUE, user) +// Syndicate comms computer, used to activate visitor mode, and message syndicate. Traitor-only use. /obj/machinery/computer/syndicate_depot/syndiecomms name = "syndicate communications computer" icon_screen = "syndishuttle" req_access = list() + var/message_sent = FALSE /obj/machinery/computer/syndicate_depot/syndiecomms/get_menu(var/mob/user) var/menu = "Syndicate Communications Relay
" - menu += "

Contact Syndicate Command" + if(message_sent) + menu += "

Communications quota used. Unable to transmit messages at this time." + else + menu += "

Contact Syndicate Command (one-time use)" if(depotarea.on_peaceful) if(user in depotarea.peaceful_visitors) menu += "

[user] is recognized as a friendly visitor to the depot." @@ -147,15 +197,17 @@ return menu /obj/machinery/computer/syndicate_depot/syndiecomms/primary(var/mob/user) - if(activated) - playsound(user, 'sound/machines/buzz-sigh.ogg', 50, 0) - to_chat(user, "[src] is under security lockout.") + if(..()) return - activated = TRUE + if(message_sent) + playsound(user, 'sound/machines/buzz-sigh.ogg', 50, 0) + to_chat(user, "[src] has already been used to transmit a message to the Syndicate.") + return + message_sent = TRUE if(user.mind && user.mind.special_role == SPECIAL_ROLE_TRAITOR) - var/input = stripped_input(user, "Please choose a message to transmit to Syndicate HQ via quantum entanglement. Transmission does not guarantee a response. This terminal may only be used ONCE.", "To abort, send an empty message.", "") as text|null + var/input = stripped_input(user, "Please choose a message to transmit to Syndicate HQ via quantum entanglement. Transmission does not guarantee a response. This function may only be used ONCE.", "To abort, send an empty message.", "") as text|null if(!input) - activated = FALSE + message_sent = FALSE return Syndicate_announce(input, user) to_chat(user, "Message transmitted.") @@ -165,9 +217,9 @@ raise_alert("Detected unauthorized access to [src]!") /obj/machinery/computer/syndicate_depot/syndiecomms/secondary(var/mob/user, var/subcommand) - if(activated) - playsound(user, 'sound/machines/buzz-sigh.ogg', 50, 0) - to_chat(user, "[src] is under security lockout.") + if(..()) + return + if(has_security_lockout(user)) return if(depotarea) if(depotarea.local_alarm || depotarea.called_backup || depotarea.used_self_destruct) @@ -196,7 +248,7 @@ else to_chat(user, "[src]: Unrecognized subcommand: [subcommand]") else - to_chat(user, "[src]: Request denied. Unable to uplink to depot AI core.") + to_chat(user, "[src]: Request denied. Unable to uplink to depot network.") /obj/machinery/computer/syndicate_depot/syndiecomms/proc/grant_syndie_faction(var/mob/user) user.faction += "syndicate" @@ -205,44 +257,104 @@ /obj/machinery/computer/syndicate_depot/syndiecomms/power_change() . = ..() - if(!activated && (stat & NOPOWER)) - activated = TRUE + if(!security_lockout && (stat & NOPOWER)) + security_lockout = TRUE raise_alert("Powergrid failure.") + +// Syndicate teleporter control, used to manage incoming/outgoing teleports + /obj/machinery/computer/syndicate_depot/teleporter name = "syndicate teleporter console" icon_screen = "telesci" icon_keyboard = "teleport_key" var/obj/machinery/bluespace_beacon/syndicate/mybeacon + var/turf/tele_target + var/tele_area + var/obj/effect/portal/myportal + var/portal_enabled = FALSE + var/portaldir = WEST /obj/machinery/computer/syndicate_depot/teleporter/New() . = ..() spawn(10) findbeacon() + choosetarget() + update_portal() + +/obj/machinery/computer/syndicate_depot/teleporter/disable_special_functions() + if(mybeacon) + if(mybeacon.enabled) + mybeacon.toggle() + if(portal_enabled) + portal_enabled = FALSE + update_portal() /obj/machinery/computer/syndicate_depot/teleporter/proc/findbeacon() if(mybeacon) return TRUE for(var/obj/machinery/bluespace_beacon/syndicate/B in myArea) mybeacon = B - playsound(loc, sound_yes, 50, 0) return TRUE - playsound(loc, sound_no, 50, 0) return FALSE +/obj/machinery/computer/syndicate_depot/teleporter/proc/choosetarget() + var/list/possible_lms = list() + for(var/obj/effect/landmark/L in landmarks_list) + if(!is_station_level(L.z)) + continue + possible_lms |= L + if(!possible_lms.len) + message_admins("Error: [src] could not find any station LMs") + return + var/obj/effect/landmark/selected_lm = pick(possible_lms) + tele_area = get_area(selected_lm) + tele_target = get_turf(selected_lm) + +/obj/machinery/computer/syndicate_depot/teleporter/proc/update_portal() + if(portal_enabled && !myportal) + if(!tele_target) + return + var/turf/portal_turf = get_step(src, portaldir) + var/obj/effect/portal/P = new(portal_turf, tele_target, src, 0) + myportal = P + P.failchance = 0 + P.icon_state = "portal1" + P.name = "[tele_area] portal" + else if(!portal_enabled && myportal) + qdel(myportal) + /obj/machinery/computer/syndicate_depot/teleporter/get_menu(var/mob/user) var/menutext = "Syndicate Teleporter Control
" findbeacon() if(mybeacon) - menutext += {"

Syndicate Teleporter Beacon: [mybeacon.enabled ? "ON" : "OFF"]
"} + menutext += {"

(SYNDIE AGENT) Syndicate Teleporter Beacon: [mybeacon.enabled ? "ON" : "OFF"]
"} else menutext += {"

Status: Reconnecting to beacon..."} + if(check_rights(R_ADMIN, 0, user)) + menutext += {"

(ADMIN/DEBUG) Syndicate Agent Insertion Portal: [portal_enabled ? "ON" : "OFF"]
"} return menutext /obj/machinery/computer/syndicate_depot/teleporter/primary(var/mob/user) - activated = TRUE + if(..()) + return if(!mybeacon && user) to_chat(user, "Unable to connect to teleport beacon.") return var/bresult = mybeacon.toggle() to_chat(user, "Syndicate Teleporter Beacon: [bresult ? "ONLINE" : "OFFLINE"]") + +/obj/machinery/computer/syndicate_depot/teleporter/secondary(var/mob/user) + if(..()) + return + if(!check_rights(R_ADMIN, 0, user)) + return + if(!portal_enabled && myportal) + to_chat(user, "Syndicate Agent Insertion Portal: deactivating... please wait...") + return + toggle_portal() + to_chat(user, "Syndicate Agent Insertion Portal: [portal_enabled ? "ONLINE" : "OFFLINE"]") + +/obj/machinery/computer/syndicate_depot/teleporter/proc/toggle_portal() + portal_enabled = !portal_enabled + update_portal() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/decoy/decoy.dm b/code/modules/mob/living/silicon/decoy/decoy.dm index c0b79d13367..76f81ac47ae 100644 --- a/code/modules/mob/living/silicon/decoy/decoy.dm +++ b/code/modules/mob/living/silicon/decoy/decoy.dm @@ -4,6 +4,7 @@ icon_state = "ai" anchored = 1 // -- TLE canmove = 0 + a_intent = "harm" // This is apparently the only thing that stops other mobs walking through them as if they were thin air. /mob/living/silicon/decoy/New() src.icon = 'icons/mob/AI.dmi'