Allow horizontal mobs to fit into crates

Also make stuffing into crates/lockers a mild stun akin to tabling
This commit is contained in:
Bjorn Neergaard
2016-02-09 07:47:59 -06:00
parent 2b8d835771
commit a16f554c35
8 changed files with 117 additions and 261 deletions

View File

@@ -1,75 +0,0 @@
/obj/structure/closet/crate/bin
desc = "A trash bin, place your trash here for the janitor to collect."
name = "trash bin"
icon_state = "largebins"
open_sound = 'sound/effects/bin_open.ogg'
close_sound = 'sound/effects/bin_close.ogg'
anchored = TRUE
allow_mobs = TRUE
/obj/structure/closet/crate/bin/New()
..()
update_icon()
/obj/structure/closet/crate/bin/update_icon()
..()
overlays.Cut()
if(contents.len == 0)
overlays += "largebing"
else if(contents.len >= storage_capacity)
overlays += "largebinr"
else
overlays += "largebino"
/obj/structure/closet/crate/bin/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/storage/bag/trash))
var/obj/item/weapon/storage/bag/trash/T = W
user << "<span class='notice'>You fill the bag.</span>"
for(var/obj/item/O in src)
if(T.can_be_inserted(O, 1))
O.loc = T
T.update_icon()
do_animate()
else if(istype(W, /obj/item/weapon/wrench))
anchored = !anchored
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
else
..()
/obj/structure/closet/crate/bin/MouseDrop_T(atom/movable/O as mob|obj, mob/user)
. = ..(O, user, 0, 0, 0)
if(.)
if(O != user)
user.visible_message("<span class='warning'>[user] tries to stuff [O] into [src].</span>", \
"<span class='danger'>You try to stuff [O] into [src].</span>", \
"<span class='italics'>You hear clanging.</span>")
if (!do_after(user, 40, target = src))
return
if(!..(O, user, 0, 0))
return
user.visible_message("<span class='warning'>[user] stuffs [O] into[src].</span>", \
"<span class='notice'>You stuff [O] into [src].</span>", \
"<span class='italics'>You hear a loud metal bang.</span>")
insert(O)
if(opened)
close()
/obj/structure/closet/crate/bin/proc/do_animate()
playsound(src.loc, open_sound, 15, 1, -3)
flick("animate_largebins", src)
spawn(13)
playsound(src.loc, close_sound, 15, 1, -3)
update_icon()
/obj/structure/closet/crate/bin/insert(obj/item/I, include_mobs = 0, animate = 0)
. = ..(I, include_mobs)
if(animate && .)
do_animate()
/obj/structure/closet/crate/bin/place(mob/user, obj/item/I)
if(contents.len >= storage_capacity)
return 1
if(!opened && user.drop_item())
insert(I, 0, 1)
return 1
return 0

View File

