Merge pull request #6758 from Menshin/crowbar_prying

Some machinery tweaking + crowbar prying added
This commit is contained in:
tkdrg
2015-01-06 21:25:17 -03:00
8 changed files with 171 additions and 183 deletions
+70 -84
View File
@@ -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 << "<span class='notice'>Close the maintenance panel first.</span>"
return
if(open) return close(user)
else return open(user)
if(state_open)
close_machine()
return
else if(locked)
user << "<span class='notice'>The bolts are locked down, securing the door shut.</span>"
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("<span class='warning'>You hear a metallic creaking from [src]!</span>")
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("<span class='danger'>[user] successfully broke out of [src]!</span>")
user << "<span class='notice'>You successfully break out of [src]!</span>"
open(user)
open_machine()
/obj/machinery/dna_scannernew/proc/close(mob/user)
if(open)
if(panel_open)
user << "<span class='notice'>Close the maintenance panel first.</span>"
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 << "<span class='ghostalert'>Your corpse has been placed into a cloning scanner. Return to your body if you want to be cloned!</span> (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 << "<span class='notice'>Close the maintenance panel first.</span>"
return
if(locked)
user << "<span class='notice'>The bolts are locked down, securing the door shut.</span>"
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 << "<span class='ghostalert'>Your corpse has been placed into a cloning scanner. Return to your body if you want to be cloned!</span> (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 << "<span class='notice'>Open the scanner first.</span>"
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 << "<span class='notice'>Open the scanner first.</span>"
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 += "<span class='bad'>No subject detected</span></div></div>"
if(connected.open)
if(connected.state_open)
scanner_status = "Open"
else
scanner_status = "Closed"
@@ -593,8 +579,8 @@
status += "</div>" // Close statusDisplay div
var/buttons = "<a href='?src=\ref[src];'>Scan</a> "
if(connected)
buttons += " <a href='?src=\ref[src];task=toggleopen;'>[connected.open ? "Close" : "Open"] Scanner</a> "
if (connected.open)
buttons += " <a href='?src=\ref[src];task=toggleopen;'>[connected.state_open ? "Close" : "Open"] Scanner</a> "
if (connected.state_open)
buttons += "<span class='linkOff'>[connected.locked ? "Unlock" : "Lock"] Scanner</span> "
else
buttons += "<a href='?src=\ref[src];task=togglelock;'>[connected.locked ? "Unlock" : "Lock"] Scanner</a> "
+4 -11
View File
@@ -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
+4 -11
View File
@@ -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()
+17 -4
View File
@@ -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 << "<span class='danger'>\The [src] seems unpowered.</span>"
return 1
if(!interact_offline && stat & (BROKEN|MAINT))
user << "<span class='danger'>\The [src] seems broken.</span>"
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("<span class = 'notice'>[usr] pry open \the [src].</span>", "<span class = 'notice'>You pry open \the [src].</span>")
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(.)
+59 -70
View File
@@ -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")
+8 -2
View File
@@ -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()
+9 -1
View File
@@ -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"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 116 KiB