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