@@ -5,19 +5,19 @@
icon_state = "generic" icon_state = "generic"
density = 1 density = 1
var/icon_door = null var/icon_door = null
var/icon_door_override = 0 //override to have open overlay use icon different to its base's var/icon_door_override = FALSE //override to have open overlay use icon different to its base's
var/secure = 0 //secure locker or not, also used if overriding a non-secure locker with a secure door overlay to add fancy lights var/secure = FALSE //secure locker or not, also used if overriding a non-secure locker with a secure door overlay to add fancy lights
var/opened = 0 var/opened = FALSE
var/welded = 0 var/welded = FALSE
var/locked = 0 var/locked = FALSE
var/broken = 0 var/broken = FALSE
var/large = 1 var/large = TRUE
var/wall_mounted = 0 //never solid (You can always pass over it) var/wall_mounted = 0 //never solid (You can always pass over it)
var/health = 100 var/health = 100
var/breakout_time = 2 var/breakout_time = 2
var/lastbang var/lastbang
var/can_weld_shut = 1 var/can_weld_shut = TRUE
var/allow_mobs = TRUE var/horizontal = TRUE
var/allow_objects = FALSE var/allow_objects = FALSE
var/allow_dense = FALSE var/allow_dense = FALSE
var/max_mob_size = MOB_SIZE_HUMAN //Biggest mob_size accepted by the container var/max_mob_size = MOB_SIZE_HUMAN //Biggest mob_size accepted by the container
@@ -77,8 +77,9 @@
return get_turf(src) return get_turf(src)
/obj/structure/closet/CanPass(atom/movable/mover, turf/target, height=0) /obj/structure/closet/CanPass(atom/movable/mover, turf/target, height=0)
if(height==0 || wall_mounted) return 1 if(height == 0 || wall_mounted)
return (!density) return 1
return !density
/obj/structure/closet/proc/can_open() /obj/structure/closet/proc/can_open()
if(welded || locked) if(welded || locked)
@@ -95,7 +96,7 @@
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
for(var/atom/movable/AM in src) for(var/atom/movable/AM in src)
AM.forceMove(T) AM.forceMove(T)
if(throwing) //you keep some momentum when getting out of a thrown closet if(throwing) // you keep some momentum when getting out of a thrown closet
step(AM, dir) step(AM, dir)
if(throwing) if(throwing)
throwing = 0 throwing = 0
@@ -108,9 +109,9 @@
/obj/structure/closet/proc/open() /obj/structure/closet/proc/open()
if(opened || !can_open()) if(opened || !can_open())
return 0 return
opened = 1
playsound(loc, open_sound, 15, 1, -3) playsound(loc, open_sound, 15, 1, -3)
opened = 1
density = 0 density = 0
dump_contents() dump_contents()
update_icon() update_icon()
@@ -125,7 +126,7 @@
if(L.buckled || L.buckled_mob) if(L.buckled || L.buckled_mob)
return return
if(L.mob_size > MOB_SIZE_TINY) // Tiny mobs are treated as items. if(L.mob_size > MOB_SIZE_TINY) // Tiny mobs are treated as items.
if(!allow_mobs) if(horizontal && !L.lying)
return return
if(L.mob_size > max_mob_size) if(L.mob_size > max_mob_size)
return return
@@ -154,9 +155,8 @@
if(!opened || !can_close()) if(!opened || !can_close())
return 0 return 0
take_contents() take_contents()
opened = 0
playsound(loc, close_sound, 15, 1, -3) playsound(loc, close_sound, 15, 1, -3)
opened = 0
density = 1 density = 1
update_icon() update_icon()
return 1 return 1
@@ -192,79 +192,73 @@
qdel(src) qdel(src)
/obj/structure/closet/attackby(obj/item/weapon/W, mob/user, params) /obj/structure/closet/attackby(obj/item/weapon/W, mob/user, params)
if(user.loc == src) if(user in src)
return return
if(opened) if(opened)
if(istype(W,/obj/item/tk_grab))
return 0
if(istype(W, cutting_tool)) if(istype(W, cutting_tool))
if(istype(cutting_tool, /obj/item/weapon/weldingtool)) if(istype(cutting_tool, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W var/obj/item/weapon/weldingtool/WT = W
if(!WT.remove_fuel(0,user)) if(!WT.remove_fuel(0, user))
return return
user << "<span class='notice'>You begin cutting \the [src] apart...</span>" user << "<span class='notice'>You begin cutting \the [src] apart...</span>"
playsound(loc, cutting_sound, 40, 1) playsound(loc, cutting_sound, 40, 1)
if(do_after(user,40/W.toolspeed,1, target = src)) if(do_after(user, 40/W.toolspeed, 1, target = src))
if( !opened || !istype(src, /obj/structure/closet) || !user || !WT || !WT.isOn() || !user.loc ) if(!opened || !WT.isOn())
return return
playsound(loc, cutting_sound, 50, 1) playsound(loc, cutting_sound, 50, 1)
new material_drop(loc) new material_drop(loc)
visible_message("[user] has cut \the [src] apart with \the [WT].", "<span class='italics'>You hear welding.</span>") visible_message("<span class='notice'>[user] slices apart \the [src].</span>",
"<span class='notice'>You cut \the [src] apart with \the [WT].</span>",
"<span class='italics'>You hear welding.</span>")
qdel(src) qdel(src)
return else if(user.drop_item())
if(isrobot(user))
return
if(user.drop_item())
W.Move(loc) W.Move(loc)
else else
if(istype(W, /obj/item/stack/packageWrap)) if(istype(W, /obj/item/stack/packageWrap))
return return
if(istype(W, /obj/item/weapon/weldingtool) && can_weld_shut) if(istype(W, /obj/item/weapon/weldingtool) && can_weld_shut)
var/obj/item/weapon/weldingtool/WT = W var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0,user)) if(!WT.remove_fuel(0, user))
user << "<span class='notice'>You begin [welded ? "unwelding":"welding"] \the [src]...</span>"
playsound(loc, 'sound/items/Welder2.ogg', 40, 1)
if(do_after(user,40,1, target = src))
if(opened || !istype(src, /obj/structure/closet) || !user || !WT || !WT.isOn() || !user.loc )
return
playsound(loc, 'sound/items/welder.ogg', 50, 1)
welded = !welded
user << "<span class='notice'>You [welded ? "weld [src] shut":"unweld [src]"].</span>"
update_icon()
user.visible_message("[user.name] has [welded ? "welded [src] shut":"unwelded [src]"].", "<span class='warning'>You [welded ? "weld [src] shut":"unweld [src]"].</span>")
return return
if(secure && broken) user << "<span class='notice'>You begin [welded ? "unwelding":"welding"] \the [src]...</span>"
user << "<span class='notice'>The locker appears to be broken.</span>" playsound(loc, 'sound/items/Welder2.ogg', 40, 1)
return if(do_after(user, 40, 1, target = src))
if(!place(user, W) && !isnull(W)) if(opened || !WT.isOn())
return
playsound(loc, 'sound/items/welder.ogg', 50, 1)
welded = !welded
visible_message("<span class='notice'>[user] [welded ? "welds shut" : "unweldeds"] \the [src].</span>",
"<span class='notice'>You [welded ? "weld" : "unwelded"] \the [src] with \the [WT].</span>",
"<span class='italics'>You hear welding.</span>")
update_icon()
else
attack_hand(user) attack_hand(user)
/obj/structure/closet/proc/place(mob/user, obj/item/I) /obj/structure/closet/MouseDrop_T(atom/movable/O, mob/user)
if(!opened && secure) if(!istype(O) || O.anchored || istype(O, /obj/screen))
togglelock(user) return
return 1 if(user.incapacitated() || user.lying)
return 0 return
if(!Adjacent(user) || !user.Adjacent(O))
return
if(!opened || istype(O, /obj/structure/closet))
return
if(user == O)
return
/obj/structure/closet/MouseDrop_T(atom/movable/O as mob|obj, mob/user, needs_opened = 1, show_message = 1, move_them = 1)
if(istype(O, /obj/screen)) //fix for HUD elements making their way into the world -Pete
return 0
if(!isturf(O.loc))
return 0
if(user.restrained() || user.stat || user.weakened || user.stunned || user.paralysis || user.lying)
return 0
if((!( istype(O, /atom/movable) ) || O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1))
return 0
if(!istype(user.loc, /turf)) // are you in a container/closet/pod/etc? Will also check for null loc
return 0
if(needs_opened && !opened)
return 0
if(istype(O, /obj/structure/closet))
return 0
if(move_them)
step_towards(O, loc)
if(show_message && user != O)
user.show_viewers("<span class='danger'>[user] stuffs [O] into [src]!</span>")
add_fingerprint(user) add_fingerprint(user)
user.visible_message("<span class='warning'>[user] tries to stuff [O] into [src].</span>", \
"<span class='warning'>You try to stuff [O] into [src].</span>", \
"<span class='italics'>You hear clanging.</span>")
if(do_after(user, 40, target = src))
user.visible_message("<span class='notice'>[user] stuffs [O] into [src].</span>", \
"<span class='notice'>You stuff [O] into [src].</span>", \
"<span class='italics'>You hear a loud metal bang.</span>")
var/mob/living/L = O
if(istype(L))
L.Weaken(2)
step_towards(O, loc)
close()
return 1 return 1
/obj/structure/closet/relaymove(mob/user) /obj/structure/closet/relaymove(mob/user)
@@ -277,10 +271,6 @@
for(var/mob/M in get_hearers_in_view(src, null)) for(var/mob/M in get_hearers_in_view(src, null))
M.show_message("<FONT size=[max(0, 5 - get_dist(src, M))]>BANG, bang!</FONT>", 2) M.show_message("<FONT size=[max(0, 5 - get_dist(src, M))]>BANG, bang!</FONT>", 2)
/obj/structure/closet/attack_paw(mob/user)
return attack_hand(user)
/obj/structure/closet/attack_hand(mob/user) /obj/structure/closet/attack_hand(mob/user)
add_fingerprint(user) add_fingerprint(user)
if(user.lying && get_dist(src, user) > 0) if(user.lying && get_dist(src, user) > 0)
@@ -331,11 +321,12 @@
welded = 0 //applies to all lockers lockers welded = 0 //applies to all lockers lockers
locked = 0 //applies to critter crates and secure lockers only locked = 0 //applies to critter crates and secure lockers only
broken = 1 //applies to secure lockers only broken = 1 //applies to secure lockers only
user.visible_message("<span class='danger'>[user] successfully broke out of [src]!</span>", "<span class='notice'>You successfully break out of [src]!</span>") user.visible_message("<span class='danger'>[user] successfully broke out of [src]!</span>",
"<span class='notice'>You successfully break out of [src]!</span>")
if(istype(loc, /obj/structure/bigDelivery)) if(istype(loc, /obj/structure/bigDelivery))
var/obj/structure/bigDelivery/D = loc var/obj/structure/bigDelivery/D = loc
qdel(D) qdel(D)
else if(istype( loc, /obj/mecha)) else if(istype(loc, /obj/mecha))
loc = get_turf(loc) loc = get_turf(loc)
open() open()
else else
@@ -346,8 +337,6 @@
if(!user.canUseTopic(user)) if(!user.canUseTopic(user))
user << "<span class='warning'>You can't do that right now!</span>" user << "<span class='warning'>You can't do that right now!</span>"
return return
if(broken)
user << "<span class='warning'>\The [src] is broken!</span>"
if(opened || !secure || !in_range(src, user)) if(opened || !secure || !in_range(src, user))
return return
else else
@@ -356,15 +345,15 @@
/obj/structure/closet/proc/togglelock(mob/living/user) /obj/structure/closet/proc/togglelock(mob/living/user)
if(secure && !broken) if(secure && !broken)
if(allowed(user)) if(allowed(user))
locked = !locked
add_fingerprint(user) add_fingerprint(user)
locked = !locked
user.visible_message("<span class='notice'>[user] [locked ? null : "un"]locks [src].</span>", user.visible_message("<span class='notice'>[user] [locked ? null : "un"]locks [src].</span>",
"<span class='notice'>You [locked ? null : "un"]locks [src].</span>") "<span class='notice'>You [locked ? null : "un"]locks [src].</span>")
update_icon() update_icon()
else else
user << "<span class='notice'>Access Denied</span>" user << "<span class='notice'>Access Denied</span>"
else else if(secure && broken)
return user << "<span class='warning'>\The [src] is broken!</span>"
/obj/structure/closet/emag_act(mob/user) /obj/structure/closet/emag_act(mob/user)
if(secure && !broken) if(secure && !broken)

