diff --git a/code/game/dna.dm b/code/game/dna.dm
index 399c8360ff6..12771d535fe 100644
--- a/code/game/dna.dm
+++ b/code/game/dna.dm
@@ -289,9 +289,7 @@
icon_state = "scanner"
density = 1
var/locked = 0
- var/open = 0
anchored = 1
- interact_offline = 1
use_power = 1
idle_power_usage = 50
active_power_usage = 300
@@ -327,11 +325,11 @@
//no power or maintenance
if(stat & (NOPOWER|BROKEN))
- icon_state = initial(icon_state)+ (open ? "_open" : "") + "_unpowered"
+ icon_state = initial(icon_state)+ (state_open ? "_open" : "") + "_unpowered"
return
if((stat & MAINT) || panel_open)
- icon_state = initial(icon_state)+ (open ? "_open" : "") + "_maintenance"
+ icon_state = initial(icon_state)+ (state_open ? "_open" : "") + "_maintenance"
return
//running and someone in there
@@ -340,23 +338,32 @@
return
//running
- icon_state = initial(icon_state)+ (open ? "_open" : "")
+ icon_state = initial(icon_state)+ (state_open ? "_open" : "")
/obj/machinery/dna_scannernew/power_change()
..()
update_icon()
-/obj/machinery/dna_scannernew/proc/toggle_open(mob/user=usr)
- if(!user)
+/obj/machinery/dna_scannernew/proc/toggle_open(var/mob/user)
+ if(panel_open)
+ user << "Close the maintenance panel first."
return
- if(open) return close(user)
- else return open(user)
+
+ if(state_open)
+ close_machine()
+ return
+
+ else if(locked)
+ user << "The bolts are locked down, securing the door shut."
+ return
+
+ open_machine()
/obj/machinery/dna_scannernew/container_resist()
var/mob/living/user = usr
var/breakout_time = 2
- if(open || !locked) //Open and unlocked, no need to escape
- open = 1
+ if(state_open || !locked) //Open and unlocked, no need to escape
+ state_open = 1
return
user.changeNext_move(CLICK_CD_BREAKOUT)
user.last_special = world.time + CLICK_CD_BREAKOUT
@@ -364,104 +371,83 @@
user.visible_message("You hear a metallic creaking from [src]!")
if(do_after(user,(breakout_time*60*10))) //minutes * 60seconds * 10deciseconds
- if(!user || user.stat != CONSCIOUS || user.loc != src || open || !locked)
+ if(!user || user.stat != CONSCIOUS || user.loc != src || state_open || !locked)
return
locked = 0
visible_message("[user] successfully broke out of [src]!")
user << "You successfully break out of [src]!"
- open(user)
+ open_machine()
-/obj/machinery/dna_scannernew/proc/close(mob/user)
- if(open)
- if(panel_open)
- user << "Close the maintenance panel first."
- return 0
- open = 0
- density = 1
- for(var/mob/living/carbon/C in loc)
- if(C.buckled) continue
- if(C.client)
- C.client.perspective = EYE_PERSPECTIVE
- C.client.eye = src
- occupant = C
- C.loc = src
- C.stop_pulling()
- break
- update_icon()
+/obj/machinery/dna_scannernew/close_machine()
+ if(!state_open)
+ return 0
- // search for ghosts, if the corpse is empty and the scanner is connected to a cloner
- if(occupant)
- if(locate(/obj/machinery/computer/cloning, get_step(src, NORTH)) \
- || locate(/obj/machinery/computer/cloning, get_step(src, SOUTH)) \
- || locate(/obj/machinery/computer/cloning, get_step(src, EAST)) \
- || locate(/obj/machinery/computer/cloning, get_step(src, WEST)))
+ ..()
- var/mob/dead/observer/ghost = occupant.get_ghost()
- if(ghost)
- ghost << "Your corpse has been placed into a cloning scanner. Return to your body if you want to be cloned! (Verbs -> Ghost -> Re-enter corpse)"
- ghost << sound('sound/effects/genetics.ogg')
- return 1
+ // search for ghosts, if the corpse is empty and the scanner is connected to a cloner
+ if(occupant)
+ if(locate(/obj/machinery/computer/cloning, get_step(src, NORTH)) \
+ || locate(/obj/machinery/computer/cloning, get_step(src, SOUTH)) \
+ || locate(/obj/machinery/computer/cloning, get_step(src, EAST)) \
+ || locate(/obj/machinery/computer/cloning, get_step(src, WEST)))
-/obj/machinery/dna_scannernew/proc/open(mob/user)
- if(!open)
- if(panel_open)
- user << "Close the maintenance panel first."
- return
- if(locked)
- user << "The bolts are locked down, securing the door shut."
- return
- var/turf/T = get_turf(src)
- if(T)
- open = 1
- density = 0
- T.contents += contents
- if(occupant)
- if(occupant.client)
- occupant.client.eye = occupant
- occupant.client.perspective = MOB_PERSPECTIVE
- occupant = null
- update_icon()
- return 1
+ var/mob/dead/observer/ghost = occupant.get_ghost()
+ if(ghost)
+ ghost << "Your corpse has been placed into a cloning scanner. Return to your body if you want to be cloned! (Verbs -> Ghost -> Re-enter corpse)"
+ ghost << sound('sound/effects/genetics.ogg')
+ return 1
+
+/obj/machinery/dna_scannernew/open_machine()
+ if(state_open)
+ return 0
+
+ ..()
+
+ return 1
/obj/machinery/dna_scannernew/relaymove(mob/user as mob)
- if(user.stat)
+ if(user.stat || locked)
return
- open(user)
+
+ open_machine()
return
-/obj/machinery/dna_scannernew/attackby(obj/item/weapon/grab/G, mob/user)
+/obj/machinery/dna_scannernew/attackby(var/obj/item/I, mob/user)
- if(!occupant && default_deconstruction_screwdriver(user, icon_state, icon_state, G))//sent icon_state is irrelevant...
+ if(!occupant && default_deconstruction_screwdriver(user, icon_state, icon_state, I))//sent icon_state is irrelevant...
update_icon()//..since we're updating the icon here, since the scanner can be unpowered when opened/closed
return
- if(exchange_parts(user, G))
+ if(exchange_parts(user, I))
return
- if(istype(G, /obj/item/weapon/crowbar))
- if(panel_open)
- for(var/obj/I in contents) // in case there is something in the scanner
- I.loc = src.loc
- default_deconstruction_crowbar(G)
+ if(default_pry_open(I))
return
- if(!istype(G, /obj/item/weapon/grab) || !ismob(G.affecting))
+ if(default_deconstruction_crowbar(I))
return
- if(!open)
- user << "Open the scanner first."
- return
- var/mob/M = G.affecting
- M.loc = loc
- user.stop_pulling()
- qdel(G)
+
+ if(istype(I, /obj/item/weapon/grab))
+ var/obj/item/weapon/grab/G = I
+ if(!ismob(G.affecting))
+ return
+
+ if(!state_open)
+ user << "Open the scanner first."
+ return
+
+ var/mob/M = G.affecting
+ M.loc = loc
+ user.stop_pulling()
+ qdel(G)
/obj/machinery/dna_scannernew/attack_hand(mob/user)
- if(..())
+ if(..(user,1,0)) //don't set the machine, since there's no dialog
return
+
toggle_open(user)
- add_fingerprint(user)
/obj/machinery/dna_scannernew/blob_act()
if(prob(75))
@@ -555,7 +541,7 @@
else
occupant_status += "No subject detected"
- if(connected.open)
+ if(connected.state_open)
scanner_status = "Open"
else
scanner_status = "Closed"
@@ -593,8 +579,8 @@
status += "" // Close statusDisplay div
var/buttons = "Scan "
if(connected)
- buttons += " [connected.open ? "Close" : "Open"] Scanner "
- if (connected.open)
+ buttons += " [connected.state_open ? "Close" : "Open"] Scanner "
+ if (connected.state_open)
buttons += "[connected.locked ? "Unlock" : "Lock"] Scanner "
else
buttons += "[connected.locked ? "Unlock" : "Lock"] Scanner "
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index ec015bcc70b..181536d3b6f 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -11,7 +11,6 @@
icon_state = "sleeper-open"
density = 0
anchored = 1
- interact_offline = 1
state_open = 1
var/efficiency
var/initial_bin_rating = 1
@@ -82,6 +81,9 @@
if(exchange_parts(user, I))
return
+ if(default_pry_open(I))
+ return
+
default_deconstruction_crowbar(I)
/obj/machinery/sleeper/ex_act(severity, target)
@@ -118,16 +120,7 @@
if(..())
return
- //powerless interaction
- if(!is_operational())
- user.unset_machine()//essential to prevent infinite loops of opening/closing the machine
- if(state_open)
- close_machine()
- else
- open_machine()
-
- else
- sleeperUI(user)
+ sleeperUI(user)
/obj/machinery/sleeper/proc/sleeperUI(mob/user)
var/dat
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 0931108c7d9..ae846787d06 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -4,7 +4,6 @@
icon_state = "cell-off"
density = 1
anchored = 1.0
- interact_offline = 1
layer = 4
var/on = 0
@@ -103,16 +102,7 @@
if(..())
return
- //powerless interaction
- if(!is_operational())
- user.unset_machine()//essential to prevent infinite loops of opening/closing the machine
- if(state_open)
- close_machine()
- else
- open_machine()
-
- else
- ui_interact(user)
+ ui_interact(user)
/**
@@ -242,6 +232,9 @@
if(exchange_parts(user, I))
return
+ if(default_pry_open(I))
+ return
+
default_deconstruction_crowbar(I)
/obj/machinery/atmospherics/unary/cryo_cell/open_machine()
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 08d947dabe6..f3e5dad90ca 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -85,7 +85,7 @@ Class Procs:
Called by the 'master_controller' once per game tick for each machine that is listed in the 'machines' list.
is_operational()
- Returns 0 if the machine is unpowered, broken or undergoing maintenance, 1 if not
+ Returns 0 if the machine is unpowered, broken or undergoing maintenance, something else if not
Compiled by Aygar
*/
@@ -122,7 +122,7 @@ Class Procs:
machines.Remove(src)
SSmachine.processing -= src
if(occupant)
- open_machine()
+ dropContents()
..()
/obj/machinery/process()//If you dont use process or power why are you here
@@ -208,6 +208,7 @@ Class Procs:
/obj/machinery/proc/is_operational()
return !(stat & (NOPOWER|BROKEN|MAINT))
+
////////////////////////////////////////////////////////////////////////////////////////////
/mob/proc/canUseTopic() //TODO: once finished, place these procs on the respective mob files
@@ -268,10 +269,13 @@ Class Procs:
/obj/machinery/attack_paw(mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/attack_hand(mob/user as mob, var/check_power = 1)
+//set_machine must be 0 if clicking the machinery doesn't bring up a dialog
+/obj/machinery/attack_hand(mob/user as mob, var/check_power = 1, var/set_machine = 1)
if(check_power && stat & NOPOWER)
+ user << "\The [src] seems unpowered."
return 1
if(!interact_offline && stat & (BROKEN|MAINT))
+ user << "\The [src] seems broken."
return 1
if(user.lying || user.stat)
return 1
@@ -293,7 +297,8 @@ Class Procs:
return 1
src.add_fingerprint(user)
- user.set_machine(src)
+ if(set_machine)
+ user.set_machine(src)
return 0
/obj/machinery/CheckParts()
@@ -307,6 +312,14 @@ Class Procs:
uid = gl_uid
gl_uid++
+/obj/machinery/proc/default_pry_open(var/obj/item/weapon/crowbar/C)
+ . = !(state_open || panel_open || is_operational()) && istype(C)
+ if(.)
+ playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+ visible_message("[usr] pry open \the [src].", "You pry open \the [src].")
+ open_machine()
+ return 1
+
/obj/machinery/proc/default_deconstruction_crowbar(var/obj/item/weapon/crowbar/C, var/ignore_panel = 0)
. = istype(C) && (panel_open || ignore_panel)
if(.)
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 743da789536..1fabca3a59a 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -3,19 +3,14 @@
icon = 'icons/obj/objects.dmi'
icon_state = "borgcharger0"
density = 0
- anchored = 1.0
+ anchored = 1
use_power = 1
idle_power_usage = 5
active_power_usage = 1000
- var/open = 1
- var/construct_op = 0
var/circuitboard = "/obj/item/weapon/circuitboard/cyborgrecharger"
- var/locked = 1
req_access = list(access_robotics)
var/recharge_speed
var/repairs
- var/mob/living/silicon/robot/occupier
-
/obj/machinery/recharge_station/New()
..()
@@ -26,7 +21,7 @@
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
component_parts += new /obj/item/weapon/stock_parts/cell/high(null)
RefreshParts()
- build_icon()
+ update_icon()
/obj/machinery/recharge_station/RefreshParts()
recharge_speed = 0
@@ -40,11 +35,11 @@
/obj/machinery/recharge_station/process()
- if(!(NOPOWER|BROKEN))
+ if(!is_operational())
return
- if(src.occupier)
- process_occupier()
+ if(occupant)
+ process_occupant()
return 1
@@ -61,13 +56,13 @@
if(stat & (BROKEN|NOPOWER))
..(severity)
return
- if(occupier)
- occupier.emp_act(severity)
+ if(occupant)
+ occupant.emp_act(severity)
open_machine()
..(severity)
/obj/machinery/recharge_station/ex_act(severity, target)
- if(occupier)
+ if(occupant)
open_machine()
..()
@@ -78,40 +73,34 @@
return attack_hand(user)
/obj/machinery/recharge_station/attackby(obj/item/P as obj, mob/user as mob)
- if(open)
+ if(state_open)
if(default_deconstruction_screwdriver(user, "borgdecon2", "borgcharger0", P))
return
if(exchange_parts(user, P))
return
+ if(default_pry_open(P))
+ return
+
default_deconstruction_crowbar(P)
/obj/machinery/recharge_station/attack_hand(user as mob)
- if(..()) return
- if(construct_op == 0)
- toggle_open()
- else
- user << "The recharger can't be closed in this state."
+ if(..(user,1,set_machine = 0))
+ return
+
+ toggle_open()
add_fingerprint(user)
/obj/machinery/recharge_station/proc/toggle_open()
- if(open)
+ if(state_open)
close_machine()
else
open_machine()
/obj/machinery/recharge_station/open_machine()
- if(occupier)
- if (occupier.client)
- occupier.client.eye = occupier
- occupier.client.perspective = MOB_PERSPECTIVE
- occupier.loc = loc
- occupier = null
- use_power = 1
- open = 1
- density = 0
- build_icon()
+ ..()
+ use_power = 1
/obj/machinery/recharge_station/close_machine()
if(!panel_open)
@@ -121,61 +110,62 @@
R.client.eye = src
R.client.perspective = EYE_PERSPECTIVE
R.loc = src
- occupier = R
+ occupant = R
use_power = 2
add_fingerprint(R)
break
- open = 0
+ state_open = 0
density = 1
- build_icon()
+ update_icon()
-/obj/machinery/recharge_station/proc/build_icon()
- if(NOPOWER|BROKEN)
- if(open)
+/obj/machinery/recharge_station/update_icon()
+ if(is_operational())
+ if(state_open)
icon_state = "borgcharger0"
else
- if(occupier)
- icon_state = "borgcharger1"
- else
- icon_state = "borgcharger2"
+ icon_state = (occupant ? "borgcharger1" : "borgcharger2")
else
- icon_state = "borgcharger0"
+ icon_state = (state_open ? "borgcharger-u0" : "borgcharger-u1")
-/obj/machinery/recharge_station/proc/process_occupier()
- if(occupier)
+/obj/machinery/recharge_station/power_change()
+ ..()
+ update_icon()
+
+/obj/machinery/recharge_station/proc/process_occupant()
+ if(occupant)
+ var/mob/living/silicon/robot/R = occupant
restock_modules()
if(repairs)
- occupier.heal_organ_damage(repairs, repairs - 1)
- if(occupier.cell)
- if(occupier.cell.charge >= occupier.cell.maxcharge)
- occupier.cell.charge = occupier.cell.maxcharge
- else
- occupier.cell.charge = min(occupier.cell.charge + recharge_speed, occupier.cell.maxcharge)
+ R.heal_organ_damage(repairs, repairs - 1)
+ if(R.cell)
+ R.cell.charge = min(R.cell.charge + recharge_speed, R.cell.maxcharge)
/obj/machinery/recharge_station/proc/restock_modules()
- if(occupier)
- if(occupier.module && occupier.module.modules)
- var/list/um = occupier.contents|occupier.module.modules // Makes single list of active (occupier.contents) and inactive (occupier.module.modules) modules
+ if(occupant)
+ var/mob/living/silicon/robot/R = occupant
+ if(R.module && R.module.modules)
+ var/list/um = R.contents|R.module.modules // Makes single list of active (R.contents) and inactive (R.module.modules) modules
var/coeff = recharge_speed / 200
- for (var/datum/robot_energy_storage/st in occupier.module.storages)
+ for (var/datum/robot_energy_storage/st in R.module.storages)
st.energy = min(st.max_energy, st.energy + coeff * st.recharge_rate)
for(var/obj/O in um)
//General
if(istype(O,/obj/item/device/flash))
- if(O:broken)
- O:broken = 0
- O:times_used = 0
- O:icon_state = "flash"
+ var/obj/item/device/flash/F = O
+ if(F.broken)
+ F.broken = 0
+ F.times_used = 0
+ F.icon_state = "flash"
// Engineering
// Security
if(istype(O,/obj/item/weapon/gun/energy/gun/advtaser/cyborg))
- if(O:power_supply.charge < O:power_supply.maxcharge)
- var/obj/item/weapon/gun/energy/G = O
- var/obj/item/ammo_casing/energy/S = G.ammo_type[G.select]
- O:power_supply.give(S.e_cost * coeff)
- O:update_icon()
+ var/obj/item/weapon/gun/energy/gun/advtaser/cyborg/T = O
+ if(T.power_supply.charge < T.power_supply.maxcharge)
+ var/obj/item/ammo_casing/energy/S = T.ammo_type[T.select]
+ T.power_supply.give(S.e_cost * coeff)
+ T.update_icon()
else
- O:charge_tick = 0
+ T.charge_tick = 0
if(istype(O,/obj/item/weapon/melee/baton))
var/obj/item/weapon/melee/baton/B = O
if(B.bcell)
@@ -194,16 +184,15 @@
var/obj/item/device/lightreplacer/LR = O
var/i = 1
for(1, i <= coeff, i++)
- LR.Charge(occupier)
+ LR.Charge(R)
- if(occupier)
- if(occupier.module)
- occupier.module.respawn_consumable(occupier)
+ if(R && R.module)
+ R.module.respawn_consumable(R)
//Emagged items for janitor and medical borg
- if(occupier.module.emag)
- if(istype(occupier.module.emag, /obj/item/weapon/reagent_containers/spray))
- var/obj/item/weapon/reagent_containers/spray/S = occupier.module.emag
+ if(R.module.emag)
+ if(istype(R.module.emag, /obj/item/weapon/reagent_containers/spray))
+ var/obj/item/weapon/reagent_containers/spray/S = R.module.emag
if(S.name == "polyacid spray")
S.reagents.add_reagent("pacid", 2 * coeff)
else if(S.name == "lube spray")
diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm
index d883637eb96..4474df3f7c7 100644
--- a/code/game/mecha/mech_bay.dm
+++ b/code/game/mecha/mech_bay.dm
@@ -147,10 +147,16 @@
/obj/machinery/computer/mech_bay_power_console/update_icon()
+ if(stat & NOPOWER)
+ icon_state = "recharge_comp0"
+ return
+ if(stat & BROKEN)
+ icon_state = "recharge_compb"
+ return
if(!recharge_port || !recharge_port.recharging_mech || !recharge_port.recharging_mech.cell || !(recharge_port.recharging_mech.cell.charge < recharge_port.recharging_mech.cell.maxcharge))
icon_state = "recharge_comp"
- else
- icon_state = "recharge_comp_on"
+ return
+ icon_state = "recharge_comp_on"
/obj/machinery/computer/mech_bay_power_console/initialize()
reconnect()
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index 7d3d07efb5f..bd9d0fadc2d 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -55,10 +55,18 @@
screen = 1
if(href_list["return"])
screen = 0
- src.updateUsrDialog()
+ updateUsrDialog()
return
+/obj/machinery/computer/mecha/update_icon()
+ if(stat & NOPOWER)
+ icon_state = "mecha0"
+ return
+ if(stat & BROKEN)
+ icon_state = "mechab"
+ return
+ icon_state = "mecha0"
/obj/item/mecha_parts/mecha_tracking
name = "exosuit tracking beacon"
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index e0bbc6ea25a..51b57125584 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