Small map, and sprite fixes. Welder fixes (#3887)

Fixed fire alarm in virology #3875

Fixed random pixel on glasses #3872

Fixed welder issue #3888. Plus explored further issue with welder, fixing it. Small logic optimization.

Fixed firelocker icon not being updated with welded overlay, even so they have been welded

Welding interaction with closets was reworked, almost all secure closets except for detective's, barternder's now work with welding same way as closets/crates.

Coffins, and wooden closets of any kind can no longer be welded shut.

Clean up of some code using src as reference, and :
This commit is contained in:
Mykhailo Bykhovtsev
2017-11-30 06:50:55 +02:00
committed by Erki
parent e721c801ce
commit 88267a1a6a
17 changed files with 314 additions and 208 deletions
@@ -29,7 +29,7 @@
if (opened) // if closed, any item at the crate's loc is put in the contents
return
var/obj/I
for(I in src.loc)
for(I in loc)
if (!istype(I, /obj/item) && !istype(I, /obj/random))
continue
if (I.density || I.anchored || I == src)
@@ -37,7 +37,7 @@
I.forceMove(src)
// adjust locker size to hold all items with 5 units of free store room
var/content_size = 0
for(I in src.contents)
for(I in contents)
content_size += Ceiling(I.w_class/2)
if(content_size > storage_capacity-5)
storage_capacity = content_size + 5
@@ -53,7 +53,7 @@
/obj/structure/closet/examine(mob/user)
if(..(user, 1) && !opened)
var/content_size = 0
for(var/obj/item/I in src.contents)
for(var/obj/item/I in contents)
if(!I.anchored)
content_size += Ceiling(I.w_class/2)
if(!content_size)
@@ -69,7 +69,7 @@
/obj/structure/closet/proc/stored_weight()
var/content_size = 0
for(var/obj/item/I in src.contents)
for(var/obj/item/I in contents)
if(!I.anchored)
content_size += Ceiling(I.w_class/2)
return content_size
@@ -79,7 +79,7 @@
return (!density)
/obj/structure/closet/proc/can_open()
if(src.welded)
if(welded)
return 0
return 1
@@ -92,36 +92,36 @@
/obj/structure/closet/proc/dump_contents()
//Cham Projector Exception
for(var/obj/effect/dummy/chameleon/AD in src)
AD.forceMove(src.loc)
AD.forceMove(loc)
for(var/obj/I in src)
I.forceMove(src.loc)
I.forceMove(loc)
for(var/mob/M in src)
M.forceMove(src.loc)
M.forceMove(loc)
if(M.client)
M.client.eye = M.client.mob
M.client.perspective = MOB_PERSPECTIVE
/obj/structure/closet/proc/open()
if(src.opened)
if(opened)
return 0
if(!src.can_open())
if(!can_open())
return 0
src.dump_contents()
dump_contents()
src.icon_state = src.icon_opened
src.opened = 1
playsound(src.loc, open_sound, 15, 1, -3)
icon_state = icon_opened
opened = 1
playsound(loc, open_sound, 15, 1, -3)
density = 0
return 1
/obj/structure/closet/proc/close()
if(!src.opened)
if(!opened)
return 0
if(!src.can_close())
if(!can_close())
return 0
var/stored_units = 0
@@ -133,17 +133,17 @@
if(store_mobs)
stored_units += store_mobs(stored_units)
src.icon_state = src.icon_closed
src.opened = 0
icon_state = icon_closed
opened = 0
playsound(src.loc, close_sound, 25, 0, -3)
playsound(loc, close_sound, 25, 0, -3)
density = 1
return 1
//Cham Projector Exception
/obj/structure/closet/proc/store_misc(var/stored_units)
var/added_units = 0
for(var/obj/effect/dummy/chameleon/AD in src.loc)
for(var/obj/effect/dummy/chameleon/AD in loc)
if((stored_units + added_units) > storage_capacity)
break
AD.forceMove(src)
@@ -152,7 +152,7 @@
/obj/structure/closet/proc/store_items(var/stored_units)
var/added_units = 0
for(var/obj/item/I in src.loc)
for(var/obj/item/I in loc)
var/item_size = Ceiling(I.w_class / 2)
if(stored_units + added_units + item_size > storage_capacity)
continue
@@ -163,7 +163,7 @@
/obj/structure/closet/proc/store_mobs(var/stored_units)
var/added_units = 0
for(var/mob/living/M in src.loc)
for(var/mob/living/M in loc)
if(M.buckled || M.pinned.len)
continue
if(stored_units + added_units + M.mob_size > storage_capacity)
@@ -176,7 +176,7 @@
return added_units
/obj/structure/closet/proc/toggle(mob/user as mob)
if(!(src.opened ? src.close() : src.open()))
if(!(opened ? close() : open()))
user << "<span class='notice'>It won't budge!</span>"
return
update_icon()
@@ -194,7 +194,7 @@
if (health <= 0)
for (var/atom/movable/A as mob|obj in src)
A.forceMove(src.loc)
A.forceMove(loc)
A.ex_act(severity + 1)
qdel(src)
@@ -202,7 +202,7 @@
health -= damage
if(health <= 0)
for(var/atom/movable/A in src)
A.forceMove(src.loc)
A.forceMove(loc)
qdel(src)
/obj/structure/closet/bullet_act(var/obj/item/projectile/Proj)
@@ -214,35 +214,35 @@
damage(proj_damage)
/obj/structure/closet/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(src.opened)
if(opened)
if(istype(W, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = W
src.MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet
MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet
return 0
if(istype(W,/obj/item/tk_grab))
return 0
if(iswelder(W))
var/obj/item/weapon/weldingtool/WT = W
user.visible_message(
"<span class='warning'>[user] begins cutting [src] apart.</span>",
"<span class='notice'>You begin cutting [src] apart.</span>",
"You hear a welding torch on metal."
)
playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
if (!do_after(user, 2 SECONDS, act_target = src, extra_checks = CALLBACK(src, .proc/is_open)))
return
if(!WT.remove_fuel(0,user))
if(WT.isOn())
if(WT.isOn())
user.visible_message(
"<span class='warning'>[user] begins cutting [src] apart.</span>",
"<span class='notice'>You begin cutting [src] apart.</span>",
"You hear a welding torch on metal."
)
playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
if (!do_after(user, 2 SECONDS, act_target = src, extra_checks = CALLBACK(src, .proc/is_open)))
return
if(!WT.remove_fuel(0,user))
user << "<span class='notice'>You need more welding fuel to complete this task.</span>"
return
else
new /obj/item/stack/material/steel(src.loc)
user.visible_message(
"<span class='notice'>[src] has been cut apart by [user] with [WT].</span>",
"<span class='notice'>You cut apart [src] with [WT].</span>"
)
qdel(src)
return
else
new /obj/item/stack/material/steel(loc)
user.visible_message(
"<span class='notice'>[src] has been cut apart by [user] with [WT].</span>",
"<span class='notice'>You cut apart [src] with [WT].</span>"
)
qdel(src)
return
if(istype(W, /obj/item/weapon/storage/laundry_basket) && W.contents.len)
var/obj/item/weapon/storage/laundry_basket/LB = W
var/turf/T = get_turf(src)
@@ -258,33 +258,33 @@
return
usr.drop_item()
if(W)
W.forceMove(src.loc)
W.forceMove(loc)
else if(istype(W, /obj/item/weapon/packageWrap))
return
else if(iswelder(W))
var/obj/item/weapon/weldingtool/WT = W
user.visible_message(
"<span class='warning'>[user] begins welding [src] [welded ? "open" : "shut"].</span>",
"<span class='notice'>You begin welding [src] [welded ? "open" : "shut"].</span>",
"You hear a welding torch on metal."
)
playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
if (!do_after(user, 2 SECONDS, act_target = src, extra_checks = CALLBACK(src, .proc/is_closed)))
return
if(!WT.remove_fuel(0,user))
if(!WT.isOn())
if(WT.isOn())
user.visible_message(
"<span class='warning'>[user] begins welding [src] [welded ? "open" : "shut"].</span>",
"<span class='notice'>You begin welding [src] [welded ? "open" : "shut"].</span>",
"You hear a welding torch on metal."
)
playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
if (!do_after(user, 2 SECONDS, act_target = src, extra_checks = CALLBACK(src, .proc/is_closed)))
return
else
if(!WT.remove_fuel(0,user))
user << "<span class='notice'>You need more welding fuel to complete this task.</span>"
return
src.welded = !src.welded
src.update_icon()
user.visible_message(
"<span class='warning'>[src] has been [welded ? "welded shut" : "unwelded"] by [user].</span>",
"<span class='notice'>You weld [src] [!welded ? "open" : "shut"].</span>"
)
welded = !welded
update_icon()
user.visible_message(
"<span class='warning'>[src] has been [welded ? "welded shut" : "unwelded"] by [user].</span>",
"<span class='notice'>You weld [src] [!welded ? "open" : "shut"].</span>"
)
else
attack_hand(user)
else
src.attack_hand(user)
attack_hand(user)
return
@@ -306,14 +306,14 @@
return
if(!isturf(user.loc)) // are you in a container/closet/pod/etc?
return
if(!src.opened)
if(!opened)
return
if(istype(O, /obj/structure/closet))
return
step_towards(O, src.loc)
step_towards(O, loc)
if(user != O)
user.show_viewers("<span class='danger'>[user] stuffs [O] into [src]!</span>")
src.add_fingerprint(user)
add_fingerprint(user)
return
/obj/structure/closet/attack_ai(mob/user)
@@ -321,20 +321,20 @@
attack_hand(user)
/obj/structure/closet/relaymove(mob/user as mob)
if(user.stat || !isturf(src.loc))
if(user.stat || !isturf(loc))
return
if(!src.open())
if(!open())
user << "<span class='notice'>It won't budge!</span>"
/obj/structure/closet/attack_hand(mob/user as mob)
src.add_fingerprint(user)
return src.toggle(user)
add_fingerprint(user)
return toggle(user)
// tk grab then use on self
/obj/structure/closet/attack_self_tk(mob/user as mob)
src.add_fingerprint(user)
if(!src.toggle())
add_fingerprint(user)
if(!toggle())
usr << "<span class='notice'>It won't budge!</span>"
/obj/structure/closet/verb/verb_toggleopen()
@@ -346,8 +346,8 @@
return
if(ishuman(usr))
src.add_fingerprint(usr)
src.toggle(usr)
add_fingerprint(usr)
toggle(usr)
else
usr << "<span class='warning'>This mob type can't use this verb.</span>"
@@ -410,7 +410,7 @@
breakout = 1
for(var/i in 1 to time) //minutes * 6 * 5seconds * 2
playsound(src.loc, 'sound/effects/grillehit.ogg', 100, 1)
playsound(loc, 'sound/effects/grillehit.ogg', 100, 1)
animate_shake()
if (bar)
@@ -436,7 +436,7 @@
breakout = 0
escapee << "<span class='warning'>You successfully break out!</span>"
visible_message("<span class='danger'>\the [escapee] successfully broke out of \the [src]!</span>")
playsound(src.loc, 'sound/effects/grillehit.ogg', 100, 1)
playsound(loc, 'sound/effects/grillehit.ogg', 100, 1)
break_open()
animate_shake()
qdel(bar)
@@ -5,6 +5,25 @@
icon_closed = "coffin"
icon_opened = "coffin_open"
/obj/structure/closet/coffin/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(opened)
if(istype(W, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = W
MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet
return 0
if(istype(W,/obj/item/tk_grab))
return 0
if(!dropsafety(W))
return
user.drop_item()
if(W)
W.forceMove(loc)
else if(istype(W, /obj/item/weapon/packageWrap))
return
else
attack_hand(user)
return
/obj/structure/closet/coffin/update_icon()
if(!opened)
icon_state = icon_closed
@@ -12,6 +12,25 @@
else
icon_state = icon_opened
/obj/structure/closet/cabinet/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(opened)
if(istype(W, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = W
MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet
return 0
if(istype(W,/obj/item/tk_grab))
return 0
if(!dropsafety(W))
return
user.drop_item()
if(W)
W.forceMove(loc)
else if(istype(W, /obj/item/weapon/packageWrap))
return
else
attack_hand(user)
return
/obj/structure/closet/acloset
name = "strange closet"
desc = "It looks alien!"
@@ -22,6 +22,30 @@
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
/obj/structure/closet/secure_closet/bar/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(opened)
if(istype(W, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = W
if(large)
MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet
else
user << "<span class='notice'>The locker is too small to stuff [G.affecting] into!</span>"
else if(isrobot(user))
return
else if(W.loc != user) // This should stop mounted modules ending up outside the module.
return
user.drop_item()
if(W)
W.forceMove(loc)
else if(!opened)
if(istype(W, /obj/item/weapon/melee/energy/blade))//Attempt to cut open locker if locked
if(emag_act(INFINITY, user, "<span class='danger'>The locker has been sliced open by [user] with \an [W]</span>!", "<span class='danger'>You hear metal being sliced and sparks flying.</span>"))
spark(src, 5)
playsound(loc, 'sound/weapons/blade1.ogg', 50, 1)
playsound(loc, "sparks", 50, 1)
else
togglelock(user)//Attempt to lock locker if closed
/obj/structure/closet/secure_closet/bar/update_icon()
if(broken)
icon_state = icon_broken
@@ -10,7 +10,7 @@
icon_opened = "base"
anchored = 1
canbemoved = 1
/obj/structure/closet/secure_closet/guncabinet/Initialize()
..()
@@ -44,8 +44,10 @@
else if (shottas > 0)
shottas--
add_overlay("projectile[i]")
add_overlay("door")
if(welded)
add_overlay(welded_overlay_state)
if(broken)
add_overlay("broken")
@@ -7,6 +7,7 @@
icon_opened = "medicalopen"
icon_broken = "medicalbroken"
icon_off = "medicaloff"
welded_overlay_state = "welded_wallcloset"
req_access = list(access_medical_equip)
fill()
@@ -185,15 +186,3 @@
density = 0
wall_mounted = 1
req_access = list(access_medical_equip)
/obj/structure/closet/secure_closet/medical_wall/update_icon()
if(broken)
icon_state = icon_broken
else
if(!opened)
if(locked)
icon_state = icon_locked
else
icon_state = icon_closed
else
icon_state = icon_opened
@@ -45,46 +45,46 @@
/obj/structure/closet/secure_closet/personal/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (src.opened)
if (opened)
if (istype(W, /obj/item/weapon/grab))
src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet
MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet
user.drop_item()
if (W) W.forceMove(src.loc)
if (W) W.forceMove(loc)
else if(W.GetID())
var/obj/item/weapon/card/id/I = W.GetID()
if(src.broken)
if(broken)
user << "<span class='warning'>It appears to be broken.</span>"
return
if(!I || !I.registered_name) return
if(src.allowed(user) || !src.registered_name || (istype(I) && (src.registered_name == I.registered_name)))
if(allowed(user) || !registered_name || (istype(I) && (registered_name == I.registered_name)))
//they can open all lockers, or nobody owns this, or they own this locker
src.locked = !( src.locked )
if(src.locked) src.icon_state = src.icon_locked
else src.icon_state = src.icon_closed
locked = !( locked )
if(locked) icon_state = icon_locked
else icon_state = icon_closed
if(!src.registered_name)
src.registered_name = I.registered_name
src.desc = "Owned by [I.registered_name]."
if(!registered_name)
registered_name = I.registered_name
desc = "Owned by [I.registered_name]."
else
user << "<span class='warning'>Access Denied</span>"
else if(istype(W, /obj/item/weapon/melee/energy/blade))
if(emag_act(INFINITY, user, "The locker has been sliced open by [user] with \an [W]!", "You hear metal being sliced and sparks flying."))
W:spark_system.queue()
playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1)
playsound(src.loc, "sparks", 50, 1)
playsound(loc, 'sound/weapons/blade1.ogg', 50, 1)
playsound(loc, "sparks", 50, 1)
else
user << "<span class='warning'>Access Denied</span>"
return
/obj/structure/closet/secure_closet/personal/emag_act(var/remaining_charges, var/mob/user, var/visual_feedback, var/audible_feedback)
if(!broken)
broken = 1
locked = 0
desc = "It appears to be broken."
icon_state = src.icon_broken
icon_state = icon_broken
if(visual_feedback)
visible_message("<span class='warning'>[visual_feedback]</span>", "<span class='warning'>[audible_feedback]</span>")
visible_message("<span class='warning'>[visual_feedback]</span>", "<span class='warning'>[audible_feedback]</span>")
return 1
/obj/structure/closet/secure_closet/personal/verb/reset()
@@ -94,17 +94,17 @@
if(!usr.canmove || usr.stat || usr.restrained()) // Don't use it if you're not able to! Checks for stuns, ghost and restrain
return
if(ishuman(usr))
src.add_fingerprint(usr)
if (src.locked || !src.registered_name)
add_fingerprint(usr)
if (locked || !registered_name)
usr << "<span class='warning'>You need to unlock it first.</span>"
else if (src.broken)
else if (broken)
usr << "<span class='warning'>It appears to be broken.</span>"
else
if (src.opened)
if(!src.close())
if (opened)
if(!close())
return
src.locked = 1
src.icon_state = src.icon_locked
src.registered_name = null
src.desc = "It's a secure locker for personnel. The first card swiped gains control."
locked = 1
icon_state = icon_locked
registered_name = null
desc = "It's a secure locker for personnel. The first card swiped gains control."
return
@@ -21,14 +21,14 @@
health = 200
/obj/structure/closet/secure_closet/can_open()
if(src.locked)
if(locked)
return 0
return ..()
/obj/structure/closet/secure_closet/close()
if(..())
if(broken)
icon_state = src.icon_off
icon_state = icon_off
return 1
else
return 0
@@ -38,28 +38,28 @@
O.emp_act(severity)
if(!broken)
if(prob(50/severity))
src.locked = !src.locked
src.update_icon()
locked = !locked
update_icon()
if(prob(20/severity) && !opened)
if(!locked)
open()
else
src.req_access = list()
src.req_access += pick(get_all_station_access())
req_access = list()
req_access += pick(get_all_station_access())
..()
/obj/structure/closet/secure_closet/proc/togglelock(mob/user as mob)
if(src.opened)
if(opened)
user << "<span class='notice'>Close the locker first.</span>"
return
if(src.broken)
if(broken)
user << "<span class='warning'>The locker appears to be broken.</span>"
return
if(user.loc == src)
user << "<span class='notice'>You can't reach the lock from inside.</span>"
return
if(src.allowed(user))
src.locked = !src.locked
if(allowed(user))
locked = !locked
for(var/mob/O in viewers(user, 3))
if((O.client && !( O.blinded )))
O << "<span class='notice'>The locker has been [locked ? null : "un"]locked by [user].</span>"
@@ -68,25 +68,42 @@
user << "<span class='notice'>Access Denied</span>"
/obj/structure/closet/secure_closet/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(src.opened)
if(opened)
if(istype(W, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = W
if(src.large)
src.MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet
if(large)
MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet
else
user << "<span class='notice'>The locker is too small to stuff [G.affecting] into!</span>"
if(isrobot(user))
if(iswelder(W))
var/obj/item/weapon/weldingtool/WT = W
if(WT.isOn())
user.visible_message(
"<span class='warning'>[user] begins cutting [src] apart.</span>",
"<span class='notice'>You begin cutting [src] apart.</span>",
"You hear a welding torch on metal."
)
playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
if (!do_after(user, 2 SECONDS, act_target = src, extra_checks = CALLBACK(src, .proc/is_open)))
return
if(!WT.remove_fuel(0,user))
user << "<span class='notice'>You need more welding fuel to complete this task.</span>"
return
else
new /obj/item/stack/material/steel(loc)
user.visible_message(
"<span class='notice'>[src] has been cut apart by [user] with [WT].</span>",
"<span class='notice'>You cut apart [src] with [WT].</span>"
)
qdel(src)
return
else if(isrobot(user))
return
if(W.loc != user) // This should stop mounted modules ending up outside the module.
else if(W.loc != user) // This should stop mounted modules ending up outside the module.
return
user.drop_item()
if(W)
W.forceMove(src.loc)
else if(istype(W, /obj/item/weapon/melee/energy/blade))//Attempt to cut open locker if locked
if(emag_act(INFINITY, user, "<span class='danger'>The locker has been sliced open by [user] with \an [W]</span>!", "<span class='danger'>You hear metal being sliced and sparks flying.</span>"))
W:spark_system.queue()
playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1)
playsound(src.loc, "sparks", 50, 1)
W.forceMove(loc)
else if(isscrewdriver(W) && canbemoved)
if(screwed)
user << "<span class='notice'>You start to unscrew the locker from the floor...</span>"
@@ -105,22 +122,50 @@
else if(iswrench(W) && canbemoved)
if(wrenched && !screwed)
user << "<span class='notice'>You start to unfasten the bolts holding the locker in place...</span>"
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
if (do_after(user, 15 SECONDS, act_target = src))
user << "<span class='notice'>You unfasten the locker's bolts!</span>"
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
wrenched = 0
anchored = 0
else if(!wrenched)
user << "<span class='notice'>You start to fasten the bolts holding the locker in place...</span>"
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
if (do_after(user, 15, act_target = src))
user << "<span class='notice'>You fasten the locker's bolts!</span>"
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
wrenched = 1
anchored = 1
else if(!src.opened)
togglelock(user)//Attempt to lock locker if closed
else if(!opened)
if(istype(W, /obj/item/weapon/melee/energy/blade))//Attempt to cut open locker if locked
if(emag_act(INFINITY, user, "<span class='danger'>The locker has been sliced open by [user] with \an [W]</span>!", "<span class='danger'>You hear metal being sliced and sparks flying.</span>"))
spark(src, 5)
playsound(loc, 'sound/weapons/blade1.ogg', 50, 1)
playsound(loc, "sparks", 50, 1)
else if(iswelder(W))
var/obj/item/weapon/weldingtool/WT = W
if(WT.isOn())
user.visible_message(
"<span class='warning'>[user] begins welding [src] [welded ? "open" : "shut"].</span>",
"<span class='notice'>You begin welding [src] [welded ? "open" : "shut"].</span>",
"You hear a welding torch on metal."
)
playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
if (!do_after(user, 2 SECONDS, act_target = src, extra_checks = CALLBACK(src, .proc/is_closed)))
return
if(!WT.remove_fuel(0,user))
user << "<span class='notice'>You need more welding fuel to complete this task.</span>"
return
welded = !welded
update_icon()
user.visible_message(
"<span class='warning'>[src] has been [welded ? "welded shut" : "unwelded"] by [user].</span>",
"<span class='notice'>You weld [src] [!welded ? "open" : "shut"].</span>"
)
else
togglelock(user)
else
togglelock(user)//Attempt to lock locker if closed
/obj/structure/closet/secure_closet/emag_act(var/remaining_charges, var/mob/user, var/emag_source, var/visual_feedback = "", var/audible_feedback = "")
if(!broken)
@@ -139,11 +184,11 @@
return 1
/obj/structure/closet/secure_closet/attack_hand(mob/user as mob)
src.add_fingerprint(user)
if(src.locked)
src.togglelock(user)
add_fingerprint(user)
if(locked)
togglelock(user)
else
src.toggle(user)
toggle(user)
/obj/structure/closet/secure_closet/verb/verb_togglelock()
set src in oview(1) // One square distance
@@ -154,10 +199,10 @@
return
if(ishuman(usr))
src.add_fingerprint(usr)
src.togglelock(usr)
add_fingerprint(usr)
togglelock(usr)
else if(istype(usr, /mob/living/silicon/robot) && Adjacent(usr))
src.togglelock(usr)
togglelock(usr)
else
usr << "<span class='warning'>This mob type can't use this verb.</span>"
@@ -169,7 +214,7 @@
else
icon_state = icon_closed
if(welded)
add_overlay("welded")
add_overlay(welded_overlay_state)
else
icon_state = icon_opened
@@ -326,17 +326,30 @@
new /obj/item/weapon/gun/projectile/revolver/detective(src)
new /obj/item/clothing/accessory/holster/armpit(src)
/obj/structure/closet/secure_closet/detective/update_icon()
if(broken)
icon_state = icon_broken
else
if(!opened)
if(locked)
icon_state = icon_locked
/obj/structure/closet/secure_closet/detective/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(opened)
if(istype(W, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = W
if(large)
MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet
else
icon_state = icon_closed
user << "<span class='notice'>The locker is too small to stuff [G.affecting] into!</span>"
else if(isrobot(user))
return
else if(W.loc != user) // This should stop mounted modules ending up outside the module.
return
user.drop_item()
if(W)
W.forceMove(loc)
else if(!opened)
if(istype(W, /obj/item/weapon/melee/energy/blade))//Attempt to cut open locker if locked
if(emag_act(INFINITY, user, "<span class='danger'>The locker has been sliced open by [user] with \an [W]</span>!", "<span class='danger'>You hear metal being sliced and sparks flying.</span>"))
spark(src, 5)
playsound(loc, 'sound/weapons/blade1.ogg', 50, 1)
playsound(loc, "sparks", 50, 1)
else
icon_state = icon_opened
togglelock(user)//Attempt to lock locker if closed
/obj/structure/closet/secure_closet/csi
name = "forensic technician's locker"
@@ -83,14 +83,14 @@
/obj/structure/closet/statue/dump_contents()
for(var/obj/O in src)
O.forceMove(src.loc)
O.forceMove(loc)
for(var/mob/living/M in src)
if(imprisoned)
if(imprisoned.key)
M.key = imprisoned.key
M.forceMove(src.loc)
M.forceMove(loc)
M.sdisabilities &= ~MUTE
M.frozen = FALSE
M.take_overall_damage((M.health - health - 100),0) //any new damage the statue incurred is transfered to the mob
@@ -80,11 +80,7 @@
new /obj/item/weapon/extinguisher(src)
new /obj/item/clothing/head/hardhat/red(src)
/obj/structure/closet/firecloset/update_icon()
if(!opened)
icon_state = icon_closed
else
icon_state = icon_opened
/*
@@ -214,9 +210,3 @@
anchored = 1
density = 0
wall_mounted = 1
/obj/structure/closet/medical_wall/update_icon()
if(!opened)
icon_state = icon_closed
else
icon_state = icon_opened
@@ -21,7 +21,7 @@
icon_state = "emerg"
/obj/structure/closet/walllocker/emerglocker/toggle(mob/user as mob)
src.attack_hand(user)
attack_hand(user)
return
/obj/structure/closet/walllocker/emerglocker/attackby(obj/item/weapon/W as obj, mob/user as mob)
@@ -36,7 +36,7 @@
if(amount)
usr << "<spawn class='notice'>You take out some items from \the [src]."
for(var/path in spawnitems)
new path(src.loc)
new path(loc)
amount--
return
@@ -23,9 +23,9 @@
return 1
/obj/structure/closet/crate/open()
if(src.opened)
if(opened)
return 0
if(!src.can_open())
if(!can_open())
return 0
if(rigged && locate(/obj/item/device/radio/electropack) in src)
@@ -36,7 +36,7 @@
if(usr.stunned)
return 2
playsound(src.loc, 'sound/machines/click.ogg', 15, 1, -3)
playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
for(var/obj/O in src)
O.forceMove(get_turf(src))
@@ -51,17 +51,17 @@
M.visible_message(span("danger","\The [M.name] tumbles out of the [src]!"))
icon_state = icon_opened
src.opened = 1
opened = 1
pass_flags = 0
return 1
/obj/structure/closet/crate/close()
if(!src.opened)
if(!opened)
return 0
if(!src.can_close())
if(!can_close())
return 0
playsound(src.loc, 'sound/machines/click.ogg', 15, 1, -3)
playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
var/itemcount = 0
for(var/obj/O in get_turf(src))
if(itemcount >= storage_capacity)
@@ -76,7 +76,7 @@
itemcount++
icon_state = icon_closed
src.opened = 0
opened = 0
pass_flags = PASSTABLE//Crates can only slide under tables when closed
return 1
@@ -122,7 +122,7 @@
if (health <= 0)
for (var/atom/movable/A as mob|obj in src)
A.forceMove(src.loc)
A.forceMove(loc)
if (prob(50) && severity > 1)//Higher chance of breaking contents
A.ex_act(severity-1)
else
@@ -286,13 +286,13 @@
return !locked
/obj/structure/closet/crate/secure/proc/togglelock(mob/user as mob)
if(src.opened)
if(opened)
user << "<span class='notice'>Close the crate first.</span>"
return
if(src.broken)
if(broken)
user << "<span class='warning'>The crate appears to be broken.</span>"
return
if(src.allowed(user))
if(allowed(user))
set_locked(!locked, user)
return 1
else
@@ -317,17 +317,17 @@
return
if(ishuman(usr))
src.add_fingerprint(usr)
src.togglelock(usr)
add_fingerprint(usr)
togglelock(usr)
else
usr << "<span class='warning'>This mob type can't use this verb.</span>"
/obj/structure/closet/crate/secure/attack_hand(mob/user as mob)
src.add_fingerprint(user)
add_fingerprint(user)
if(locked)
return src.togglelock(user)
return togglelock(user)
else
return src.toggle(user)
return toggle(user)
/obj/structure/closet/crate/secure/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(is_type_in_list(W, list(/obj/item/weapon/packageWrap, /obj/item/stack/cable_coil, /obj/item/device/radio/electropack, /obj/item/weapon/wirecutters)))
@@ -335,7 +335,7 @@
if(istype(W, /obj/item/weapon/melee/energy/blade))
emag_act(INFINITY, user)
if(!opened)
src.togglelock(user)
togglelock(user)
return
return ..()
@@ -345,9 +345,9 @@
add_overlay(emag)
add_overlay(sparks)
CUT_OVERLAY_IN(sparks, 6)
playsound(src.loc, "sparks", 60, 1)
src.locked = 0
src.broken = 1
playsound(loc, "sparks", 60, 1)
locked = 0
broken = 1
user << "<span class='notice'>You unlock \the [src].</span>"
return 1
@@ -356,7 +356,7 @@
O.emp_act(severity)
if(!broken && !opened && prob(50/severity))
if(!locked)
src.locked = 1
locked = 1
cut_overlays()
add_overlay(redlight)
else
@@ -364,14 +364,14 @@
add_overlay(emag)
add_overlay(sparks)
CUT_OVERLAY_IN(sparks, 6)
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
src.locked = 0
playsound(loc, 'sound/effects/sparks4.ogg', 75, 1)
locked = 0
if(!opened && prob(20/severity))
if(!locked)
open()
else
src.req_access = list()
src.req_access += pick(get_all_station_access())
req_access = list()
req_access += pick(get_all_station_access())
..()
/obj/structure/closet/crate/plastic
@@ -569,7 +569,7 @@
. = ..()
if (.)//we can hold up to one large item
var/found = 0
for(var/obj/structure/S in src.loc)
for(var/obj/structure/S in loc)
if(S == src)
continue
if(!S.anchored)
@@ -577,7 +577,7 @@
S.forceMove(src)
break
if(!found)
for(var/obj/machinery/M in src.loc)
for(var/obj/machinery/M in loc)
if(!M.anchored)
M.forceMove(src)
break
@@ -598,7 +598,7 @@
. = ..()
if (.)//we can hold up to one large item
var/found = 0
for(var/obj/structure/S in src.loc)
for(var/obj/structure/S in loc)
if(S == src)
continue
if(!S.anchored)
@@ -606,7 +606,7 @@
S.forceMove(src)
break
if(!found)
for(var/obj/machinery/M in src.loc)
for(var/obj/machinery/M in loc)
if(!M.anchored)
M.forceMove(src)
break
@@ -675,8 +675,8 @@
quantity = _quantity
spawntypes = list(
"1" = STOCK_RARE_PROB * rarity,
"2" = STOCK_UNCOMMON_PROB * rarity,
"1" = STOCK_RARE_PROB * rarity,
"2" = STOCK_UNCOMMON_PROB * rarity,
"3" = (100 - ((STOCK_RARE_PROB * rarity) + (STOCK_UNCOMMON_PROB * rarity)))
)