View File

@@ -1,88 +0,0 @@
/obj/structure/closet/critter
name = "critter crate"
desc = "A crate designed for safe transport of animals. Only openable from the the outside."
icon_state = "critter"
var/already_opened = 0
var/content_mob = null
var/amount = 1
/obj/structure/closet/critter/can_open()
if(locked || welded)
return 0
return 1
/obj/structure/closet/critter/open()
if(!can_open())
return 0
if(content_mob == null) //making sure we don't spawn anything too eldritch
already_opened = 1
return ..()
if(content_mob != null && already_opened == 0)
for(var/i = 1, i <= amount, i++)
new content_mob(loc)
already_opened = 1
..()
/obj/structure/closet/critter/close()
..()
locked = 1
return 1
/obj/structure/closet/critter/attack_hand(mob/user)
src.add_fingerprint(user)
if(src.loc == user.loc)
user << "<span class='notice'>It won't budge!</span>"
toggle()
else
locked = 0
toggle()
/obj/structure/closet/critter/corgi
name = "corgi crate"
content_mob = /mob/living/simple_animal/pet/dog/corgi
/obj/structure/closet/critter/corgi/New()
if(prob(50))
content_mob = /mob/living/simple_animal/pet/dog/corgi/Lisa
..()
/obj/structure/closet/critter/cow
name = "cow crate"
content_mob = /mob/living/simple_animal/cow
/obj/structure/closet/critter/goat
name = "goat crate"
content_mob = /mob/living/simple_animal/hostile/retaliate/goat
/obj/structure/closet/critter/chick
name = "chicken crate"
content_mob = /mob/living/simple_animal/chick
/obj/structure/closet/critter/chick/New()
amount = rand(1, 3)
..()
/obj/structure/closet/critter/cat
name = "cat crate"
content_mob = /mob/living/simple_animal/pet/cat
/obj/structure/closet/critter/cat/New()
if(prob(50))
content_mob = /mob/living/simple_animal/pet/cat/Proc
..()
/obj/structure/closet/critter/pug
name = "pug crate"
content_mob = /mob/living/simple_animal/pet/dog/pug
/obj/structure/closet/critter/fox
name = "fox crate"
content_mob = /mob/living/simple_animal/pet/fox
/obj/structure/closet/critter/butterfly
name = "butterflies crate"
content_mob = /mob/living/simple_animal/butterfly
amount = 50

