Revert "12/21 modernizations from TG live"

This commit is contained in:
LetterJay
2016-12-22 22:35:44 -06:00
committed by GitHub
parent cf59ac1c3d
commit ae40d4134e
2215 changed files with 86928 additions and 707332 deletions
+197 -284
View File
@@ -47,10 +47,7 @@
icon_state = "apc0"
anchored = 1
use_power = 0
req_access = null
obj_integrity = 200
max_integrity = 200
integrity_failure = 50
req_access = list(access_engine_equip)
var/area/area
var/areastring = null
var/obj/item/weapon/stock_parts/cell/cell
@@ -83,20 +80,18 @@
var/overload = 1 //used for the Blackout malf module
var/beenhit = 0 // used for counting how many times it has been hit, used for Aliens at the moment
var/mob/living/silicon/ai/occupier = null
var/transfer_in_progress = FALSE //Is there an AI being transferred out of us?
var/longtermpower = 10
var/auto_name = 0
var/failure_timer = 0
var/force_update = 0
var/update_state = -1
var/update_overlay = -1
var/global/status_overlays = 0
var/updating_icon = 0
var/global/list/status_overlays_lock
var/global/list/status_overlays_charging
var/global/list/status_overlays_equipment
var/global/list/status_overlays_lighting
var/global/list/status_overlays_environ
var/health = 50
/obj/machinery/power/apc/connect_to_network()
//Override because the APC does not directly connect to the network; it goes through a terminal.
@@ -107,10 +102,6 @@
terminal.connect_to_network()
/obj/machinery/power/apc/New(turf/loc, var/ndir, var/building=0)
if (!req_access)
req_access = list(access_engine_equip)
if (!armor)
armor = list(melee = 20, bullet = 20, laser = 10, energy = 100, bomb = 30, bio = 100, rad = 100, fire = 90, acid = 50)
..()
apcs_list += src
@@ -123,18 +114,21 @@
setDir(SOUTH)
if(auto_name)
name = "\improper [get_area(src)] APC"
name = "[get_area(src)] APC"
pixel_x = (src.tdir & 3)? 0 : (src.tdir == 4 ? 24 : -24)
pixel_y = (src.tdir & 3)? (src.tdir ==1 ? 24 : -24) : 0
if (building)
if (building==0)
init()
else
area = src.loc.loc:master
opened = 1
operating = 0
name = "[area.name] APC"
stat |= MAINT
src.update_icon()
addtimer(src, "update", 5)
spawn(5)
src.update()
/obj/machinery/power/apc/Destroy()
apcs_list -= src
@@ -153,14 +147,7 @@
qdel(cell)
if(terminal)
disconnect_terminal()
. = ..()
/obj/machinery/power/apc/handle_atom_del(atom/A)
if(A == cell)
cell = null
update_icon()
update_icon()
updateUsrDialog()
return ..()
/obj/machinery/power/apc/proc/make_terminal()
// create a terminal object at the same position as original turf loc
@@ -169,7 +156,7 @@
terminal.setDir(tdir)
terminal.master = src
/obj/machinery/power/apc/initialize()
/obj/machinery/power/apc/proc/init()
has_electronics = 2 //installed and secured
// is starting with a power cell installed, create it and set its charge level
if(cell_type)
@@ -183,22 +170,24 @@
if(isarea(A) && src.areastring == null)
src.area = A
else
src.area = get_area_by_name(areastring)
src.area = get_area_name(areastring)
update_icon()
make_terminal()
addtimer(src, "update", 5)
spawn(5)
src.update()
/obj/machinery/power/apc/examine(mob/user)
..()
if(stat & BROKEN)
user << "Looks broken."
return
if(opened)
if(has_electronics && terminal)
user << "The cover is [opened==2?"removed":"open"] and the power cell is [ cell ? "installed" : "missing"]."
else
user << "It's [ !terminal ? "not" : "" ] wired up."
user << "It's [!terminal?" not":""]wired up."
user << "The electronics are[!has_electronics?"n't":""] installed."
else
@@ -215,11 +204,17 @@
/obj/machinery/power/apc/update_icon()
if (!status_overlays)
status_overlays = 1
status_overlays_lock = new(2)
status_overlays_charging = new(3)
status_overlays_equipment = new(4)
status_overlays_lighting = new(4)
status_overlays_environ = new(4)
status_overlays_lock = new
status_overlays_charging = new
status_overlays_equipment = new
status_overlays_lighting = new
status_overlays_environ = new
status_overlays_lock.len = 2
status_overlays_charging.len = 3
status_overlays_equipment.len = 4
status_overlays_lighting.len = 4
status_overlays_environ.len = 4
status_overlays_lock[1] = image(icon, "apcox-0") // 0=blue 1=red
status_overlays_lock[2] = image(icon, "apcox-1")
@@ -273,20 +268,18 @@
if(!(update_state & UPSTATE_ALLGOOD))
if(overlays.len)
cut_overlays()
overlays = 0
if(update & 2)
if(overlays.len)
cut_overlays()
overlays.len = 0
if(!(stat & (BROKEN|MAINT)) && update_state & UPSTATE_ALLGOOD)
var/list/O = list(
status_overlays_lock[locked+1],
status_overlays_charging[charging+1])
add_overlay(status_overlays_lock[locked+1])
add_overlay(status_overlays_charging[charging+1])
if(operating)
O += status_overlays_equipment[equipment+1]
O += status_overlays_lighting[lighting+1]
O += status_overlays_environ[environ+1]
add_overlay(O)
add_overlay(status_overlays_equipment[equipment+1])
add_overlay(status_overlays_lighting[lighting+1])
add_overlay(status_overlays_environ[environ+1])
/obj/machinery/power/apc/proc/check_updates()
@@ -361,68 +354,51 @@
// Used in process so it doesn't update the icon too much
/obj/machinery/power/apc/proc/queue_icon_update()
addtimer(src, "update_icon", APC_UPDATE_ICON_COOLDOWN, TIMER_UNIQUE)
if(!updating_icon)
updating_icon = 1
// Start the update
spawn(APC_UPDATE_ICON_COOLDOWN)
update_icon()
updating_icon = 0
//attack with an item - open/close cover, insert cell, or (un)lock interface
/obj/machinery/power/apc/attackby(obj/item/W, mob/living/user, params)
if(issilicon(user) && get_dist(src,user)>1)
if (istype(user, /mob/living/silicon) && get_dist(src,user)>1)
return src.attack_hand(user)
if (istype(W, /obj/item/weapon/crowbar)) //Using crowbar
if (opened) // a) on open apc
if (has_electronics==1)
if (terminal)
user << "<span class='warning'>Disconnect the wires first!</span>"
return
playsound(src.loc, W.usesound, 50, 1)
user << "<span class='notice'>You are trying to remove the power control board...</span>" //lpeters - fixed grammar issues
if(do_after(user, 50*W.toolspeed, target = src))
if (has_electronics==1)
has_electronics = 0
if (stat & BROKEN)
user.visible_message(\
"[user.name] has broken the power control board inside [src.name]!",\
"<span class='notice'>You break the charred power control board and remove the remains.</span>",
"<span class='italics'>You hear a crack.</span>")
return
//ticker.mode:apcs-- //XSI said no and I agreed. -rastaf0
else if (emagged) // We emag board, not APC's frame
emagged = 0
user.visible_message(\
"[user.name] has discarded emaged power control board from [src.name]!",\
"<span class='notice'>You discarded shorten board.</span>")
return
else if (malfhack) // AI hacks board, not APC's frame
user.visible_message(\
"[user.name] has discarded strangely programmed power control board from [src.name]!",\
"<span class='notice'>You discarded strangely programmed board.</span>")
malfai = null
malfhack = 0
return
else
user.visible_message(\
"[user.name] has removed the power control board from [src.name]!",\
"<span class='notice'>You remove the power control board.</span>")
new /obj/item/weapon/electronics/apc(loc)
return
else if (opened!=2) //cover isn't removed
opened = 0
coverlocked = 1 //closing cover relocks it
update_icon()
if (istype(W, /obj/item/weapon/crowbar) && opened)
if (has_electronics==1)
if (terminal)
user << "<span class='warning'>Disconnect the wires first!</span>"
return
else if (!(stat & BROKEN)) // b) on closed and not broken APC
if(coverlocked && !(stat & MAINT)) // locked...
user << "<span class='warning'>The cover is locked and cannot be opened!</span>"
return
else if (panel_open) // wires are exposed
user << "<span class='warning'>Exposed wires prevents you from opening it!</span>"
return
else
opened = 1
update_icon()
return
playsound(src.loc, W.usesound, 50, 1)
user << "<span class='notice'>You are trying to remove the power control board...</span>" //lpeters - fixed grammar issues
if(do_after(user, 50/W.toolspeed, target = src))
if (has_electronics==1)
has_electronics = 0
if ((stat & BROKEN) || malfhack)
user.visible_message(\
"[user.name] has broken the power control board inside [src.name]!",\
"<span class='notice'>You break the charred power control board and remove the remains.</span>",
"<span class='italics'>You hear a crack.</span>")
//ticker.mode:apcs-- //XSI said no and I agreed. -rastaf0
else
user.visible_message(\
"[user.name] has removed the power control board from [src.name]!",\
"<span class='notice'>You remove the power control board.</span>")
new /obj/item/weapon/electronics/apc(loc)
else if (opened!=2) //cover isn't removed
opened = 0
update_icon()
else if (istype(W, /obj/item/weapon/crowbar) && !((stat & BROKEN) || malfhack) )
if(coverlocked && !(stat & MAINT))
user << "<span class='warning'>The cover is locked and cannot be opened!</span>"
return
else
opened = 1
update_icon()
else if (istype(W, /obj/item/weapon/stock_parts/cell) && opened) // trying to put a cell inside
if(cell)
user << "<span class='warning'>There is a power cell already installed!</span>"
@@ -433,21 +409,20 @@
return
if(!user.drop_item())
return
W.forceMove(src)
W.loc = src
cell = W
user.visible_message(\
"[user.name] has inserted the power cell to [src.name]!",\
"<span class='notice'>You insert the power cell.</span>")
chargecount = 0
update_icon()
else if (istype(W, /obj/item/weapon/screwdriver)) // haxing
if(opened)
if (cell)
user << "<span class='warning'>Close the APC first!</span>" //Less hints more mystery!
return
else
if (has_electronics==1)
if (has_electronics==1 && terminal)
has_electronics = 2
stat &= ~MAINT
playsound(src.loc, W.usesound, 50, 1)
@@ -478,28 +453,16 @@
else if(stat & (BROKEN|MAINT))
user << "<span class='warning'>Nothing happens!</span>"
else
if(allowed(usr) && !wires.is_cut(WIRE_IDSCAN) && !malfhack)
if(allowed(usr) && !wires.is_cut(WIRE_IDSCAN))
locked = !locked
user << "<span class='notice'>You [ locked ? "lock" : "unlock"] the APC interface.</span>"
update_icon()
else
user << "<span class='warning'>Access denied.</span>"
else if (istype(W, /obj/item/stack/cable_coil) && opened)
var/turf/host_turf = get_turf(src)
if(!host_turf)
throw EXCEPTION("attackby on APC when it's not on a turf")
return
if (host_turf.intact)
else if (istype(W, /obj/item/stack/cable_coil) && !terminal && opened && has_electronics!=2)
if (src.loc:intact)
user << "<span class='warning'>You must remove the floor plating in front of the APC first!</span>"
return
else if (terminal) // it already have terminal
user << "<span class='warning'>This APC is already wired!</span>"
return
else if (has_electronics == 0)
user << "<span class='warning'>There is nothing to wire!</span>"
return
var/obj/item/stack/cable_coil/C = W
if(C.get_amount() < 10)
user << "<span class='warning'>You need ten lengths of cable for APC!</span>"
@@ -508,12 +471,10 @@
"<span class='notice'>You start adding cables to the APC frame...</span>")
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
if(do_after(user, 20, target = src))
if (C.get_amount() < 10 || !C)
return
if (C.get_amount() >= 10 && !terminal && opened && has_electronics > 0)
if (C.amount >= 10 && !terminal && opened && has_electronics != 2)
var/turf/T = get_turf(src)
var/obj/structure/cable/N = T.get_cable_node()
if (prob(50) && electrocute_mob(usr, N, N, 1, TRUE))
if (prob(50) && electrocute_mob(usr, N, N))
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
@@ -522,28 +483,21 @@
user << "<span class='notice'>You add cables to the APC frame.</span>"
make_terminal()
terminal.connect_to_network()
else if (istype(W, /obj/item/weapon/wirecutters) && terminal && opened && has_electronics!=2)
terminal.dismantle(user)
else if (istype(W, /obj/item/weapon/wirecutters) && terminal && opened)
terminal.dismantle(user, W)
else if (istype(W, /obj/item/weapon/electronics/apc) && opened)
if (has_electronics!=0) // there are already electronicks inside
user << "<span class='warning'>You cannot put the board inside, there already is one!</span>"
return
else if (stat & BROKEN)
user << "<span class='warning'>You cannot put the board inside, the frame is damaged!</span>"
return
else if (istype(W, /obj/item/weapon/electronics/apc) && opened && has_electronics==0 && !((stat & BROKEN) || malfhack))
user.visible_message("[user.name] inserts the power control board into [src].", \
"<span class='notice'>You start to insert the power control board into the frame...</span>")
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
if(do_after(user, 10, target = src))
if(has_electronics==0)
has_electronics = 1
locked = 1 //We placed new, locked board in
user << "<span class='notice'>You place the power control board inside the frame.</span>"
qdel(W)
else if (istype(W, /obj/item/weapon/electronics/apc) && opened && has_electronics==0 && ((stat & BROKEN) || malfhack))
user << "<span class='warning'>You cannot put the board inside, the frame is damaged!</span>"
return
else if (istype(W, /obj/item/weapon/weldingtool) && opened && has_electronics==0 && !terminal)
var/obj/item/weapon/weldingtool/WT = W
if (WT.get_fuel() < 3)
@@ -552,10 +506,10 @@
user.visible_message("[user.name] welds [src].", \
"<span class='notice'>You start welding the APC frame...</span>", \
"<span class='italics'>You hear welding.</span>")
playsound(src.loc, WT.usesound, 50, 1)
if(do_after(user, 50*W.toolspeed, target = src))
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
if(do_after(user, 50/W.toolspeed, target = src))
if(!src || !WT.remove_fuel(3, user)) return
if ((stat & BROKEN) || opened==2)
if (emagged || malfhack || (stat & BROKEN) || opened==2)
new /obj/item/stack/sheet/metal(loc)
user.visible_message(\
"[user.name] has cut [src] apart with [W].",\
@@ -567,20 +521,16 @@
"<span class='notice'>You cut the APC frame from the wall.</span>")
qdel(src)
return
else if (istype(W, /obj/item/wallframe/apc) && opened)
if (!(stat & BROKEN || opened==2 || obj_integrity < max_integrity)) // There is nothing to repair
user << "<span class='warning'>You found no reason for repairing this APC</span>"
return
if (!(stat & BROKEN) && opened==2) // Cover is the only thing broken, we do not need to remove elctronicks to replace cover
user.visible_message("[user.name] replaces missing APC's cover.",\
"<span class='notice'>You begin to replace APC's cover...</span>")
if(do_after(user, 20, target = src)) // replacing cover is quicker than replacing whole frame
user << "<span class='notice'>You replace missing APC's cover.</span>"
qdel(W)
opened = 1
update_icon()
return
else if (istype(W, /obj/item/wallframe/apc) && opened && emagged)
emagged = 0
if (opened==2)
opened = 1
user.visible_message(\
"[user.name] has replaced the damaged APC frontal panel with a new one.",\
"<span class='notice'>You replace the damaged APC frontal panel with a new one.</span>")
qdel(W)
update_icon()
else if (istype(W, /obj/item/wallframe/apc) && opened && ((stat & BROKEN) || malfhack))
if (has_electronics)
user << "<span class='warning'>You cannot repair this APC until you remove the electronics still inside!</span>"
return
@@ -590,30 +540,24 @@
user << "<span class='notice'>You replace the damaged APC frame with a new one.</span>"
qdel(W)
stat &= ~BROKEN
obj_integrity = max_integrity
malfai = null
malfhack = 0
if (opened==2)
opened = 1
update_icon()
else if(panel_open && !opened && is_wire_tool(W))
wires.interact(user)
else
return ..()
/obj/machinery/power/apc/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
if(damage_flag == "melee" && damage_amount < 15 && (!(stat & BROKEN) || malfai))
return 0
. = ..()
/obj/machinery/power/apc/obj_break(damage_flag)
if(!(flags & NODECONSTRUCT))
set_broken()
/obj/machinery/power/apc/deconstruct(disassembled = TRUE)
if(!(flags & NODECONSTRUCT))
if(!(stat & BROKEN))
set_broken()
if(opened != 2)
/obj/machinery/power/apc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
..()
if((malfhack || (stat & BROKEN)) && !opened)
if(damage < 10)
return
health -= damage
if(health <= 0)
opened = 2
visible_message("<span class='warning'>The APC cover is knocked down!</span>")
update_icon()
@@ -654,24 +598,39 @@
..()
/obj/machinery/power/apc/attack_alien(mob/living/carbon/alien/humanoid/user)
if(malfhack)
return
..()
if(malfhack || (stat & BROKEN))
return
if(opened == 0)
if(!panel_open)
panel_open = 1
update_icon()
visible_message("<span class='danger'>The [src.name]'s cover flies open, exposing the wires!</span>")
else if(panel_open && !wires.is_all_cut())
wires.cut_all()
update_icon()
visible_message("<span class='danger'>The [src.name]'s wires are shredded!</span>")
else if(opened == 1)
if(cell)
cell.loc = user.loc
cell.updateicon()
cell = null
visible_message("<span class='danger'>The [src.name]'s power cell flies off!</span>")
charging = 0
update_icon()
/obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
datum/tgui/master_ui = null, datum/ui_state/state = default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "apc", name, 535, 515, master_ui, state)
ui.open()
if(ui)
ui.set_autoupdate(state = (failure_timer ? 1 : 0))
/obj/machinery/power/apc/ui_data(mob/user)
var/list/data = list(
"locked" = locked,
"failTime" = failure_timer,
"isOperating" = operating,
"externalPower" = main_status,
"powerCellStatus" = cell ? cell.percent() : null,
@@ -736,7 +695,7 @@
return "[area.name] : [equipment]/[lighting]/[environ] ([lastused_equip+lastused_light+lastused_environ]) : [cell? cell.percent() : "N/C"] ([charging])"
/obj/machinery/power/apc/proc/update()
if(operating && !shorted && !failure_timer)
if(operating && !shorted)
area.power_light = (lighting > 1)
area.power_equip = (equipment > 1)
area.power_environ = (environ > 1)
@@ -771,7 +730,7 @@
return TRUE
/obj/machinery/power/apc/ui_act(action, params)
if(..() || !can_use(usr, 1) || (locked && !usr.has_unlimited_silicon_privilege && !failure_timer))
if(..() || !can_use(usr, 1) || (locked && !usr.has_unlimited_silicon_privilege))
return
switch(action)
if("lock")
@@ -821,11 +780,6 @@
if("deoccupy")
if(get_malf_status(usr))
malfvacate()
if("reboot")
failure_timer = 0
update_icon()
update()
return 1
/obj/machinery/power/apc/proc/toggle_breaker()
operating = !operating
@@ -842,11 +796,25 @@
return
malf << "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process."
malf.malfhack = src
malf.malfhacking = addtimer(malf, "malfhacked", 600, TIMER_NORMAL, src)
malf.malfhacking = TRUE
addtimer(src, "malfhacked", 600, FALSE, malf)
var/obj/screen/alert/hackingapc/A
A = malf.throw_alert("hackingapc", /obj/screen/alert/hackingapc)
A.target = src
/obj/machinery/power/apc/proc/malfhacked(mob/living/silicon/ai/malf)
if(!istype(malf))
return
malf.malfhack = null
malf.malfhacking = FALSE
if(src && !src.aidisabled)
malf.malf_picker.processing_time += 10
malfai = malf.parent || malf
malfhack = TRUE
locked = TRUE
malf << "Hack complete. The APC is now under your exclusive control."
update_icon()
else
malf << "Hack aborted. The designated APC has stopped responding and no longer exists on the power network."
/obj/machinery/power/apc/proc/malfoccupy(mob/living/silicon/ai/malf)
if(!istype(malf))
@@ -859,96 +827,50 @@
return
if(src.z != 1)
return
occupier = new /mob/living/silicon/ai(src,malf.laws,null,1) //DEAR GOD WHY?
occupier.adjustOxyLoss(malf.getOxyLoss())
if(!findtext(occupier.name,"APC Copy"))
occupier.name = "[malf.name] APC Copy"
src.occupier = new /mob/living/silicon/ai(src,malf.laws,null,1)
src.occupier.adjustOxyLoss(malf.getOxyLoss())
if(!findtext(src.occupier.name,"APC Copy"))
src.occupier.name = "[malf.name] APC Copy"
if(malf.parent)
occupier.parent = malf.parent
src.occupier.parent = malf.parent
else
occupier.parent = malf
src.occupier.parent = malf
malf.shunted = 1
malf.mind.transfer_to(occupier)
occupier.eyeobj.name = "[occupier.name] (AI Eye)"
malf.mind.transfer_to(src.occupier)
src.occupier.eyeobj.name = "[src.occupier.name] (AI Eye)"
if(malf.parent)
qdel(malf)
occupier.verbs += /mob/living/silicon/ai/proc/corereturn
occupier.cancel_camera()
src.occupier.verbs += /mob/living/silicon/ai/proc/corereturn
src.occupier.cancel_camera()
if ((seclevel2num(get_security_level()) == SEC_LEVEL_DELTA) && malf.nuking)
for(var/obj/item/weapon/pinpointer/point in pinpointer_list)
point.the_disk = src //the pinpointer will detect the shunted AI
/obj/machinery/power/apc/proc/malfvacate(forced)
if(!occupier)
if(!src.occupier)
return
if(occupier.parent && occupier.parent.stat != 2)
occupier.mind.transfer_to(occupier.parent)
occupier.parent.shunted = 0
occupier.parent.adjustOxyLoss(occupier.getOxyLoss())
occupier.parent.cancel_camera()
qdel(occupier)
if(src.occupier.parent && src.occupier.parent.stat != 2)
src.occupier.mind.transfer_to(src.occupier.parent)
src.occupier.parent.shunted = 0
src.occupier.parent.adjustOxyLoss(src.occupier.getOxyLoss())
src.occupier.parent.cancel_camera()
qdel(src.occupier)
if (seclevel2num(get_security_level()) == SEC_LEVEL_DELTA)
for(var/obj/item/weapon/pinpointer/point in pinpointer_list)
for(var/mob/living/silicon/ai/A in ai_list)
if((A.stat != DEAD) && A.nuking)
point.the_disk = A //The pinpointer tracks the AI back into its core.
else
occupier << "<span class='danger'>Primary core damaged, unable to return core processes.</span>"
src.occupier << "<span class='danger'>Primary core damaged, unable to return core processes.</span>"
if(forced)
occupier.loc = src.loc
occupier.death()
occupier.gib()
for(var/obj/item/weapon/pinpointer/P in pinpointer_list)
P.switch_mode_to(TRACK_NUKE_DISK) //Pinpointers go back to tracking the nuke disk
P.nuke_warning = FALSE
src.occupier.loc = src.loc
src.occupier.death()
src.occupier.gib()
for(var/obj/item/weapon/pinpointer/point in pinpointer_list)
point.the_disk = null //the pinpointer will go back to pointing at the nuke disc.
/obj/machinery/power/apc/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/device/aicard/card)
if(card.AI)
user << "<span class='warning'>[card] is already occupied!</span>"
return
if(!occupier)
user << "<span class='warning'>There's nothing in [src] to transfer!</span>"
return
if(!occupier.mind || !occupier.client)
user << "<span class='warning'>[occupier] is either inactive, destroyed, or braindead!</span>"
return
if(!occupier.parent.stat)
user << "<span class='warning'>[occupier] is refusing all attempts at transfer!</span>" //We can return to our core, no need to shunt right now
return
if(transfer_in_progress)
user << "<span class='warning'>There's already a transfer in progress!</span>"
return
if(interaction != AI_TRANS_TO_CARD || occupier.stat)
return
var/turf/T = get_turf(user)
if(!T)
return
transfer_in_progress = TRUE
user.visible_message("<span class='notice'>[user] slots [card] into [src]...</span>", "<span class='notice'>Transfer process initiated. Sending request for AI approval...</span>")
playsound(src, 'sound/machines/click.ogg', 50, 1)
occupier << sound('sound/misc/notice2.ogg') //To alert the AI that someone's trying to card them if they're tabbed out
if(alert(occupier, "[user] is attempting to transfer you to \a [card.name]. Do you consent to this?", "APC Transfer", "Yes - Transfer Me", "No - Keep Me Here") == "No - Keep Me Here")
user << "<span class='danger'>AI denied transfer request. Process terminated.</span>"
playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1)
transfer_in_progress = FALSE
return
if(user.loc != T)
user << "<span class='danger'>Location changed. Process terminated.</span>"
occupier << "<span class='warning'>[user] moved away! Transfer canceled.</span>"
transfer_in_progress = FALSE
return
user << "<span class='notice'>AI accepted request. Transferring stored intelligence to [card]...</span>"
occupier << "<span class='notice'>Transfer starting. You will be moved to [card] shortly.</span>"
if(!do_after(user, 50, target = src))
occupier << "<span class='warning'>[user] was interrupted! Transfer canceled.</span>"
transfer_in_progress = FALSE
return
if(!occupier || !card)
transfer_in_progress = FALSE
return
user.visible_message("<span class='notice'>[user] transfers [occupier] to [card]!</span>", "<span class='notice'>Transfer complete! [occupier] is now stored in [card].</span>")
occupier << "<span class='notice'>Transfer complete! You've been stored in [user]'s [card.name].</span>"
occupier.forceMove(card)
card.AI = occupier
occupier.parent.shunted = FALSE
occupier.cancel_camera()
occupier = null
transfer_in_progress = FALSE
return
/obj/machinery/power/apc/surplus()
if(terminal)
@@ -972,12 +894,6 @@
return
if(!area.requires_power)
return
if(failure_timer)
update()
queue_icon_update()
failure_timer--
force_update = 1
return
/*
if (equipment > 1) // off=0, off auto=1, on=2, on auto=3
@@ -1117,8 +1033,7 @@
// update icon & area power if anything changed
if(last_lt != lighting || last_eq != equipment || last_en != environ || force_update)
force_update = 0
if(last_lt != lighting || last_eq != equipment || last_en != environ)
queue_icon_update()
update()
else if (last_ch != charging)
@@ -1168,10 +1083,21 @@
environ = 0
update_icon()
update()
addtimer(src, "reset", 600, TIMER_NORMAL, APC_RESET_EMP)
addtimer(src, "reset", 600, FALSE, APC_RESET_EMP)
..()
/obj/machinery/power/apc/blob_act(obj/structure/blob/B)
/obj/machinery/power/apc/ex_act(severity, target)
..()
if(!qdeleted(src))
switch(severity)
if(2)
if(prob(50))
set_broken()
if(3)
if(prob(25))
set_broken()
/obj/machinery/power/apc/blob_act(obj/effect/blob/B)
set_broken()
/obj/machinery/power/apc/disconnect_terminal()
@@ -1200,7 +1126,7 @@
for(var/area/A in area.related)
for(var/obj/machinery/light/L in A)
L.on = 1
L.break_light_tube()
L.broken()
stoplag()
/obj/machinery/power/apc/proc/shock(mob/user, prb)
@@ -1211,7 +1137,7 @@
s.start()
if(isalien(user))
return 0
if(electrocute_mob(user, src, src, 1, TRUE))
if(electrocute_mob(user, src, src))
return 1
else
return 0
@@ -1224,23 +1150,10 @@
else
return 0
/obj/machinery/power/apc/proc/energy_fail(duration)
for(var/obj/machinery/M in area.contents)
if(M.critical_machine)
return
for(var/A in ai_list)
var/mob/living/silicon/ai/I = A
if(get_area(I) == area)
return
failure_timer = max(failure_timer, round(duration))
#undef APC_UPDATE_ICON_COOLDOWN
/*Power module, used for APC construction*/
/obj/item/weapon/electronics/apc
name = "power control module"
icon_state = "power_mod"
desc = "Heavy-duty switching circuits for power control."
desc = "Heavy-duty switching circuits for power control."