View File

@@ -55,9 +55,9 @@
M.adjustFireLoss(intialFire - M.getFireLoss()) M.adjustFireLoss(intialFire - M.getFireLoss())
M.adjustBruteLoss(intialBrute - M.getBruteLoss()) M.adjustBruteLoss(intialBrute - M.getBruteLoss())
M.setOxyLoss(intialOxy) M.setOxyLoss(intialOxy)
if (timer <= 0) if(timer <= 0)
dump_contents() dump_contents()
SSobj.processing.Remove(src) SSobj.processing -= src
qdel(src) qdel(src)
/obj/structure/closet/statue/dump_contents() /obj/structure/closet/statue/dump_contents()
@@ -129,9 +129,6 @@
for(var/mob/M in src) for(var/mob/M in src)
shatter(M) shatter(M)
/obj/structure/closet/statue/place()
return
/obj/structure/closet/statue/MouseDrop_T() /obj/structure/closet/statue/MouseDrop_T()
return return
@@ -148,7 +145,7 @@
return return
/obj/structure/closet/statue/proc/shatter(mob/user) /obj/structure/closet/statue/proc/shatter(mob/user)
if (user) if(user)
user.dust() user.dust()
dump_contents() dump_contents()
visible_message("<span class='danger'>[src] shatters!.</span>") visible_message("<span class='danger'>[src] shatters!.</span>")

View File

@@ -5,7 +5,7 @@
icon_state = "crate" icon_state = "crate"
req_access = null req_access = null
can_weld_shut = FALSE can_weld_shut = FALSE
allow_mobs = FALSE horizontal = TRUE
allow_objects = TRUE allow_objects = TRUE
allow_dense = TRUE allow_dense = TRUE
var/obj/item/weapon/paper/manifest/manifest var/obj/item/weapon/paper/manifest/manifest
@@ -29,17 +29,6 @@
if(!toggle()) if(!toggle())
togglelock(user) togglelock(user)
/obj/structure/closet/crate/attackby(obj/item/weapon/W, mob/user, params)
if(opened)
if(isrobot(user))
return
if(user.drop_item())
W.Move(loc)
else if(istype(W, /obj/item/stack/packageWrap))
return
else if(!place(user, W))
attack_hand(user)
/obj/structure/closet/crate/proc/tear_manifest(mob/user) /obj/structure/closet/crate/proc/tear_manifest(mob/user)
user << "<span class='notice'>You tear the manifest off of the crate.</span>" user << "<span class='notice'>You tear the manifest off of the crate.</span>"
playsound(src, 'sound/items/poster_ripped.ogg', 75, 1) playsound(src, 'sound/items/poster_ripped.ogg', 75, 1)

View File

@@ -0,0 +1,44 @@
/obj/structure/closet/crate/bin
desc = "A trash bin, place your trash here for the janitor to collect."
name = "trash bin"
icon_state = "largebins"
open_sound = 'sound/effects/bin_open.ogg'
close_sound = 'sound/effects/bin_close.ogg'
anchored = TRUE
horizontal = FALSE
/obj/structure/closet/crate/bin/New()
..()
update_icon()
/obj/structure/closet/crate/bin/update_icon()
..()
overlays.Cut()
if(contents.len == 0)
overlays += "largebing"
else if(contents.len >= storage_capacity)
overlays += "largebinr"
else
overlays += "largebino"
/obj/structure/closet/crate/bin/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/storage/bag/trash))
var/obj/item/weapon/storage/bag/trash/T = W
user << "<span class='notice'>You fill the bag.</span>"
for(var/obj/item/O in src)
if(T.can_be_inserted(O, 1))
O.loc = T
T.update_icon()
do_animate()
else if(istype(W, /obj/item/weapon/wrench))
anchored = !anchored
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
else
..()
/obj/structure/closet/crate/bin/proc/do_animate()
playsound(loc, open_sound, 15, 1, -3)
flick("animate_largebins", src)
spawn(13)
playsound(loc, close_sound, 15, 1, -3)
update_icon()

View File

@@ -2,7 +2,7 @@
name = "critter crate" name = "critter crate"
desc = "A crate designed for safe transport of animals. It has an oxygen tank for safe transport in space." desc = "A crate designed for safe transport of animals. It has an oxygen tank for safe transport in space."
icon_state = "crittercrate" icon_state = "crittercrate"
allow_mobs = TRUE horizontal = FALSE
allow_objects = FALSE allow_objects = FALSE
breakout_time = 1 breakout_time = 1
material_drop = /obj/item/stack/sheet/mineral/wood material_drop = /obj/item/stack/sheet/mineral/wood

View File

@@ -704,7 +704,6 @@
#include "code\game\objects\structures\beds_chairs\alien_nest.dm" #include "code\game\objects\structures\beds_chairs\alien_nest.dm"
#include "code\game\objects\structures\beds_chairs\bed.dm" #include "code\game\objects\structures\beds_chairs\bed.dm"
#include "code\game\objects\structures\beds_chairs\chair.dm" #include "code\game\objects\structures\beds_chairs\chair.dm"
#include "code\game\objects\structures\crates_lockers\bins.dm"
#include "code\game\objects\structures\crates_lockers\closets.dm" #include "code\game\objects\structures\crates_lockers\closets.dm"
#include "code\game\objects\structures\crates_lockers\crates.dm" #include "code\game\objects\structures\crates_lockers\crates.dm"
#include "code\game\objects\structures\crates_lockers\closets\cardboardbox.dm" #include "code\game\objects\structures\crates_lockers\closets\cardboardbox.dm"
@@ -727,6 +726,7 @@
#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm"
#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm"
#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\security.dm"
#include "code\game\objects\structures\crates_lockers\crates\bins.dm"
#include "code\game\objects\structures\crates_lockers\crates\critter.dm" #include "code\game\objects\structures\crates_lockers\crates\critter.dm"
#include "code\game\objects\structures\crates_lockers\crates\large.dm" #include "code\game\objects\structures\crates_lockers\crates\large.dm"
#include "code\game\objects\structures\crates_lockers\crates\secure.dm" #include "code\game\objects\structures\crates_lockers\crates\secure.dm"