mirror of
https://github.com/Yawn-Wider/YWPolarisVore.git
synced 2026-08-24 05:28:16 +01:00
Merge branch 'release' of https://github.com/VOREStation/VOREStation into upstream-update
This commit is contained in:
@@ -1,248 +1,248 @@
|
||||
/*
|
||||
CONTAINS:
|
||||
BEDSHEETS
|
||||
LINEN BINS
|
||||
*/
|
||||
|
||||
/obj/item/weapon/bedsheet
|
||||
name = "bedsheet"
|
||||
desc = "A surprisingly soft linen bedsheet."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "sheet"
|
||||
slot_flags = SLOT_BACK
|
||||
plane = MOB_PLANE
|
||||
layer = BELOW_MOB_LAYER
|
||||
throwforce = 1
|
||||
throw_speed = 1
|
||||
throw_range = 2
|
||||
w_class = ITEMSIZE_SMALL
|
||||
drop_sound = 'sound/items/drop/clothing.ogg'
|
||||
pickup_sound = 'sound/items/pickup/clothing.ogg'
|
||||
|
||||
/obj/item/weapon/bedsheet/attack_self(mob/user as mob)
|
||||
user.drop_item()
|
||||
if(layer == initial(layer))
|
||||
layer = ABOVE_MOB_LAYER
|
||||
else
|
||||
reset_plane_and_layer()
|
||||
add_fingerprint(user)
|
||||
return
|
||||
|
||||
/obj/item/weapon/bedsheet/attackby(obj/item/I, mob/user)
|
||||
if(is_sharp(I))
|
||||
user.visible_message("<b>\The [user]</b> begins cutting up [src] with [I].", "<span class='notice'>You begin cutting up [src] with [I].</span>")
|
||||
if(do_after(user, 50))
|
||||
to_chat(user, "<span class='notice'>You cut [src] into pieces!</span>")
|
||||
for(var/i in 1 to rand(2,5))
|
||||
new /obj/item/weapon/reagent_containers/glass/rag(drop_location())
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/weapon/bedsheet/blue
|
||||
icon_state = "sheetblue"
|
||||
|
||||
/obj/item/weapon/bedsheet/green
|
||||
icon_state = "sheetgreen"
|
||||
|
||||
/obj/item/weapon/bedsheet/orange
|
||||
icon_state = "sheetorange"
|
||||
|
||||
/obj/item/weapon/bedsheet/purple
|
||||
icon_state = "sheetpurple"
|
||||
|
||||
/obj/item/weapon/bedsheet/rainbow
|
||||
icon_state = "sheetrainbow"
|
||||
|
||||
/obj/item/weapon/bedsheet/red
|
||||
icon_state = "sheetred"
|
||||
|
||||
/obj/item/weapon/bedsheet/yellow
|
||||
icon_state = "sheetyellow"
|
||||
|
||||
/obj/item/weapon/bedsheet/mime
|
||||
icon_state = "sheetmime"
|
||||
|
||||
/obj/item/weapon/bedsheet/clown
|
||||
icon_state = "sheetclown"
|
||||
item_state = "sheetrainbow"
|
||||
|
||||
/obj/item/weapon/bedsheet/captain
|
||||
icon_state = "sheetcaptain"
|
||||
|
||||
/obj/item/weapon/bedsheet/rd
|
||||
icon_state = "sheetrd"
|
||||
|
||||
/obj/item/weapon/bedsheet/medical
|
||||
icon_state = "sheetmedical"
|
||||
|
||||
/obj/item/weapon/bedsheet/hos
|
||||
icon_state = "sheethos"
|
||||
|
||||
/obj/item/weapon/bedsheet/hop
|
||||
icon_state = "sheethop"
|
||||
|
||||
/obj/item/weapon/bedsheet/ce
|
||||
icon_state = "sheetce"
|
||||
|
||||
/obj/item/weapon/bedsheet/brown
|
||||
icon_state = "sheetbrown"
|
||||
|
||||
/obj/item/weapon/bedsheet/ian
|
||||
icon_state = "sheetian"
|
||||
|
||||
/obj/item/weapon/bedsheet/double
|
||||
icon_state = "doublesheet"
|
||||
item_state = "sheet"
|
||||
|
||||
/obj/item/weapon/bedsheet/bluedouble
|
||||
icon_state = "doublesheetblue"
|
||||
item_state = "sheetblue"
|
||||
|
||||
/obj/item/weapon/bedsheet/greendouble
|
||||
icon_state = "doublesheetgreen"
|
||||
item_state = "sheetgreen"
|
||||
|
||||
/obj/item/weapon/bedsheet/orangedouble
|
||||
icon_state = "doublesheetorange"
|
||||
item_state = "sheetorange"
|
||||
|
||||
/obj/item/weapon/bedsheet/purpledouble
|
||||
icon_state = "doublesheetpurple"
|
||||
item_state = "sheetpurple"
|
||||
|
||||
/obj/item/weapon/bedsheet/rainbowdouble //all the way across the sky.
|
||||
icon_state = "doublesheetrainbow"
|
||||
item_state = "sheetrainbow"
|
||||
|
||||
/obj/item/weapon/bedsheet/reddouble
|
||||
icon_state = "doublesheetred"
|
||||
item_state = "sheetred"
|
||||
|
||||
/obj/item/weapon/bedsheet/yellowdouble
|
||||
icon_state = "doublesheetyellow"
|
||||
item_state = "sheetyellow"
|
||||
|
||||
/obj/item/weapon/bedsheet/mimedouble
|
||||
icon_state = "doublesheetmime"
|
||||
item_state = "sheetmime"
|
||||
|
||||
/obj/item/weapon/bedsheet/clowndouble
|
||||
icon_state = "doublesheetclown"
|
||||
item_state = "sheetrainbow"
|
||||
|
||||
/obj/item/weapon/bedsheet/captaindouble
|
||||
icon_state = "doublesheetcaptain"
|
||||
item_state = "sheetcaptain"
|
||||
|
||||
/obj/item/weapon/bedsheet/rddouble
|
||||
icon_state = "doublesheetrd"
|
||||
item_state = "sheetrd"
|
||||
|
||||
/obj/item/weapon/bedsheet/hosdouble
|
||||
icon_state = "doublesheethos"
|
||||
item_state = "sheethos"
|
||||
|
||||
/obj/item/weapon/bedsheet/hopdouble
|
||||
icon_state = "doublesheethop"
|
||||
item_state = "sheethop"
|
||||
|
||||
/obj/item/weapon/bedsheet/cedouble
|
||||
icon_state = "doublesheetce"
|
||||
item_state = "sheetce"
|
||||
|
||||
/obj/item/weapon/bedsheet/browndouble
|
||||
icon_state = "doublesheetbrown"
|
||||
item_state = "sheetbrown"
|
||||
|
||||
/obj/item/weapon/bedsheet/iandouble
|
||||
icon_state = "doublesheetian"
|
||||
item_state = "sheetian"
|
||||
|
||||
/obj/structure/bedsheetbin
|
||||
name = "linen bin"
|
||||
desc = "A linen bin. It looks rather cosy."
|
||||
icon = 'icons/obj/structures.dmi'
|
||||
icon_state = "linenbin-full"
|
||||
anchored = TRUE
|
||||
var/amount = 20
|
||||
var/list/sheets = list()
|
||||
var/obj/item/hidden = null
|
||||
|
||||
|
||||
/obj/structure/bedsheetbin/examine(mob/user)
|
||||
. = ..()
|
||||
|
||||
if(amount < 1)
|
||||
. += "There are no bed sheets in the bin."
|
||||
else if(amount == 1)
|
||||
. += "There is one bed sheet in the bin."
|
||||
else
|
||||
. += "There are [amount] bed sheets in the bin."
|
||||
|
||||
/obj/structure/bedsheetbin/update_icon()
|
||||
switch(amount)
|
||||
if(0) icon_state = "linenbin-empty"
|
||||
if(1 to amount / 2) icon_state = "linenbin-half"
|
||||
else icon_state = "linenbin-full"
|
||||
|
||||
|
||||
/obj/structure/bedsheetbin/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(istype(I, /obj/item/weapon/bedsheet))
|
||||
user.drop_item()
|
||||
I.loc = src
|
||||
sheets.Add(I)
|
||||
amount++
|
||||
to_chat(user, "<span class='notice'>You put [I] in [src].</span>")
|
||||
else if(amount && !hidden && I.w_class < ITEMSIZE_LARGE) //make sure there's sheets to hide it among, make sure nothing else is hidden in there.
|
||||
user.drop_item()
|
||||
I.loc = src
|
||||
hidden = I
|
||||
to_chat(user, "<span class='notice'>You hide [I] among the sheets.</span>")
|
||||
|
||||
/obj/structure/bedsheetbin/attack_hand(mob/user as mob)
|
||||
if(amount >= 1)
|
||||
amount--
|
||||
|
||||
var/obj/item/weapon/bedsheet/B
|
||||
if(sheets.len > 0)
|
||||
B = sheets[sheets.len]
|
||||
sheets.Remove(B)
|
||||
|
||||
else
|
||||
B = new /obj/item/weapon/bedsheet(loc)
|
||||
|
||||
B.loc = user.loc
|
||||
user.put_in_hands(B)
|
||||
to_chat(user, "<span class='notice'>You take [B] out of [src].</span>")
|
||||
|
||||
if(hidden)
|
||||
hidden.loc = user.loc
|
||||
to_chat(user, "<span class='notice'>[hidden] falls out of [B]!</span>")
|
||||
hidden = null
|
||||
|
||||
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/structure/bedsheetbin/attack_tk(mob/user as mob)
|
||||
if(amount >= 1)
|
||||
amount--
|
||||
|
||||
var/obj/item/weapon/bedsheet/B
|
||||
if(sheets.len > 0)
|
||||
B = sheets[sheets.len]
|
||||
sheets.Remove(B)
|
||||
|
||||
else
|
||||
B = new /obj/item/weapon/bedsheet(loc)
|
||||
|
||||
B.loc = loc
|
||||
to_chat(user, "<span class='notice'>You telekinetically remove [B] from [src].</span>")
|
||||
update_icon()
|
||||
|
||||
if(hidden)
|
||||
hidden.loc = loc
|
||||
hidden = null
|
||||
|
||||
|
||||
add_fingerprint(user)
|
||||
/*
|
||||
CONTAINS:
|
||||
BEDSHEETS
|
||||
LINEN BINS
|
||||
*/
|
||||
|
||||
/obj/item/weapon/bedsheet
|
||||
name = "bedsheet"
|
||||
desc = "A surprisingly soft linen bedsheet."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "sheet"
|
||||
slot_flags = SLOT_BACK
|
||||
plane = MOB_PLANE
|
||||
layer = BELOW_MOB_LAYER
|
||||
throwforce = 1
|
||||
throw_speed = 1
|
||||
throw_range = 2
|
||||
w_class = ITEMSIZE_SMALL
|
||||
drop_sound = 'sound/items/drop/clothing.ogg'
|
||||
pickup_sound = 'sound/items/pickup/clothing.ogg'
|
||||
|
||||
/obj/item/weapon/bedsheet/attack_self(mob/user as mob)
|
||||
user.drop_item()
|
||||
if(layer == initial(layer))
|
||||
layer = ABOVE_MOB_LAYER
|
||||
else
|
||||
reset_plane_and_layer()
|
||||
add_fingerprint(user)
|
||||
return
|
||||
|
||||
/obj/item/weapon/bedsheet/attackby(obj/item/I, mob/user)
|
||||
if(is_sharp(I))
|
||||
user.visible_message("<b>\The [user]</b> begins cutting up [src] with [I].", "<span class='notice'>You begin cutting up [src] with [I].</span>")
|
||||
if(do_after(user, 50))
|
||||
to_chat(user, "<span class='notice'>You cut [src] into pieces!</span>")
|
||||
for(var/i in 1 to rand(2,5))
|
||||
new /obj/item/weapon/reagent_containers/glass/rag(drop_location())
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/weapon/bedsheet/blue
|
||||
icon_state = "sheetblue"
|
||||
|
||||
/obj/item/weapon/bedsheet/green
|
||||
icon_state = "sheetgreen"
|
||||
|
||||
/obj/item/weapon/bedsheet/orange
|
||||
icon_state = "sheetorange"
|
||||
|
||||
/obj/item/weapon/bedsheet/purple
|
||||
icon_state = "sheetpurple"
|
||||
|
||||
/obj/item/weapon/bedsheet/rainbow
|
||||
icon_state = "sheetrainbow"
|
||||
|
||||
/obj/item/weapon/bedsheet/red
|
||||
icon_state = "sheetred"
|
||||
|
||||
/obj/item/weapon/bedsheet/yellow
|
||||
icon_state = "sheetyellow"
|
||||
|
||||
/obj/item/weapon/bedsheet/mime
|
||||
icon_state = "sheetmime"
|
||||
|
||||
/obj/item/weapon/bedsheet/clown
|
||||
icon_state = "sheetclown"
|
||||
item_state = "sheetrainbow"
|
||||
|
||||
/obj/item/weapon/bedsheet/captain
|
||||
icon_state = "sheetcaptain"
|
||||
|
||||
/obj/item/weapon/bedsheet/rd
|
||||
icon_state = "sheetrd"
|
||||
|
||||
/obj/item/weapon/bedsheet/medical
|
||||
icon_state = "sheetmedical"
|
||||
|
||||
/obj/item/weapon/bedsheet/hos
|
||||
icon_state = "sheethos"
|
||||
|
||||
/obj/item/weapon/bedsheet/hop
|
||||
icon_state = "sheethop"
|
||||
|
||||
/obj/item/weapon/bedsheet/ce
|
||||
icon_state = "sheetce"
|
||||
|
||||
/obj/item/weapon/bedsheet/brown
|
||||
icon_state = "sheetbrown"
|
||||
|
||||
/obj/item/weapon/bedsheet/ian
|
||||
icon_state = "sheetian"
|
||||
|
||||
/obj/item/weapon/bedsheet/double
|
||||
icon_state = "doublesheet"
|
||||
item_state = "sheet"
|
||||
|
||||
/obj/item/weapon/bedsheet/bluedouble
|
||||
icon_state = "doublesheetblue"
|
||||
item_state = "sheetblue"
|
||||
|
||||
/obj/item/weapon/bedsheet/greendouble
|
||||
icon_state = "doublesheetgreen"
|
||||
item_state = "sheetgreen"
|
||||
|
||||
/obj/item/weapon/bedsheet/orangedouble
|
||||
icon_state = "doublesheetorange"
|
||||
item_state = "sheetorange"
|
||||
|
||||
/obj/item/weapon/bedsheet/purpledouble
|
||||
icon_state = "doublesheetpurple"
|
||||
item_state = "sheetpurple"
|
||||
|
||||
/obj/item/weapon/bedsheet/rainbowdouble //all the way across the sky.
|
||||
icon_state = "doublesheetrainbow"
|
||||
item_state = "sheetrainbow"
|
||||
|
||||
/obj/item/weapon/bedsheet/reddouble
|
||||
icon_state = "doublesheetred"
|
||||
item_state = "sheetred"
|
||||
|
||||
/obj/item/weapon/bedsheet/yellowdouble
|
||||
icon_state = "doublesheetyellow"
|
||||
item_state = "sheetyellow"
|
||||
|
||||
/obj/item/weapon/bedsheet/mimedouble
|
||||
icon_state = "doublesheetmime"
|
||||
item_state = "sheetmime"
|
||||
|
||||
/obj/item/weapon/bedsheet/clowndouble
|
||||
icon_state = "doublesheetclown"
|
||||
item_state = "sheetrainbow"
|
||||
|
||||
/obj/item/weapon/bedsheet/captaindouble
|
||||
icon_state = "doublesheetcaptain"
|
||||
item_state = "sheetcaptain"
|
||||
|
||||
/obj/item/weapon/bedsheet/rddouble
|
||||
icon_state = "doublesheetrd"
|
||||
item_state = "sheetrd"
|
||||
|
||||
/obj/item/weapon/bedsheet/hosdouble
|
||||
icon_state = "doublesheethos"
|
||||
item_state = "sheethos"
|
||||
|
||||
/obj/item/weapon/bedsheet/hopdouble
|
||||
icon_state = "doublesheethop"
|
||||
item_state = "sheethop"
|
||||
|
||||
/obj/item/weapon/bedsheet/cedouble
|
||||
icon_state = "doublesheetce"
|
||||
item_state = "sheetce"
|
||||
|
||||
/obj/item/weapon/bedsheet/browndouble
|
||||
icon_state = "doublesheetbrown"
|
||||
item_state = "sheetbrown"
|
||||
|
||||
/obj/item/weapon/bedsheet/iandouble
|
||||
icon_state = "doublesheetian"
|
||||
item_state = "sheetian"
|
||||
|
||||
/obj/structure/bedsheetbin
|
||||
name = "linen bin"
|
||||
desc = "A linen bin. It looks rather cosy."
|
||||
icon = 'icons/obj/structures.dmi'
|
||||
icon_state = "linenbin-full"
|
||||
anchored = TRUE
|
||||
var/amount = 20
|
||||
var/list/sheets = list()
|
||||
var/obj/item/hidden = null
|
||||
|
||||
|
||||
/obj/structure/bedsheetbin/examine(mob/user)
|
||||
. = ..()
|
||||
|
||||
if(amount < 1)
|
||||
. += "There are no bed sheets in the bin."
|
||||
else if(amount == 1)
|
||||
. += "There is one bed sheet in the bin."
|
||||
else
|
||||
. += "There are [amount] bed sheets in the bin."
|
||||
|
||||
/obj/structure/bedsheetbin/update_icon()
|
||||
switch(amount)
|
||||
if(0) icon_state = "linenbin-empty"
|
||||
if(1 to amount / 2) icon_state = "linenbin-half"
|
||||
else icon_state = "linenbin-full"
|
||||
|
||||
|
||||
/obj/structure/bedsheetbin/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(istype(I, /obj/item/weapon/bedsheet))
|
||||
user.drop_item()
|
||||
I.loc = src
|
||||
sheets.Add(I)
|
||||
amount++
|
||||
to_chat(user, "<span class='notice'>You put [I] in [src].</span>")
|
||||
else if(amount && !hidden && I.w_class < ITEMSIZE_LARGE) //make sure there's sheets to hide it among, make sure nothing else is hidden in there.
|
||||
user.drop_item()
|
||||
I.loc = src
|
||||
hidden = I
|
||||
to_chat(user, "<span class='notice'>You hide [I] among the sheets.</span>")
|
||||
|
||||
/obj/structure/bedsheetbin/attack_hand(mob/user as mob)
|
||||
if(amount >= 1)
|
||||
amount--
|
||||
|
||||
var/obj/item/weapon/bedsheet/B
|
||||
if(sheets.len > 0)
|
||||
B = sheets[sheets.len]
|
||||
sheets.Remove(B)
|
||||
|
||||
else
|
||||
B = new /obj/item/weapon/bedsheet(loc)
|
||||
|
||||
B.loc = user.loc
|
||||
user.put_in_hands(B)
|
||||
to_chat(user, "<span class='notice'>You take [B] out of [src].</span>")
|
||||
|
||||
if(hidden)
|
||||
hidden.loc = user.loc
|
||||
to_chat(user, "<span class='notice'>[hidden] falls out of [B]!</span>")
|
||||
hidden = null
|
||||
|
||||
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/structure/bedsheetbin/attack_tk(mob/user as mob)
|
||||
if(amount >= 1)
|
||||
amount--
|
||||
|
||||
var/obj/item/weapon/bedsheet/B
|
||||
if(sheets.len > 0)
|
||||
B = sheets[sheets.len]
|
||||
sheets.Remove(B)
|
||||
|
||||
else
|
||||
B = new /obj/item/weapon/bedsheet(loc)
|
||||
|
||||
B.loc = loc
|
||||
to_chat(user, "<span class='notice'>You telekinetically remove [B] from [src].</span>")
|
||||
update_icon()
|
||||
|
||||
if(hidden)
|
||||
hidden.loc = loc
|
||||
hidden = null
|
||||
|
||||
|
||||
add_fingerprint(user)
|
||||
|
||||
@@ -1,272 +1,272 @@
|
||||
GLOBAL_LIST_EMPTY(cliff_icon_cache)
|
||||
|
||||
/*
|
||||
Cliffs give a visual illusion of depth by seperating two places while presenting a 'top' and 'bottom' side.
|
||||
|
||||
Mobs moving into a cliff from the bottom side will simply bump into it and be denied moving into the tile,
|
||||
where as mobs moving into a cliff from the top side will 'fall' off the cliff, forcing them to the bottom, causing significant damage and stunning them.
|
||||
|
||||
Mobs can climb this while wearing climbing equipment by clickdragging themselves onto a cliff, as if it were a table.
|
||||
|
||||
Flying mobs can pass over all cliffs with no risk of falling.
|
||||
|
||||
Projectiles and thrown objects can pass, however if moving upwards, there is a chance for it to be stopped by the cliff.
|
||||
This makes fighting something that is on top of a cliff more challenging.
|
||||
|
||||
As a note, dir points upwards, e.g. pointing WEST means the left side is 'up', and the right side is 'down'.
|
||||
|
||||
When mapping these in, be sure to give at least a one tile clearance, as NORTH facing cliffs expand to
|
||||
two tiles on initialization, and which way a cliff is facing may change during maploading.
|
||||
*/
|
||||
|
||||
/obj/structure/cliff
|
||||
name = "cliff"
|
||||
desc = "A steep rock ledge. You might be able to climb it if you feel bold enough."
|
||||
description_info = "Walking off the edge of a cliff while on top will cause you to fall off, causing severe injury.<br>\
|
||||
You can climb this cliff if wearing special climbing equipment, by click-dragging yourself onto the cliff.<br>\
|
||||
Projectiles traveling up a cliff may hit the cliff instead, making it more difficult to fight something \
|
||||
on top."
|
||||
icon = 'icons/obj/flora/rocks.dmi'
|
||||
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
opacity = FALSE
|
||||
climbable = TRUE
|
||||
climb_delay = 10 SECONDS
|
||||
unacidable = TRUE
|
||||
block_turf_edges = TRUE // Don't want turf edges popping up from the cliff edge.
|
||||
plane = TURF_PLANE
|
||||
|
||||
var/icon_variant = null // Used to make cliffs less repeative by having a selection of sprites to display.
|
||||
var/corner = FALSE // Used for icon things.
|
||||
var/ramp = FALSE // Ditto.
|
||||
var/bottom = FALSE // Used for 'bottom' typed cliffs, to avoid infinite cliffs, and for icons.
|
||||
|
||||
var/is_double_cliff = FALSE // Set to true when making the two-tile cliffs, used for projectile checks.
|
||||
var/uphill_penalty = 30 // Odds of a projectile not making it up the cliff.
|
||||
|
||||
/obj/structure/cliff/Initialize()
|
||||
. = ..()
|
||||
register_dangerous_to_step()
|
||||
|
||||
/obj/structure/cliff/Destroy()
|
||||
unregister_dangerous_to_step()
|
||||
. = ..()
|
||||
|
||||
/obj/structure/cliff/Moved(atom/oldloc)
|
||||
. = ..()
|
||||
if(.)
|
||||
var/turf/old_turf = get_turf(oldloc)
|
||||
var/turf/new_turf = get_turf(src)
|
||||
if(old_turf != new_turf)
|
||||
old_turf.unregister_dangerous_object(src)
|
||||
new_turf.register_dangerous_object(src)
|
||||
|
||||
// These arrange their sprites at runtime, as opposed to being statically placed in the map file.
|
||||
/obj/structure/cliff/automatic
|
||||
icon_state = "cliffbuilder"
|
||||
dir = NORTH
|
||||
|
||||
/obj/structure/cliff/automatic/corner
|
||||
icon_state = "cliffbuilder-corner"
|
||||
dir = NORTHEAST
|
||||
corner = TRUE
|
||||
|
||||
// Tiny part that doesn't block, used for making 'ramps'.
|
||||
/obj/structure/cliff/automatic/ramp
|
||||
icon_state = "cliffbuilder-ramp"
|
||||
dir = NORTHEAST
|
||||
density = FALSE
|
||||
ramp = TRUE
|
||||
|
||||
// Made automatically as needed by automatic cliffs.
|
||||
/obj/structure/cliff/bottom
|
||||
bottom = TRUE
|
||||
|
||||
/obj/structure/cliff/automatic/Initialize()
|
||||
..()
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
// Paranoid about the maploader, direction is very important to cliffs, since they may get bigger if initialized while facing NORTH.
|
||||
/obj/structure/cliff/automatic/LateInitialize()
|
||||
if(dir in GLOB.cardinal)
|
||||
icon_variant = pick("a", "b", "c")
|
||||
|
||||
if(dir & NORTH && !bottom) // North-facing cliffs require more cliffs to be made.
|
||||
make_bottom()
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/structure/cliff/proc/make_bottom()
|
||||
// First, make sure there's room to put the bottom side.
|
||||
var/turf/T = locate(x, y - 1, z)
|
||||
if(!istype(T))
|
||||
return FALSE
|
||||
|
||||
// Now make the bottom cliff have mostly the same variables.
|
||||
var/obj/structure/cliff/bottom/bottom = new(T)
|
||||
is_double_cliff = TRUE
|
||||
climb_delay /= 2 // Since there are two cliffs to climb when going north, both take half the time.
|
||||
|
||||
bottom.dir = dir
|
||||
bottom.is_double_cliff = TRUE
|
||||
bottom.climb_delay = climb_delay
|
||||
bottom.icon_variant = icon_variant
|
||||
bottom.corner = corner
|
||||
bottom.ramp = ramp
|
||||
bottom.layer = layer - 0.1
|
||||
bottom.density = density
|
||||
bottom.update_icon()
|
||||
|
||||
/obj/structure/cliff/set_dir(new_dir)
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/structure/cliff/update_icon()
|
||||
icon_state = "cliff-[dir][icon_variant][bottom ? "-bottom" : ""][corner ? "-corner" : ""][ramp ? "-ramp" : ""]"
|
||||
|
||||
// Now for making the top-side look like a different turf.
|
||||
var/turf/T = get_step(src, dir)
|
||||
if(!istype(T))
|
||||
return
|
||||
|
||||
var/subtraction_icon_state = "[icon_state]-subtract"
|
||||
var/cache_string = "[icon_state]_[T.icon]_[T.icon_state]"
|
||||
if(T && (subtraction_icon_state in cached_icon_states(icon)))
|
||||
cut_overlays()
|
||||
// If we've made the same icon before, just recycle it.
|
||||
if(cache_string in GLOB.cliff_icon_cache)
|
||||
add_overlay(GLOB.cliff_icon_cache[cache_string])
|
||||
|
||||
else // Otherwise make a new one, but only once.
|
||||
var/icon/underlying_ground = icon(T.icon, T.icon_state, T.dir)
|
||||
var/icon/subtract = icon(icon, subtraction_icon_state)
|
||||
underlying_ground.Blend(subtract, ICON_SUBTRACT)
|
||||
var/image/final = image(underlying_ground)
|
||||
final.layer = src.layer - 0.2
|
||||
GLOB.cliff_icon_cache[cache_string] = final
|
||||
add_overlay(final)
|
||||
|
||||
|
||||
// Movement-related code.
|
||||
|
||||
/obj/structure/cliff/CanPass(atom/movable/mover, turf/target)
|
||||
if(isliving(mover))
|
||||
var/mob/living/L = mover
|
||||
if(L.hovering || L.flying) // Flying mobs can always pass.
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
// Projectiles and objects flying 'upward' have a chance to hit the cliff instead, wasting the shot.
|
||||
else if(istype(mover, /obj))
|
||||
var/obj/O = mover
|
||||
if(check_shield_arc(src, dir, O)) // This is actually for mobs but it will work for our purposes as well.
|
||||
if(prob(uphill_penalty / (1 + is_double_cliff) )) // Firing upwards facing NORTH means it will likely have to pass through two cliffs, so the chance is halved.
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/structure/cliff/Bumped(atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
if(should_fall(L))
|
||||
fall_off_cliff(L)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/structure/cliff/proc/should_fall(mob/living/L)
|
||||
if(L.hovering || L.flying)
|
||||
return FALSE
|
||||
|
||||
var/turf/T = get_turf(L)
|
||||
if(T && get_dir(T, loc) & reverse_dir[dir]) // dir points 'up' the cliff, e.g. cliff pointing NORTH will cause someone to fall if moving SOUTH into it.
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/structure/cliff/proc/fall_off_cliff(mob/living/L)
|
||||
if(!istype(L))
|
||||
return FALSE
|
||||
var/turf/T = get_step(src, reverse_dir[dir])
|
||||
var/displaced = FALSE
|
||||
|
||||
if(dir in list(EAST, WEST)) // Apply an offset if flying sideways, to help maintain the illusion of depth.
|
||||
for(var/i = 1 to 2)
|
||||
var/turf/new_T = locate(T.x, T.y - i, T.z)
|
||||
if(!new_T || locate(/obj/structure/cliff) in new_T)
|
||||
break
|
||||
T = new_T
|
||||
displaced = TRUE
|
||||
|
||||
if(istype(T))
|
||||
|
||||
var/safe_fall = FALSE
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
safe_fall = H.species.handle_falling(H, T, silent = TRUE, planetary = FALSE)
|
||||
|
||||
if(safe_fall)
|
||||
visible_message(span("notice", "\The [L] glides down from \the [src]."))
|
||||
else
|
||||
visible_message(span("danger", "\The [L] falls off \the [src]!"))
|
||||
L.forceMove(T)
|
||||
|
||||
var/harm = !is_double_cliff ? 1 : 0.5
|
||||
if(!safe_fall)
|
||||
// Do the actual hurting. Double cliffs do halved damage due to them most likely hitting twice.
|
||||
if(istype(L.buckled, /obj/vehicle)) // People falling off in vehicles will take less damage, but will damage the vehicle severely.
|
||||
var/obj/vehicle/vehicle = L.buckled
|
||||
vehicle.adjust_health(40 * harm)
|
||||
to_chat(L, span("warning", "\The [vehicle] absorbs some of the impact, damaging it."))
|
||||
harm /= 2
|
||||
|
||||
playsound(L, 'sound/effects/break_stone.ogg', 70, 1)
|
||||
L.Weaken(5 * harm)
|
||||
|
||||
var/fall_time = 3
|
||||
if(displaced) // Make the fall look more natural when falling sideways.
|
||||
L.pixel_z = 32 * 2
|
||||
animate(L, pixel_z = 0, time = fall_time)
|
||||
sleep(fall_time) // A brief delay inbetween the two sounds helps sell the 'ouch' effect.
|
||||
|
||||
if(safe_fall)
|
||||
visible_message(span("notice", "\The [L] lands on \the [T]."))
|
||||
playsound(L, "rustle", 25, 1)
|
||||
return
|
||||
|
||||
playsound(L, "punch", 70, 1)
|
||||
shake_camera(L, 1, 1)
|
||||
|
||||
visible_message(span("danger", "\The [L] hits \the [T]!"))
|
||||
|
||||
// The bigger they are, the harder they fall.
|
||||
// They will take at least 20 damage at the minimum, and tries to scale up to 40% of their max health.
|
||||
// This scaling is capped at 100 total damage, which occurs if the thing that fell has more than 250 health.
|
||||
var/damage = between(20, L.getMaxHealth() * 0.4, 100)
|
||||
var/target_zone = ran_zone()
|
||||
var/blocked = L.run_armor_check(target_zone, "melee") * harm
|
||||
var/soaked = L.get_armor_soak(target_zone, "melee") * harm
|
||||
|
||||
L.apply_damage(damage * harm, BRUTE, target_zone, blocked, soaked, used_weapon=src)
|
||||
|
||||
// Now fall off more cliffs below this one if they exist.
|
||||
var/obj/structure/cliff/bottom_cliff = locate() in T
|
||||
if(bottom_cliff)
|
||||
visible_message(span("danger", "\The [L] rolls down towards \the [bottom_cliff]!"))
|
||||
sleep(5)
|
||||
bottom_cliff.fall_off_cliff(L)
|
||||
|
||||
/obj/structure/cliff/can_climb(mob/living/user, post_climb_check = FALSE)
|
||||
// Cliff climbing requires climbing gear.
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/obj/item/clothing/shoes/shoes = H.shoes
|
||||
if(shoes && shoes.rock_climbing)
|
||||
return ..() // Do the other checks too.
|
||||
|
||||
to_chat(user, span("warning", "\The [src] is too steep to climb unassisted."))
|
||||
return FALSE
|
||||
|
||||
// This tells AI mobs to not be dumb and step off cliffs willingly.
|
||||
/obj/structure/cliff/is_safe_to_step(mob/living/L)
|
||||
if(should_fall(L))
|
||||
return FALSE
|
||||
return ..()
|
||||
GLOBAL_LIST_EMPTY(cliff_icon_cache)
|
||||
|
||||
/*
|
||||
Cliffs give a visual illusion of depth by seperating two places while presenting a 'top' and 'bottom' side.
|
||||
|
||||
Mobs moving into a cliff from the bottom side will simply bump into it and be denied moving into the tile,
|
||||
where as mobs moving into a cliff from the top side will 'fall' off the cliff, forcing them to the bottom, causing significant damage and stunning them.
|
||||
|
||||
Mobs can climb this while wearing climbing equipment by clickdragging themselves onto a cliff, as if it were a table.
|
||||
|
||||
Flying mobs can pass over all cliffs with no risk of falling.
|
||||
|
||||
Projectiles and thrown objects can pass, however if moving upwards, there is a chance for it to be stopped by the cliff.
|
||||
This makes fighting something that is on top of a cliff more challenging.
|
||||
|
||||
As a note, dir points upwards, e.g. pointing WEST means the left side is 'up', and the right side is 'down'.
|
||||
|
||||
When mapping these in, be sure to give at least a one tile clearance, as NORTH facing cliffs expand to
|
||||
two tiles on initialization, and which way a cliff is facing may change during maploading.
|
||||
*/
|
||||
|
||||
/obj/structure/cliff
|
||||
name = "cliff"
|
||||
desc = "A steep rock ledge. You might be able to climb it if you feel bold enough."
|
||||
description_info = "Walking off the edge of a cliff while on top will cause you to fall off, causing severe injury.<br>\
|
||||
You can climb this cliff if wearing special climbing equipment, by click-dragging yourself onto the cliff.<br>\
|
||||
Projectiles traveling up a cliff may hit the cliff instead, making it more difficult to fight something \
|
||||
on top."
|
||||
icon = 'icons/obj/flora/rocks.dmi'
|
||||
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
opacity = FALSE
|
||||
climbable = TRUE
|
||||
climb_delay = 10 SECONDS
|
||||
unacidable = TRUE
|
||||
block_turf_edges = TRUE // Don't want turf edges popping up from the cliff edge.
|
||||
plane = TURF_PLANE
|
||||
|
||||
var/icon_variant = null // Used to make cliffs less repeative by having a selection of sprites to display.
|
||||
var/corner = FALSE // Used for icon things.
|
||||
var/ramp = FALSE // Ditto.
|
||||
var/bottom = FALSE // Used for 'bottom' typed cliffs, to avoid infinite cliffs, and for icons.
|
||||
|
||||
var/is_double_cliff = FALSE // Set to true when making the two-tile cliffs, used for projectile checks.
|
||||
var/uphill_penalty = 30 // Odds of a projectile not making it up the cliff.
|
||||
|
||||
/obj/structure/cliff/Initialize()
|
||||
. = ..()
|
||||
register_dangerous_to_step()
|
||||
|
||||
/obj/structure/cliff/Destroy()
|
||||
unregister_dangerous_to_step()
|
||||
. = ..()
|
||||
|
||||
/obj/structure/cliff/Moved(atom/oldloc)
|
||||
. = ..()
|
||||
if(.)
|
||||
var/turf/old_turf = get_turf(oldloc)
|
||||
var/turf/new_turf = get_turf(src)
|
||||
if(old_turf != new_turf)
|
||||
old_turf.unregister_dangerous_object(src)
|
||||
new_turf.register_dangerous_object(src)
|
||||
|
||||
// These arrange their sprites at runtime, as opposed to being statically placed in the map file.
|
||||
/obj/structure/cliff/automatic
|
||||
icon_state = "cliffbuilder"
|
||||
dir = NORTH
|
||||
|
||||
/obj/structure/cliff/automatic/corner
|
||||
icon_state = "cliffbuilder-corner"
|
||||
dir = NORTHEAST
|
||||
corner = TRUE
|
||||
|
||||
// Tiny part that doesn't block, used for making 'ramps'.
|
||||
/obj/structure/cliff/automatic/ramp
|
||||
icon_state = "cliffbuilder-ramp"
|
||||
dir = NORTHEAST
|
||||
density = FALSE
|
||||
ramp = TRUE
|
||||
|
||||
// Made automatically as needed by automatic cliffs.
|
||||
/obj/structure/cliff/bottom
|
||||
bottom = TRUE
|
||||
|
||||
/obj/structure/cliff/automatic/Initialize()
|
||||
..()
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
// Paranoid about the maploader, direction is very important to cliffs, since they may get bigger if initialized while facing NORTH.
|
||||
/obj/structure/cliff/automatic/LateInitialize()
|
||||
if(dir in GLOB.cardinal)
|
||||
icon_variant = pick("a", "b", "c")
|
||||
|
||||
if(dir & NORTH && !bottom) // North-facing cliffs require more cliffs to be made.
|
||||
make_bottom()
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/structure/cliff/proc/make_bottom()
|
||||
// First, make sure there's room to put the bottom side.
|
||||
var/turf/T = locate(x, y - 1, z)
|
||||
if(!istype(T))
|
||||
return FALSE
|
||||
|
||||
// Now make the bottom cliff have mostly the same variables.
|
||||
var/obj/structure/cliff/bottom/bottom = new(T)
|
||||
is_double_cliff = TRUE
|
||||
climb_delay /= 2 // Since there are two cliffs to climb when going north, both take half the time.
|
||||
|
||||
bottom.dir = dir
|
||||
bottom.is_double_cliff = TRUE
|
||||
bottom.climb_delay = climb_delay
|
||||
bottom.icon_variant = icon_variant
|
||||
bottom.corner = corner
|
||||
bottom.ramp = ramp
|
||||
bottom.layer = layer - 0.1
|
||||
bottom.density = density
|
||||
bottom.update_icon()
|
||||
|
||||
/obj/structure/cliff/set_dir(new_dir)
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/structure/cliff/update_icon()
|
||||
icon_state = "cliff-[dir][icon_variant][bottom ? "-bottom" : ""][corner ? "-corner" : ""][ramp ? "-ramp" : ""]"
|
||||
|
||||
// Now for making the top-side look like a different turf.
|
||||
var/turf/T = get_step(src, dir)
|
||||
if(!istype(T))
|
||||
return
|
||||
|
||||
var/subtraction_icon_state = "[icon_state]-subtract"
|
||||
var/cache_string = "[icon_state]_[T.icon]_[T.icon_state]"
|
||||
if(T && (subtraction_icon_state in cached_icon_states(icon)))
|
||||
cut_overlays()
|
||||
// If we've made the same icon before, just recycle it.
|
||||
if(cache_string in GLOB.cliff_icon_cache)
|
||||
add_overlay(GLOB.cliff_icon_cache[cache_string])
|
||||
|
||||
else // Otherwise make a new one, but only once.
|
||||
var/icon/underlying_ground = icon(T.icon, T.icon_state, T.dir)
|
||||
var/icon/subtract = icon(icon, subtraction_icon_state)
|
||||
underlying_ground.Blend(subtract, ICON_SUBTRACT)
|
||||
var/image/final = image(underlying_ground)
|
||||
final.layer = src.layer - 0.2
|
||||
GLOB.cliff_icon_cache[cache_string] = final
|
||||
add_overlay(final)
|
||||
|
||||
|
||||
// Movement-related code.
|
||||
|
||||
/obj/structure/cliff/CanPass(atom/movable/mover, turf/target)
|
||||
if(isliving(mover))
|
||||
var/mob/living/L = mover
|
||||
if(L.hovering || L.flying) // Flying mobs can always pass.
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
// Projectiles and objects flying 'upward' have a chance to hit the cliff instead, wasting the shot.
|
||||
else if(istype(mover, /obj))
|
||||
var/obj/O = mover
|
||||
if(check_shield_arc(src, dir, O)) // This is actually for mobs but it will work for our purposes as well.
|
||||
if(prob(uphill_penalty / (1 + is_double_cliff) )) // Firing upwards facing NORTH means it will likely have to pass through two cliffs, so the chance is halved.
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/structure/cliff/Bumped(atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
if(should_fall(L))
|
||||
fall_off_cliff(L)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/structure/cliff/proc/should_fall(mob/living/L)
|
||||
if(L.hovering || L.flying)
|
||||
return FALSE
|
||||
|
||||
var/turf/T = get_turf(L)
|
||||
if(T && get_dir(T, loc) & reverse_dir[dir]) // dir points 'up' the cliff, e.g. cliff pointing NORTH will cause someone to fall if moving SOUTH into it.
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/structure/cliff/proc/fall_off_cliff(mob/living/L)
|
||||
if(!istype(L))
|
||||
return FALSE
|
||||
var/turf/T = get_step(src, reverse_dir[dir])
|
||||
var/displaced = FALSE
|
||||
|
||||
if(dir in list(EAST, WEST)) // Apply an offset if flying sideways, to help maintain the illusion of depth.
|
||||
for(var/i = 1 to 2)
|
||||
var/turf/new_T = locate(T.x, T.y - i, T.z)
|
||||
if(!new_T || locate(/obj/structure/cliff) in new_T)
|
||||
break
|
||||
T = new_T
|
||||
displaced = TRUE
|
||||
|
||||
if(istype(T))
|
||||
|
||||
var/safe_fall = FALSE
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
safe_fall = H.species.handle_falling(H, T, silent = TRUE, planetary = FALSE)
|
||||
|
||||
if(safe_fall)
|
||||
visible_message(span("notice", "\The [L] glides down from \the [src]."))
|
||||
else
|
||||
visible_message(span("danger", "\The [L] falls off \the [src]!"))
|
||||
L.forceMove(T)
|
||||
|
||||
var/harm = !is_double_cliff ? 1 : 0.5
|
||||
if(!safe_fall)
|
||||
// Do the actual hurting. Double cliffs do halved damage due to them most likely hitting twice.
|
||||
if(istype(L.buckled, /obj/vehicle)) // People falling off in vehicles will take less damage, but will damage the vehicle severely.
|
||||
var/obj/vehicle/vehicle = L.buckled
|
||||
vehicle.adjust_health(40 * harm)
|
||||
to_chat(L, span("warning", "\The [vehicle] absorbs some of the impact, damaging it."))
|
||||
harm /= 2
|
||||
|
||||
playsound(L, 'sound/effects/break_stone.ogg', 70, 1)
|
||||
L.Weaken(5 * harm)
|
||||
|
||||
var/fall_time = 3
|
||||
if(displaced) // Make the fall look more natural when falling sideways.
|
||||
L.pixel_z = 32 * 2
|
||||
animate(L, pixel_z = 0, time = fall_time)
|
||||
sleep(fall_time) // A brief delay inbetween the two sounds helps sell the 'ouch' effect.
|
||||
|
||||
if(safe_fall)
|
||||
visible_message(span("notice", "\The [L] lands on \the [T]."))
|
||||
playsound(L, "rustle", 25, 1)
|
||||
return
|
||||
|
||||
playsound(L, "punch", 70, 1)
|
||||
shake_camera(L, 1, 1)
|
||||
|
||||
visible_message(span("danger", "\The [L] hits \the [T]!"))
|
||||
|
||||
// The bigger they are, the harder they fall.
|
||||
// They will take at least 20 damage at the minimum, and tries to scale up to 40% of their max health.
|
||||
// This scaling is capped at 100 total damage, which occurs if the thing that fell has more than 250 health.
|
||||
var/damage = between(20, L.getMaxHealth() * 0.4, 100)
|
||||
var/target_zone = ran_zone()
|
||||
var/blocked = L.run_armor_check(target_zone, "melee") * harm
|
||||
var/soaked = L.get_armor_soak(target_zone, "melee") * harm
|
||||
|
||||
L.apply_damage(damage * harm, BRUTE, target_zone, blocked, soaked, used_weapon=src)
|
||||
|
||||
// Now fall off more cliffs below this one if they exist.
|
||||
var/obj/structure/cliff/bottom_cliff = locate() in T
|
||||
if(bottom_cliff)
|
||||
visible_message(span("danger", "\The [L] rolls down towards \the [bottom_cliff]!"))
|
||||
sleep(5)
|
||||
bottom_cliff.fall_off_cliff(L)
|
||||
|
||||
/obj/structure/cliff/can_climb(mob/living/user, post_climb_check = FALSE)
|
||||
// Cliff climbing requires climbing gear.
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/obj/item/clothing/shoes/shoes = H.shoes
|
||||
if(shoes && shoes.rock_climbing)
|
||||
return ..() // Do the other checks too.
|
||||
|
||||
to_chat(user, span("warning", "\The [src] is too steep to climb unassisted."))
|
||||
return FALSE
|
||||
|
||||
// This tells AI mobs to not be dumb and step off cliffs willingly.
|
||||
/obj/structure/cliff/is_safe_to_step(mob/living/L)
|
||||
if(should_fall(L))
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -1,164 +1,164 @@
|
||||
/obj/structure/closet/coffin
|
||||
name = "coffin"
|
||||
desc = "It's a burial receptacle for the dearly departed."
|
||||
icon = 'icons/obj/closets/coffin.dmi'
|
||||
|
||||
icon_state = "closed_unlocked"
|
||||
seal_tool = /obj/item/weapon/tool/screwdriver
|
||||
breakout_sound = 'sound/weapons/tablehit1.ogg'
|
||||
closet_appearance = null // Special icon for us
|
||||
|
||||
/* Graves */
|
||||
/obj/structure/closet/grave
|
||||
name = "grave"
|
||||
desc = "Dirt."
|
||||
icon = 'icons/obj/closets/grave.dmi'
|
||||
icon_state = "closed_unlocked"
|
||||
seal_tool = null
|
||||
breakout_sound = 'sound/weapons/thudswoosh.ogg'
|
||||
anchored = TRUE
|
||||
max_closets = 1
|
||||
opened = 1
|
||||
closet_appearance = null // Special icon for us
|
||||
open_sound = 'sound/effects/wooden_closet_open.ogg'
|
||||
close_sound = 'sound/effects/wooden_closet_close.ogg'
|
||||
|
||||
/obj/structure/closet/grave/attack_hand(mob/user as mob)
|
||||
if(opened)
|
||||
visible_message("<span class='notice'>[user] starts to climb into \the [src.name].</span>", \
|
||||
"<span class='notice'>You start to lower yourself into \the [src.name].</span>")
|
||||
if(do_after(user, 50))
|
||||
user.forceMove(src.loc)
|
||||
visible_message("<span class='notice'>[user] climbs into \the [src.name].</span>", \
|
||||
"<span class='notice'>You climb into \the [src.name].</span>")
|
||||
else
|
||||
visible_message("<span class='notice'>[user] decides not to climb into \the [src.name].</span>", \
|
||||
"<span class='notice'>You stop climbing into \the [src.name].</span>")
|
||||
return
|
||||
|
||||
/obj/structure/closet/grave/CanPass(atom/movable/mover, turf/target)
|
||||
if(opened && ismob(mover))
|
||||
var/mob/M = mover
|
||||
add_fingerprint(M)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.m_intent == "walk")
|
||||
to_chat(H, "<span class='warning'>You stop at the edge of \the [src.name].</span>")
|
||||
return FALSE
|
||||
else
|
||||
to_chat(H, "<span class='warning'>You fall into \the [src.name]!</span>")
|
||||
fall_in(H)
|
||||
return TRUE
|
||||
if(isrobot(M))
|
||||
var/mob/living/silicon/robot/R = M
|
||||
if(R.a_intent == I_HELP)
|
||||
to_chat(R, "<span class='warning'>You stop at the edge of \the [src.name].</span>")
|
||||
return FALSE
|
||||
else
|
||||
to_chat(R, "<span class='warning'>You enter \the [src.name].</span>")
|
||||
return TRUE
|
||||
return TRUE //Everything else can move over the graves
|
||||
|
||||
/obj/structure/closet/grave/proc/fall_in(mob/living/L) //Only called on humans for now, but still
|
||||
L.Weaken(5)
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
var/limb_damage = rand(5,25)
|
||||
H.adjustBruteLoss(limb_damage)
|
||||
|
||||
/obj/structure/closet/grave/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(src.opened)
|
||||
if(istype(W, /obj/item/weapon/shovel))
|
||||
user.visible_message("<span class='notice'>[user] piles dirt into \the [src.name].</span>", \
|
||||
"<span class='notice'>You start to pile dirt into \the [src.name].</span>", \
|
||||
"<span class='notice'>You hear dirt being moved.</span>")
|
||||
if(do_after(user, 40 * W.toolspeed))
|
||||
user.visible_message("<span class='notice'>[user] pats down the dirt on top of \the [src.name].</span>", \
|
||||
"<span class='notice'>You finish filling in \the [src.name].</span>")
|
||||
close()
|
||||
return
|
||||
else
|
||||
user.visible_message("<span class='notice'>[user] stops filling in \the [src.name].</span>", \
|
||||
"<span class='notice'>You change your mind and stop filling in \the [src.name].</span>")
|
||||
return
|
||||
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
|
||||
return 0
|
||||
if(istype(W,/obj/item/tk_grab))
|
||||
return 0
|
||||
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)
|
||||
for(var/obj/item/I in LB.contents)
|
||||
LB.remove_from_storage(I, T)
|
||||
user.visible_message("<span class='notice'>[user] empties \the [LB] into \the [src].</span>", \
|
||||
"<span class='notice'>You empty \the [LB] into \the [src].</span>", \
|
||||
"<span class='notice'>You hear rustling of clothes.</span>")
|
||||
return
|
||||
if(isrobot(user))
|
||||
return
|
||||
if(W.loc != user) // This should stop mounted modules ending up outside the module.
|
||||
return
|
||||
usr.drop_item()
|
||||
if(W)
|
||||
W.forceMove(src.loc)
|
||||
else
|
||||
if(istype(W, /obj/item/weapon/shovel))
|
||||
if(user.a_intent == I_HURT) // Hurt intent means you're trying to kill someone, or just get rid of the grave
|
||||
user.visible_message("<span class='notice'>[user] begins to smoothe out the dirt of \the [src.name].</span>", \
|
||||
"<span class='notice'>You start to smoothe out the dirt of \the [src.name].</span>", \
|
||||
"<span class='notice'>You hear dirt being moved.</span>")
|
||||
if(do_after(user, 40 * W.toolspeed))
|
||||
user.visible_message("<span class='notice'>[user] finishes smoothing out \the [src.name].</span>", \
|
||||
"<span class='notice'>You finish smoothing out \the [src.name].</span>")
|
||||
if(LAZYLEN(contents))
|
||||
alpha = 40 // If we've got stuff inside, like maybe a person, just make it hard to see us
|
||||
else
|
||||
qdel(src) // Else, go away
|
||||
return
|
||||
else
|
||||
user.visible_message("<span class='notice'>[user] stops concealing \the [src.name].</span>", \
|
||||
"<span class='notice'>You stop concealing \the [src.name].</span>")
|
||||
return
|
||||
else
|
||||
user.visible_message("<span class='notice'>[user] begins to unearth \the [src.name].</span>", \
|
||||
"<span class='notice'>You start to unearth \the [src.name].</span>", \
|
||||
"<span class='notice'>You hear dirt being moved.</span>")
|
||||
if(do_after(user, 40 * W.toolspeed))
|
||||
user.visible_message("<span class='notice'>[user] reaches the bottom of \the [src.name].</span>", \
|
||||
"<span class='notice'>You finish digging out \the [src.name].</span>")
|
||||
break_open()
|
||||
return
|
||||
else
|
||||
user.visible_message("<span class='notice'>[user] stops digging out \the [src.name].</span>", \
|
||||
"<span class='notice'>You stop digging out \the [src.name].</span>")
|
||||
return
|
||||
return
|
||||
|
||||
/obj/structure/closet/grave/close()
|
||||
..()
|
||||
if(!opened)
|
||||
sealed = TRUE
|
||||
|
||||
/obj/structure/closet/grave/open()
|
||||
.=..()
|
||||
alpha = 255 // Needed because of grave hiding
|
||||
|
||||
/obj/structure/closet/grave/bullet_act(var/obj/item/projectile/P)
|
||||
return PROJECTILE_CONTINUE // It's a hole in the ground, doesn't usually stop or even care about bullets
|
||||
|
||||
/obj/structure/closet/grave/return_air_for_internal_lifeform(var/mob/living/L)
|
||||
var/gasid = "carbon_dioxide"
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(H.species && H.species.exhale_type)
|
||||
gasid = H.species.exhale_type
|
||||
var/datum/gas_mixture/grave_breath = new()
|
||||
var/datum/gas_mixture/above_air = return_air()
|
||||
grave_breath.adjust_gas(gasid, BREATH_MOLES)
|
||||
grave_breath.temperature = (above_air.temperature) - 30 //Underground
|
||||
return grave_breath
|
||||
|
||||
/obj/structure/closet/grave/dirthole
|
||||
name = "hole"
|
||||
/obj/structure/closet/coffin
|
||||
name = "coffin"
|
||||
desc = "It's a burial receptacle for the dearly departed."
|
||||
icon = 'icons/obj/closets/coffin.dmi'
|
||||
|
||||
icon_state = "closed_unlocked"
|
||||
seal_tool = /obj/item/weapon/tool/screwdriver
|
||||
breakout_sound = 'sound/weapons/tablehit1.ogg'
|
||||
closet_appearance = null // Special icon for us
|
||||
|
||||
/* Graves */
|
||||
/obj/structure/closet/grave
|
||||
name = "grave"
|
||||
desc = "Dirt."
|
||||
icon = 'icons/obj/closets/grave.dmi'
|
||||
icon_state = "closed_unlocked"
|
||||
seal_tool = null
|
||||
breakout_sound = 'sound/weapons/thudswoosh.ogg'
|
||||
anchored = TRUE
|
||||
max_closets = 1
|
||||
opened = 1
|
||||
closet_appearance = null // Special icon for us
|
||||
open_sound = 'sound/effects/wooden_closet_open.ogg'
|
||||
close_sound = 'sound/effects/wooden_closet_close.ogg'
|
||||
|
||||
/obj/structure/closet/grave/attack_hand(mob/user as mob)
|
||||
if(opened)
|
||||
visible_message("<span class='notice'>[user] starts to climb into \the [src.name].</span>", \
|
||||
"<span class='notice'>You start to lower yourself into \the [src.name].</span>")
|
||||
if(do_after(user, 50))
|
||||
user.forceMove(src.loc)
|
||||
visible_message("<span class='notice'>[user] climbs into \the [src.name].</span>", \
|
||||
"<span class='notice'>You climb into \the [src.name].</span>")
|
||||
else
|
||||
visible_message("<span class='notice'>[user] decides not to climb into \the [src.name].</span>", \
|
||||
"<span class='notice'>You stop climbing into \the [src.name].</span>")
|
||||
return
|
||||
|
||||
/obj/structure/closet/grave/CanPass(atom/movable/mover, turf/target)
|
||||
if(opened && ismob(mover))
|
||||
var/mob/M = mover
|
||||
add_fingerprint(M)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.m_intent == "walk")
|
||||
to_chat(H, "<span class='warning'>You stop at the edge of \the [src.name].</span>")
|
||||
return FALSE
|
||||
else
|
||||
to_chat(H, "<span class='warning'>You fall into \the [src.name]!</span>")
|
||||
fall_in(H)
|
||||
return TRUE
|
||||
if(isrobot(M))
|
||||
var/mob/living/silicon/robot/R = M
|
||||
if(R.a_intent == I_HELP)
|
||||
to_chat(R, "<span class='warning'>You stop at the edge of \the [src.name].</span>")
|
||||
return FALSE
|
||||
else
|
||||
to_chat(R, "<span class='warning'>You enter \the [src.name].</span>")
|
||||
return TRUE
|
||||
return TRUE //Everything else can move over the graves
|
||||
|
||||
/obj/structure/closet/grave/proc/fall_in(mob/living/L) //Only called on humans for now, but still
|
||||
L.Weaken(5)
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
var/limb_damage = rand(5,25)
|
||||
H.adjustBruteLoss(limb_damage)
|
||||
|
||||
/obj/structure/closet/grave/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(src.opened)
|
||||
if(istype(W, /obj/item/weapon/shovel))
|
||||
user.visible_message("<span class='notice'>[user] piles dirt into \the [src.name].</span>", \
|
||||
"<span class='notice'>You start to pile dirt into \the [src.name].</span>", \
|
||||
"<span class='notice'>You hear dirt being moved.</span>")
|
||||
if(do_after(user, 40 * W.toolspeed))
|
||||
user.visible_message("<span class='notice'>[user] pats down the dirt on top of \the [src.name].</span>", \
|
||||
"<span class='notice'>You finish filling in \the [src.name].</span>")
|
||||
close()
|
||||
return
|
||||
else
|
||||
user.visible_message("<span class='notice'>[user] stops filling in \the [src.name].</span>", \
|
||||
"<span class='notice'>You change your mind and stop filling in \the [src.name].</span>")
|
||||
return
|
||||
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
|
||||
return 0
|
||||
if(istype(W,/obj/item/tk_grab))
|
||||
return 0
|
||||
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)
|
||||
for(var/obj/item/I in LB.contents)
|
||||
LB.remove_from_storage(I, T)
|
||||
user.visible_message("<span class='notice'>[user] empties \the [LB] into \the [src].</span>", \
|
||||
"<span class='notice'>You empty \the [LB] into \the [src].</span>", \
|
||||
"<span class='notice'>You hear rustling of clothes.</span>")
|
||||
return
|
||||
if(isrobot(user))
|
||||
return
|
||||
if(W.loc != user) // This should stop mounted modules ending up outside the module.
|
||||
return
|
||||
usr.drop_item()
|
||||
if(W)
|
||||
W.forceMove(src.loc)
|
||||
else
|
||||
if(istype(W, /obj/item/weapon/shovel))
|
||||
if(user.a_intent == I_HURT) // Hurt intent means you're trying to kill someone, or just get rid of the grave
|
||||
user.visible_message("<span class='notice'>[user] begins to smoothe out the dirt of \the [src.name].</span>", \
|
||||
"<span class='notice'>You start to smoothe out the dirt of \the [src.name].</span>", \
|
||||
"<span class='notice'>You hear dirt being moved.</span>")
|
||||
if(do_after(user, 40 * W.toolspeed))
|
||||
user.visible_message("<span class='notice'>[user] finishes smoothing out \the [src.name].</span>", \
|
||||
"<span class='notice'>You finish smoothing out \the [src.name].</span>")
|
||||
if(LAZYLEN(contents))
|
||||
alpha = 40 // If we've got stuff inside, like maybe a person, just make it hard to see us
|
||||
else
|
||||
qdel(src) // Else, go away
|
||||
return
|
||||
else
|
||||
user.visible_message("<span class='notice'>[user] stops concealing \the [src.name].</span>", \
|
||||
"<span class='notice'>You stop concealing \the [src.name].</span>")
|
||||
return
|
||||
else
|
||||
user.visible_message("<span class='notice'>[user] begins to unearth \the [src.name].</span>", \
|
||||
"<span class='notice'>You start to unearth \the [src.name].</span>", \
|
||||
"<span class='notice'>You hear dirt being moved.</span>")
|
||||
if(do_after(user, 40 * W.toolspeed))
|
||||
user.visible_message("<span class='notice'>[user] reaches the bottom of \the [src.name].</span>", \
|
||||
"<span class='notice'>You finish digging out \the [src.name].</span>")
|
||||
break_open()
|
||||
return
|
||||
else
|
||||
user.visible_message("<span class='notice'>[user] stops digging out \the [src.name].</span>", \
|
||||
"<span class='notice'>You stop digging out \the [src.name].</span>")
|
||||
return
|
||||
return
|
||||
|
||||
/obj/structure/closet/grave/close()
|
||||
..()
|
||||
if(!opened)
|
||||
sealed = TRUE
|
||||
|
||||
/obj/structure/closet/grave/open()
|
||||
.=..()
|
||||
alpha = 255 // Needed because of grave hiding
|
||||
|
||||
/obj/structure/closet/grave/bullet_act(var/obj/item/projectile/P)
|
||||
return PROJECTILE_CONTINUE // It's a hole in the ground, doesn't usually stop or even care about bullets
|
||||
|
||||
/obj/structure/closet/grave/return_air_for_internal_lifeform(var/mob/living/L)
|
||||
var/gasid = "carbon_dioxide"
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(H.species && H.species.exhale_type)
|
||||
gasid = H.species.exhale_type
|
||||
var/datum/gas_mixture/grave_breath = new()
|
||||
var/datum/gas_mixture/above_air = return_air()
|
||||
grave_breath.adjust_gas(gasid, BREATH_MOLES)
|
||||
grave_breath.temperature = (above_air.temperature) - 30 //Underground
|
||||
return grave_breath
|
||||
|
||||
/obj/structure/closet/grave/dirthole
|
||||
name = "hole"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/structure/closet/crate/critter
|
||||
name = "critter crate"
|
||||
desc = "A crate which can sustain life for a while."
|
||||
closet_appearance = /decl/closet_appearance/large_crate/critter
|
||||
/obj/structure/closet/crate/critter
|
||||
name = "critter crate"
|
||||
desc = "A crate which can sustain life for a while."
|
||||
closet_appearance = /decl/closet_appearance/large_crate/critter
|
||||
|
||||
@@ -1,120 +1,120 @@
|
||||
/obj/structure/closet/athletic_mixed
|
||||
name = "athletic wardrobe"
|
||||
desc = "It's a storage unit for athletic wear."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/mixed
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/under/shorts/grey,
|
||||
/obj/item/clothing/under/shorts/black,
|
||||
/obj/item/clothing/under/shorts/red,
|
||||
/obj/item/clothing/under/shorts/blue,
|
||||
/obj/item/clothing/under/shorts/green,
|
||||
/obj/item/clothing/under/shorts/white,
|
||||
/obj/item/clothing/suit/storage/toggle/track,
|
||||
/obj/item/clothing/suit/storage/toggle/track/blue,
|
||||
/obj/item/clothing/suit/storage/toggle/track/green,
|
||||
/obj/item/clothing/suit/storage/toggle/track/red,
|
||||
/obj/item/clothing/suit/storage/toggle/track/white,
|
||||
/obj/item/clothing/under/pants/track,
|
||||
/obj/item/clothing/under/pants/track/blue,
|
||||
/obj/item/clothing/under/pants/track/green,
|
||||
/obj/item/clothing/under/pants/track/white,
|
||||
/obj/item/clothing/under/pants/track/red,
|
||||
/obj/item/clothing/shoes/athletic = 2,
|
||||
/obj/item/clothing/shoes/hitops,
|
||||
/obj/item/clothing/shoes/hitops/red,
|
||||
/obj/item/clothing/shoes/hitops/black,
|
||||
/obj/item/clothing/shoes/hitops/blue
|
||||
)
|
||||
|
||||
/obj/structure/closet/athletic_swimwear
|
||||
name = "athletic wardrobe"
|
||||
desc = "It's a storage unit for swimwear."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/mixed
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/under/shorts/grey,
|
||||
/obj/item/clothing/under/shorts/black,
|
||||
/obj/item/clothing/under/shorts/red,
|
||||
/obj/item/clothing/under/shorts/blue,
|
||||
/obj/item/clothing/under/shorts/green,
|
||||
/obj/item/clothing/under/swimsuit/red,
|
||||
/obj/item/clothing/under/swimsuit/black,
|
||||
/obj/item/clothing/under/swimsuit/blue,
|
||||
/obj/item/clothing/under/swimsuit/green,
|
||||
/obj/item/clothing/under/swimsuit/purple,
|
||||
/obj/item/clothing/under/swimsuit/striped,
|
||||
/obj/item/clothing/under/swimsuit/white,
|
||||
/obj/item/clothing/under/swimsuit/earth,
|
||||
/obj/item/clothing/under/wetsuit,
|
||||
/obj/item/clothing/under/wetsuit_rec,
|
||||
/obj/item/clothing/under/wetsuit_skimpy,
|
||||
/obj/item/clothing/mask/snorkel = 2,
|
||||
/obj/item/clothing/shoes/swimmingfins = 2)
|
||||
|
||||
/obj/structure/closet/boxinggloves
|
||||
name = "boxing gloves"
|
||||
desc = "It's a storage unit for gloves for use in the boxing ring."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/mixed
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/gloves/boxing/blue,
|
||||
/obj/item/clothing/gloves/boxing/green,
|
||||
/obj/item/clothing/gloves/boxing/yellow,
|
||||
/obj/item/clothing/gloves/boxing)
|
||||
|
||||
/obj/structure/closet/masks
|
||||
name = "mask closet"
|
||||
desc = "IT'S A STORAGE UNIT FOR FIGHTER MASKS OLE!"
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/mixed
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/mask/luchador,
|
||||
/obj/item/clothing/mask/luchador/rudos,
|
||||
/obj/item/clothing/mask/luchador/tecnicos)
|
||||
|
||||
|
||||
/obj/structure/closet/lasertag/red
|
||||
name = "red laser tag equipment"
|
||||
desc = "It's a storage unit for laser tag equipment."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/red
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/gun/energy/lasertag/red = 5,
|
||||
/obj/item/clothing/suit/redtag = 5)
|
||||
|
||||
|
||||
/obj/structure/closet/lasertag/blue
|
||||
name = "blue laser tag equipment"
|
||||
desc = "It's a storage unit for laser tag equipment."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/blue
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/gun/energy/lasertag/blue = 5,
|
||||
/obj/item/clothing/suit/bluetag = 5)
|
||||
|
||||
/obj/structure/closet/lasertag/red/laserdome
|
||||
name = "red team laserdome equipment"
|
||||
desc = "It's a storage unit for laser tag equipment."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/red
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/device/encryptionkey/ent = 3,
|
||||
/obj/item/clothing/gloves/bluespace = 3,
|
||||
/obj/item/clothing/under/color/red = 3,
|
||||
/obj/item/weapon/gun/energy/lasertag/red = 3,
|
||||
/obj/item/clothing/head/redtag = 3,
|
||||
/obj/item/clothing/suit/redtag = 3)
|
||||
|
||||
/obj/structure/closet/lasertag/blue/laserdome
|
||||
name = "blue team laserdome equipment"
|
||||
desc = "It's a storage unit for laser tag equipment."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/blue
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/device/encryptionkey/ent = 3,
|
||||
/obj/item/clothing/gloves/bluespace = 3,
|
||||
/obj/item/clothing/under/color/blue = 3,
|
||||
/obj/item/weapon/gun/energy/lasertag/blue = 3,
|
||||
/obj/item/clothing/head/bluetag = 3,
|
||||
/obj/item/clothing/suit/bluetag = 3)
|
||||
/obj/structure/closet/athletic_mixed
|
||||
name = "athletic wardrobe"
|
||||
desc = "It's a storage unit for athletic wear."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/mixed
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/under/shorts/grey,
|
||||
/obj/item/clothing/under/shorts/black,
|
||||
/obj/item/clothing/under/shorts/red,
|
||||
/obj/item/clothing/under/shorts/blue,
|
||||
/obj/item/clothing/under/shorts/green,
|
||||
/obj/item/clothing/under/shorts/white,
|
||||
/obj/item/clothing/suit/storage/toggle/track,
|
||||
/obj/item/clothing/suit/storage/toggle/track/blue,
|
||||
/obj/item/clothing/suit/storage/toggle/track/green,
|
||||
/obj/item/clothing/suit/storage/toggle/track/red,
|
||||
/obj/item/clothing/suit/storage/toggle/track/white,
|
||||
/obj/item/clothing/under/pants/track,
|
||||
/obj/item/clothing/under/pants/track/blue,
|
||||
/obj/item/clothing/under/pants/track/green,
|
||||
/obj/item/clothing/under/pants/track/white,
|
||||
/obj/item/clothing/under/pants/track/red,
|
||||
/obj/item/clothing/shoes/athletic = 2,
|
||||
/obj/item/clothing/shoes/hitops,
|
||||
/obj/item/clothing/shoes/hitops/red,
|
||||
/obj/item/clothing/shoes/hitops/black,
|
||||
/obj/item/clothing/shoes/hitops/blue
|
||||
)
|
||||
|
||||
/obj/structure/closet/athletic_swimwear
|
||||
name = "athletic wardrobe"
|
||||
desc = "It's a storage unit for swimwear."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/mixed
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/under/shorts/grey,
|
||||
/obj/item/clothing/under/shorts/black,
|
||||
/obj/item/clothing/under/shorts/red,
|
||||
/obj/item/clothing/under/shorts/blue,
|
||||
/obj/item/clothing/under/shorts/green,
|
||||
/obj/item/clothing/under/swimsuit/red,
|
||||
/obj/item/clothing/under/swimsuit/black,
|
||||
/obj/item/clothing/under/swimsuit/blue,
|
||||
/obj/item/clothing/under/swimsuit/green,
|
||||
/obj/item/clothing/under/swimsuit/purple,
|
||||
/obj/item/clothing/under/swimsuit/striped,
|
||||
/obj/item/clothing/under/swimsuit/white,
|
||||
/obj/item/clothing/under/swimsuit/earth,
|
||||
/obj/item/clothing/under/wetsuit,
|
||||
/obj/item/clothing/under/wetsuit_rec,
|
||||
/obj/item/clothing/under/wetsuit_skimpy,
|
||||
/obj/item/clothing/mask/snorkel = 2,
|
||||
/obj/item/clothing/shoes/swimmingfins = 2)
|
||||
|
||||
/obj/structure/closet/boxinggloves
|
||||
name = "boxing gloves"
|
||||
desc = "It's a storage unit for gloves for use in the boxing ring."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/mixed
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/gloves/boxing/blue,
|
||||
/obj/item/clothing/gloves/boxing/green,
|
||||
/obj/item/clothing/gloves/boxing/yellow,
|
||||
/obj/item/clothing/gloves/boxing)
|
||||
|
||||
/obj/structure/closet/masks
|
||||
name = "mask closet"
|
||||
desc = "IT'S A STORAGE UNIT FOR FIGHTER MASKS OLE!"
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/mixed
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/mask/luchador,
|
||||
/obj/item/clothing/mask/luchador/rudos,
|
||||
/obj/item/clothing/mask/luchador/tecnicos)
|
||||
|
||||
|
||||
/obj/structure/closet/lasertag/red
|
||||
name = "red laser tag equipment"
|
||||
desc = "It's a storage unit for laser tag equipment."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/red
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/gun/energy/lasertag/red = 5,
|
||||
/obj/item/clothing/suit/redtag = 5)
|
||||
|
||||
|
||||
/obj/structure/closet/lasertag/blue
|
||||
name = "blue laser tag equipment"
|
||||
desc = "It's a storage unit for laser tag equipment."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/blue
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/gun/energy/lasertag/blue = 5,
|
||||
/obj/item/clothing/suit/bluetag = 5)
|
||||
|
||||
/obj/structure/closet/lasertag/red/laserdome
|
||||
name = "red team laserdome equipment"
|
||||
desc = "It's a storage unit for laser tag equipment."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/red
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/device/encryptionkey/ent = 3,
|
||||
/obj/item/clothing/gloves/bluespace = 3,
|
||||
/obj/item/clothing/under/color/red = 3,
|
||||
/obj/item/weapon/gun/energy/lasertag/red = 3,
|
||||
/obj/item/clothing/head/redtag = 3,
|
||||
/obj/item/clothing/suit/redtag = 3)
|
||||
|
||||
/obj/structure/closet/lasertag/blue/laserdome
|
||||
name = "blue team laserdome equipment"
|
||||
desc = "It's a storage unit for laser tag equipment."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/blue
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/device/encryptionkey/ent = 3,
|
||||
/obj/item/clothing/gloves/bluespace = 3,
|
||||
/obj/item/clothing/under/color/blue = 3,
|
||||
/obj/item/weapon/gun/energy/lasertag/blue = 3,
|
||||
/obj/item/clothing/head/bluetag = 3,
|
||||
/obj/item/clothing/suit/bluetag = 3)
|
||||
|
||||
@@ -1,84 +1,84 @@
|
||||
/obj/structure/closet/cabinet
|
||||
name = "cabinet"
|
||||
desc = "Old will forever be in fashion."
|
||||
icon = 'icons/obj/closets/bases/cabinet.dmi'
|
||||
closet_appearance = /decl/closet_appearance/cabinet
|
||||
|
||||
open_sound = 'sound/effects/wooden_closet_open.ogg'
|
||||
close_sound = 'sound/effects/wooden_closet_close.ogg'
|
||||
|
||||
/obj/structure/closet/acloset
|
||||
name = "strange closet"
|
||||
desc = "It looks alien!"
|
||||
closet_appearance = /decl/closet_appearance/alien
|
||||
|
||||
open_sound = 'sound/machines/click.ogg'
|
||||
close_sound = 'sound/machines/click.ogg'
|
||||
|
||||
/obj/structure/closet/gimmick
|
||||
name = "administrative supply closet"
|
||||
desc = "It's a storage unit for things that have no right being here."
|
||||
closet_appearance = /decl/closet_appearance/tactical
|
||||
anchored = FALSE
|
||||
|
||||
/obj/structure/closet/gimmick/russian
|
||||
name = "russian surplus closet"
|
||||
desc = "It's a storage unit for Russian standard-issue surplus."
|
||||
closet_appearance = /decl/closet_appearance/tactical
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/head/ushanka = 5,
|
||||
/obj/item/clothing/under/soviet = 5)
|
||||
|
||||
|
||||
/obj/structure/closet/gimmick/tacticool
|
||||
name = "tacticool gear closet"
|
||||
desc = "It's a storage unit for Tacticool gear."
|
||||
closet_appearance = /decl/closet_appearance/tactical
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/glasses/eyepatch,
|
||||
/obj/item/clothing/glasses/sunglasses,
|
||||
/obj/item/clothing/gloves/swat = 2,
|
||||
/obj/item/clothing/head/helmet/swat = 2,
|
||||
/obj/item/clothing/mask/gas = 2,
|
||||
/obj/item/clothing/shoes/boots/swat = 2,
|
||||
/obj/item/clothing/suit/armor/swat = 2,
|
||||
/obj/item/clothing/under/syndicate/tacticool = 2)
|
||||
|
||||
|
||||
/obj/structure/closet/thunderdome
|
||||
name = "\improper Thunderdome closet"
|
||||
desc = "Everything you need!"
|
||||
closet_appearance = /decl/closet_appearance/thunderdomered
|
||||
anchored = TRUE
|
||||
|
||||
/obj/structure/closet/thunderdome/tdred
|
||||
name = "red-team Thunderdome closet"
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/armor/tdome/red = 3,
|
||||
/obj/item/weapon/melee/energy/sword = 3,
|
||||
/obj/item/weapon/gun/energy/laser = 3,
|
||||
/obj/item/weapon/melee/baton = 3,
|
||||
/obj/item/weapon/storage/box/flashbangs = 3,
|
||||
/obj/item/clothing/head/helmet/thunderdome = 3)
|
||||
|
||||
/obj/structure/closet/thunderdome/tdgreen
|
||||
name = "green-team Thunderdome closet"
|
||||
closet_appearance = /decl/closet_appearance/thunderdomegreen
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/armor/tdome/green = 3,
|
||||
/obj/item/weapon/melee/energy/sword = 3,
|
||||
/obj/item/weapon/gun/energy/laser = 3,
|
||||
/obj/item/weapon/melee/baton = 3,
|
||||
/obj/item/weapon/storage/box/flashbangs = 3,
|
||||
/obj/item/clothing/head/helmet/thunderdome = 3)
|
||||
|
||||
/obj/structure/closet/alien
|
||||
name = "alien container"
|
||||
desc = "Contains secrets of the universe."
|
||||
icon = 'icons/obj/closets/abductor.dmi'
|
||||
anchored = TRUE
|
||||
closet_appearance = null // special icons
|
||||
/obj/structure/closet/cabinet
|
||||
name = "cabinet"
|
||||
desc = "Old will forever be in fashion."
|
||||
icon = 'icons/obj/closets/bases/cabinet.dmi'
|
||||
closet_appearance = /decl/closet_appearance/cabinet
|
||||
|
||||
open_sound = 'sound/effects/wooden_closet_open.ogg'
|
||||
close_sound = 'sound/effects/wooden_closet_close.ogg'
|
||||
|
||||
/obj/structure/closet/acloset
|
||||
name = "strange closet"
|
||||
desc = "It looks alien!"
|
||||
closet_appearance = /decl/closet_appearance/alien
|
||||
|
||||
open_sound = 'sound/machines/click.ogg'
|
||||
close_sound = 'sound/machines/click.ogg'
|
||||
|
||||
/obj/structure/closet/gimmick
|
||||
name = "administrative supply closet"
|
||||
desc = "It's a storage unit for things that have no right being here."
|
||||
closet_appearance = /decl/closet_appearance/tactical
|
||||
anchored = FALSE
|
||||
|
||||
/obj/structure/closet/gimmick/russian
|
||||
name = "russian surplus closet"
|
||||
desc = "It's a storage unit for Russian standard-issue surplus."
|
||||
closet_appearance = /decl/closet_appearance/tactical
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/head/ushanka = 5,
|
||||
/obj/item/clothing/under/soviet = 5)
|
||||
|
||||
|
||||
/obj/structure/closet/gimmick/tacticool
|
||||
name = "tacticool gear closet"
|
||||
desc = "It's a storage unit for Tacticool gear."
|
||||
closet_appearance = /decl/closet_appearance/tactical
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/glasses/eyepatch,
|
||||
/obj/item/clothing/glasses/sunglasses,
|
||||
/obj/item/clothing/gloves/swat = 2,
|
||||
/obj/item/clothing/head/helmet/swat = 2,
|
||||
/obj/item/clothing/mask/gas = 2,
|
||||
/obj/item/clothing/shoes/boots/swat = 2,
|
||||
/obj/item/clothing/suit/armor/swat = 2,
|
||||
/obj/item/clothing/under/syndicate/tacticool = 2)
|
||||
|
||||
|
||||
/obj/structure/closet/thunderdome
|
||||
name = "\improper Thunderdome closet"
|
||||
desc = "Everything you need!"
|
||||
closet_appearance = /decl/closet_appearance/thunderdomered
|
||||
anchored = TRUE
|
||||
|
||||
/obj/structure/closet/thunderdome/tdred
|
||||
name = "red-team Thunderdome closet"
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/armor/tdome/red = 3,
|
||||
/obj/item/weapon/melee/energy/sword = 3,
|
||||
/obj/item/weapon/gun/energy/laser = 3,
|
||||
/obj/item/weapon/melee/baton = 3,
|
||||
/obj/item/weapon/storage/box/flashbangs = 3,
|
||||
/obj/item/clothing/head/helmet/thunderdome = 3)
|
||||
|
||||
/obj/structure/closet/thunderdome/tdgreen
|
||||
name = "green-team Thunderdome closet"
|
||||
closet_appearance = /decl/closet_appearance/thunderdomegreen
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/armor/tdome/green = 3,
|
||||
/obj/item/weapon/melee/energy/sword = 3,
|
||||
/obj/item/weapon/gun/energy/laser = 3,
|
||||
/obj/item/weapon/melee/baton = 3,
|
||||
/obj/item/weapon/storage/box/flashbangs = 3,
|
||||
/obj/item/clothing/head/helmet/thunderdome = 3)
|
||||
|
||||
/obj/structure/closet/alien
|
||||
name = "alien container"
|
||||
desc = "Contains secrets of the universe."
|
||||
icon = 'icons/obj/closets/abductor.dmi'
|
||||
anchored = TRUE
|
||||
closet_appearance = null // special icons
|
||||
|
||||
@@ -1,132 +1,132 @@
|
||||
/*
|
||||
* Closets for specific jobs
|
||||
* Contains:
|
||||
* Bartender
|
||||
* Janitor
|
||||
* Lawyer
|
||||
* Janitorial Equipment
|
||||
*
|
||||
*
|
||||
* These have been removed from the map for the most part, however
|
||||
* do not remove these in case people want to make maps or POIs
|
||||
* with these closets.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* Bartender
|
||||
*/
|
||||
/obj/structure/closet/gmcloset
|
||||
name = "formal closet"
|
||||
desc = "It's a storage unit for formal clothing."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/suit
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/head/that = 2,
|
||||
/obj/item/device/radio/headset/headset_service = 2,
|
||||
/obj/item/clothing/head/pin/flower,
|
||||
/obj/item/clothing/head/pin/flower/pink,
|
||||
/obj/item/clothing/head/pin/flower/yellow,
|
||||
/obj/item/clothing/head/pin/flower/blue,
|
||||
/obj/item/clothing/head/pin/pink,
|
||||
/obj/item/clothing/head/pin/magnetic,
|
||||
/obj/item/clothing/under/sl_suit = 2,
|
||||
/obj/item/clothing/under/rank/bartender = 2,
|
||||
/obj/item/clothing/under/rank/bartender/skirt,
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/bar,
|
||||
/obj/item/clothing/under/dress/dress_saloon,
|
||||
/obj/item/clothing/accessory/wcoat = 2,
|
||||
/obj/item/clothing/shoes/black = 2,
|
||||
/obj/item/clothing/shoes/laceup
|
||||
)
|
||||
|
||||
/*
|
||||
* Chef
|
||||
*/
|
||||
/obj/structure/closet/chefcloset
|
||||
name = "chef's closet"
|
||||
desc = "It's a storage unit for foodservice garments."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/white
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/under/sundress,
|
||||
/obj/item/clothing/under/waiter = 2,
|
||||
/obj/item/device/radio/headset/headset_service = 2,
|
||||
/obj/item/weapon/storage/box/mousetraps = 2,
|
||||
/obj/item/clothing/under/rank/chef,
|
||||
/obj/item/clothing/head/chefhat,
|
||||
/obj/item/weapon/storage/bag/food = 2
|
||||
)
|
||||
|
||||
/*
|
||||
* Janitor
|
||||
*/
|
||||
/obj/structure/closet/jcloset
|
||||
name = "custodial closet"
|
||||
desc = "It's a storage unit for janitorial clothes and gear."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/janitor
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/under/rank/janitor,
|
||||
/obj/item/clothing/under/dress/maid/janitor,
|
||||
/obj/item/device/radio/headset/headset_service,
|
||||
/obj/item/weapon/cartridge/janitor,
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/janitor,
|
||||
/obj/item/clothing/gloves/black,
|
||||
/obj/item/clothing/head/soft/purple,
|
||||
/obj/item/clothing/head/beret/purple,
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/clothing/suit/caution = 4,
|
||||
/obj/item/device/lightreplacer,
|
||||
/obj/item/weapon/storage/bag/trash,
|
||||
/obj/item/weapon/storage/belt/janitor,
|
||||
/obj/item/clothing/shoes/galoshes
|
||||
)
|
||||
|
||||
/*
|
||||
* Lawyer
|
||||
*/
|
||||
/obj/structure/closet/lawcloset
|
||||
name = "legal closet"
|
||||
desc = "It's a storage unit for courtroom apparel and items."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/suit
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/under/lawyer/female = 2,
|
||||
/obj/item/clothing/under/lawyer/black = 2,
|
||||
/obj/item/clothing/under/lawyer/black/skirt = 2,
|
||||
/obj/item/clothing/under/lawyer/red = 2,
|
||||
/obj/item/clothing/under/lawyer/red/skirt = 2,
|
||||
/obj/item/clothing/suit/storage/toggle/internalaffairs = 2,
|
||||
/obj/item/clothing/under/lawyer/bluesuit = 2,
|
||||
/obj/item/clothing/under/lawyer/bluesuit/skirt = 2,
|
||||
/obj/item/clothing/suit/storage/toggle/lawyer/bluejacket = 2,
|
||||
/obj/item/clothing/under/lawyer/purpsuit = 2,
|
||||
/obj/item/clothing/under/lawyer/purpsuit/skirt = 2,
|
||||
/obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 2,
|
||||
/obj/item/clothing/shoes/brown = 2,
|
||||
/obj/item/clothing/shoes/black = 2,
|
||||
/obj/item/clothing/shoes/laceup = 2,
|
||||
/obj/item/clothing/glasses/sunglasses/big = 2,
|
||||
/obj/item/clothing/under/lawyer/blue = 2,
|
||||
/obj/item/clothing/under/lawyer/blue/skirt = 2,
|
||||
/obj/item/device/tape/random = 2
|
||||
)
|
||||
|
||||
/*
|
||||
* Janitorial Equipment
|
||||
*/
|
||||
/obj/structure/closet/jequipcloset
|
||||
name = "custodial equipment closet"
|
||||
desc = "It's a storage unit for janitorial clothes and gear."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/janitor
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/device/flashlight = 5,
|
||||
/obj/item/clothing/suit/caution = 12,
|
||||
/obj/item/device/lightreplacer = 3,
|
||||
/obj/item/weapon/storage/bag/trash = 3,
|
||||
/obj/item/weapon/storage/box/lights/mixed = 3,
|
||||
/obj/item/weapon/storage/box/mousetraps = 1,
|
||||
/obj/item/weapon/grenade/chem_grenade/cleaner = 4
|
||||
)
|
||||
/*
|
||||
* Closets for specific jobs
|
||||
* Contains:
|
||||
* Bartender
|
||||
* Janitor
|
||||
* Lawyer
|
||||
* Janitorial Equipment
|
||||
*
|
||||
*
|
||||
* These have been removed from the map for the most part, however
|
||||
* do not remove these in case people want to make maps or POIs
|
||||
* with these closets.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* Bartender
|
||||
*/
|
||||
/obj/structure/closet/gmcloset
|
||||
name = "formal closet"
|
||||
desc = "It's a storage unit for formal clothing."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/suit
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/head/that = 2,
|
||||
/obj/item/device/radio/headset/headset_service = 2,
|
||||
/obj/item/clothing/head/pin/flower,
|
||||
/obj/item/clothing/head/pin/flower/pink,
|
||||
/obj/item/clothing/head/pin/flower/yellow,
|
||||
/obj/item/clothing/head/pin/flower/blue,
|
||||
/obj/item/clothing/head/pin/pink,
|
||||
/obj/item/clothing/head/pin/magnetic,
|
||||
/obj/item/clothing/under/sl_suit = 2,
|
||||
/obj/item/clothing/under/rank/bartender = 2,
|
||||
/obj/item/clothing/under/rank/bartender/skirt,
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/bar,
|
||||
/obj/item/clothing/under/dress/dress_saloon,
|
||||
/obj/item/clothing/accessory/wcoat = 2,
|
||||
/obj/item/clothing/shoes/black = 2,
|
||||
/obj/item/clothing/shoes/laceup
|
||||
)
|
||||
|
||||
/*
|
||||
* Chef
|
||||
*/
|
||||
/obj/structure/closet/chefcloset
|
||||
name = "chef's closet"
|
||||
desc = "It's a storage unit for foodservice garments."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/white
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/under/sundress,
|
||||
/obj/item/clothing/under/waiter = 2,
|
||||
/obj/item/device/radio/headset/headset_service = 2,
|
||||
/obj/item/weapon/storage/box/mousetraps = 2,
|
||||
/obj/item/clothing/under/rank/chef,
|
||||
/obj/item/clothing/head/chefhat,
|
||||
/obj/item/weapon/storage/bag/food = 2
|
||||
)
|
||||
|
||||
/*
|
||||
* Janitor
|
||||
*/
|
||||
/obj/structure/closet/jcloset
|
||||
name = "custodial closet"
|
||||
desc = "It's a storage unit for janitorial clothes and gear."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/janitor
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/under/rank/janitor,
|
||||
/obj/item/clothing/under/dress/maid/janitor,
|
||||
/obj/item/device/radio/headset/headset_service,
|
||||
/obj/item/weapon/cartridge/janitor,
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/janitor,
|
||||
/obj/item/clothing/gloves/black,
|
||||
/obj/item/clothing/head/soft/purple,
|
||||
/obj/item/clothing/head/beret/purple,
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/clothing/suit/caution = 4,
|
||||
/obj/item/device/lightreplacer,
|
||||
/obj/item/weapon/storage/bag/trash,
|
||||
/obj/item/weapon/storage/belt/janitor,
|
||||
/obj/item/clothing/shoes/galoshes
|
||||
)
|
||||
|
||||
/*
|
||||
* Lawyer
|
||||
*/
|
||||
/obj/structure/closet/lawcloset
|
||||
name = "legal closet"
|
||||
desc = "It's a storage unit for courtroom apparel and items."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/suit
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/under/lawyer/female = 2,
|
||||
/obj/item/clothing/under/lawyer/black = 2,
|
||||
/obj/item/clothing/under/lawyer/black/skirt = 2,
|
||||
/obj/item/clothing/under/lawyer/red = 2,
|
||||
/obj/item/clothing/under/lawyer/red/skirt = 2,
|
||||
/obj/item/clothing/suit/storage/toggle/internalaffairs = 2,
|
||||
/obj/item/clothing/under/lawyer/bluesuit = 2,
|
||||
/obj/item/clothing/under/lawyer/bluesuit/skirt = 2,
|
||||
/obj/item/clothing/suit/storage/toggle/lawyer/bluejacket = 2,
|
||||
/obj/item/clothing/under/lawyer/purpsuit = 2,
|
||||
/obj/item/clothing/under/lawyer/purpsuit/skirt = 2,
|
||||
/obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 2,
|
||||
/obj/item/clothing/shoes/brown = 2,
|
||||
/obj/item/clothing/shoes/black = 2,
|
||||
/obj/item/clothing/shoes/laceup = 2,
|
||||
/obj/item/clothing/glasses/sunglasses/big = 2,
|
||||
/obj/item/clothing/under/lawyer/blue = 2,
|
||||
/obj/item/clothing/under/lawyer/blue/skirt = 2,
|
||||
/obj/item/device/tape/random = 2
|
||||
)
|
||||
|
||||
/*
|
||||
* Janitorial Equipment
|
||||
*/
|
||||
/obj/structure/closet/jequipcloset
|
||||
name = "custodial equipment closet"
|
||||
desc = "It's a storage unit for janitorial clothes and gear."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/janitor
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/device/flashlight = 5,
|
||||
/obj/item/clothing/suit/caution = 12,
|
||||
/obj/item/device/lightreplacer = 3,
|
||||
/obj/item/weapon/storage/bag/trash = 3,
|
||||
/obj/item/weapon/storage/box/lights/mixed = 3,
|
||||
/obj/item/weapon/storage/box/mousetraps = 1,
|
||||
/obj/item/weapon/grenade/chem_grenade/cleaner = 4
|
||||
)
|
||||
|
||||
@@ -1,63 +1,63 @@
|
||||
/obj/structure/closet/l3closet
|
||||
name = "level-3 biohazard suit closet"
|
||||
desc = "It's a storage unit for level-3 biohazard gear."
|
||||
closet_appearance = /decl/closet_appearance/bio
|
||||
|
||||
/obj/structure/closet/l3closet/general
|
||||
closet_appearance = /decl/closet_appearance/bio
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bio_suit/general,
|
||||
/obj/item/clothing/head/bio_hood/general)
|
||||
|
||||
|
||||
/obj/structure/closet/l3closet/virology
|
||||
closet_appearance = /decl/closet_appearance/bio/virology
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bio_suit/virology,
|
||||
/obj/item/clothing/head/bio_hood/virology,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/weapon/tank/oxygen)
|
||||
|
||||
|
||||
/obj/structure/closet/l3closet/security
|
||||
closet_appearance = /decl/closet_appearance/bio/security
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bio_suit/security,
|
||||
/obj/item/clothing/head/bio_hood/security)
|
||||
///obj/item/weapon/gun/energy/taser/xeno/sec) //VOREStation Removal
|
||||
|
||||
/obj/structure/closet/l3closet/janitor
|
||||
closet_appearance = /decl/closet_appearance/bio/janitor
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bio_suit/janitor = 2,
|
||||
/obj/item/clothing/head/bio_hood/janitor = 2,
|
||||
/obj/item/clothing/mask/gas = 2,
|
||||
/obj/item/weapon/tank/emergency/oxygen/engi = 2)
|
||||
|
||||
|
||||
/obj/structure/closet/l3closet/scientist
|
||||
closet_appearance = /decl/closet_appearance/bio/science
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bio_suit/scientist,
|
||||
/obj/item/clothing/head/bio_hood/scientist,
|
||||
/obj/item/weapon/storage/bag/xeno = 1)
|
||||
|
||||
/obj/structure/closet/l3closet/scientist/double
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bio_suit/scientist = 2,
|
||||
/obj/item/clothing/head/bio_hood/scientist = 2,
|
||||
/obj/item/weapon/storage/bag/xeno = 2) // VOREEdit, adding the xenobag to xenobio.
|
||||
|
||||
|
||||
/obj/structure/closet/l3closet/medical
|
||||
closet_appearance = /decl/closet_appearance/bio/medical
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bio_suit/general = 3,
|
||||
/obj/item/clothing/head/bio_hood/general = 3,
|
||||
/obj/item/clothing/mask/gas = 3)
|
||||
/obj/structure/closet/l3closet
|
||||
name = "level-3 biohazard suit closet"
|
||||
desc = "It's a storage unit for level-3 biohazard gear."
|
||||
closet_appearance = /decl/closet_appearance/bio
|
||||
|
||||
/obj/structure/closet/l3closet/general
|
||||
closet_appearance = /decl/closet_appearance/bio
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bio_suit/general,
|
||||
/obj/item/clothing/head/bio_hood/general)
|
||||
|
||||
|
||||
/obj/structure/closet/l3closet/virology
|
||||
closet_appearance = /decl/closet_appearance/bio/virology
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bio_suit/virology,
|
||||
/obj/item/clothing/head/bio_hood/virology,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/weapon/tank/oxygen)
|
||||
|
||||
|
||||
/obj/structure/closet/l3closet/security
|
||||
closet_appearance = /decl/closet_appearance/bio/security
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bio_suit/security,
|
||||
/obj/item/clothing/head/bio_hood/security)
|
||||
///obj/item/weapon/gun/energy/taser/xeno/sec) //VOREStation Removal
|
||||
|
||||
/obj/structure/closet/l3closet/janitor
|
||||
closet_appearance = /decl/closet_appearance/bio/janitor
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bio_suit/janitor = 2,
|
||||
/obj/item/clothing/head/bio_hood/janitor = 2,
|
||||
/obj/item/clothing/mask/gas = 2,
|
||||
/obj/item/weapon/tank/emergency/oxygen/engi = 2)
|
||||
|
||||
|
||||
/obj/structure/closet/l3closet/scientist
|
||||
closet_appearance = /decl/closet_appearance/bio/science
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bio_suit/scientist,
|
||||
/obj/item/clothing/head/bio_hood/scientist,
|
||||
/obj/item/weapon/storage/bag/xeno = 1)
|
||||
|
||||
/obj/structure/closet/l3closet/scientist/double
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bio_suit/scientist = 2,
|
||||
/obj/item/clothing/head/bio_hood/scientist = 2,
|
||||
/obj/item/weapon/storage/bag/xeno = 2) // VOREEdit, adding the xenobag to xenobio.
|
||||
|
||||
|
||||
/obj/structure/closet/l3closet/medical
|
||||
closet_appearance = /decl/closet_appearance/bio/medical
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bio_suit/general = 3,
|
||||
/obj/item/clothing/head/bio_hood/general = 3,
|
||||
/obj/item/clothing/mask/gas = 3)
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
/obj/structure/closet/malf/suits
|
||||
desc = "It's a storage unit for operational gear."
|
||||
closet_appearance = /decl/closet_appearance/tactical
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/tank/jetpack/void,
|
||||
/obj/item/clothing/mask/breath,
|
||||
/obj/item/clothing/head/helmet/space/void,
|
||||
/obj/item/clothing/suit/space/void,
|
||||
/obj/item/weapon/tool/crowbar,
|
||||
/obj/item/weapon/cell,
|
||||
/obj/item/device/multitool)
|
||||
/obj/structure/closet/malf/suits
|
||||
desc = "It's a storage unit for operational gear."
|
||||
closet_appearance = /decl/closet_appearance/tactical
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/tank/jetpack/void,
|
||||
/obj/item/clothing/mask/breath,
|
||||
/obj/item/clothing/head/helmet/space/void,
|
||||
/obj/item/clothing/suit/space/void,
|
||||
/obj/item/weapon/tool/crowbar,
|
||||
/obj/item/weapon/cell,
|
||||
/obj/item/device/multitool)
|
||||
|
||||
@@ -1,51 +1,51 @@
|
||||
/obj/structure/closet/secure_closet/freezer/kitchen
|
||||
name = "kitchen cabinet"
|
||||
req_access = list(access_kitchen)
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/reagent_containers/food/condiment/carton/flour = 6,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/carton/sugar = 1,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/carton/flour/rustic = 1,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/carton/sugar/rustic = 1,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/spacespice = 2
|
||||
)
|
||||
|
||||
open_sound = 'sound/machines/click.ogg'
|
||||
close_sound = 'sound/machines/click.ogg'
|
||||
|
||||
/obj/structure/closet/secure_closet/freezer/kitchen/mining
|
||||
req_access = list()
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/freezer/meat
|
||||
name = "meat fridge"
|
||||
icon = 'icons/obj/closets/fridge.dmi'
|
||||
closet_appearance = null
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/monkey = 10)
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/freezer/fridge
|
||||
name = "refrigerator"
|
||||
icon = 'icons/obj/closets/fridge.dmi'
|
||||
closet_appearance = null
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/reagent_containers/food/drinks/milk = 6,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/soymilk = 4,
|
||||
/obj/item/weapon/storage/fancy/egg_box = 4,
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose = 2)
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/freezer/money
|
||||
name = "freezer"
|
||||
icon = 'icons/obj/closets/fridge.dmi'
|
||||
closet_appearance = null
|
||||
req_access = list(access_heads_vault)
|
||||
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/spacecash/c1000 = 3,
|
||||
/obj/item/weapon/spacecash/c500 = 4,
|
||||
/obj/item/weapon/spacecash/c200 = 5)
|
||||
/obj/structure/closet/secure_closet/freezer/kitchen
|
||||
name = "kitchen cabinet"
|
||||
req_access = list(access_kitchen)
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/reagent_containers/food/condiment/carton/flour = 6,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/carton/sugar = 1,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/carton/flour/rustic = 1,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/carton/sugar/rustic = 1,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/spacespice = 2
|
||||
)
|
||||
|
||||
open_sound = 'sound/machines/click.ogg'
|
||||
close_sound = 'sound/machines/click.ogg'
|
||||
|
||||
/obj/structure/closet/secure_closet/freezer/kitchen/mining
|
||||
req_access = list()
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/freezer/meat
|
||||
name = "meat fridge"
|
||||
icon = 'icons/obj/closets/fridge.dmi'
|
||||
closet_appearance = null
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/monkey = 10)
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/freezer/fridge
|
||||
name = "refrigerator"
|
||||
icon = 'icons/obj/closets/fridge.dmi'
|
||||
closet_appearance = null
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/reagent_containers/food/drinks/milk = 6,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/soymilk = 4,
|
||||
/obj/item/weapon/storage/fancy/egg_box = 4,
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose = 2)
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/freezer/money
|
||||
name = "freezer"
|
||||
icon = 'icons/obj/closets/fridge.dmi'
|
||||
closet_appearance = null
|
||||
req_access = list(access_heads_vault)
|
||||
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/spacecash/c1000 = 3,
|
||||
/obj/item/weapon/spacecash/c500 = 4,
|
||||
/obj/item/weapon/spacecash/c200 = 5)
|
||||
|
||||
@@ -1,115 +1,115 @@
|
||||
/obj/structure/closet/secure_closet/personal
|
||||
name = "personal closet"
|
||||
desc = "It's a secure locker for personnel. The first card swiped gains control."
|
||||
req_access = list(access_all_personal_lockers)
|
||||
var/registered_name = null
|
||||
|
||||
/* //VOREStation Removal
|
||||
starts_with = list(
|
||||
/obj/item/device/radio/headset)
|
||||
*/
|
||||
|
||||
/obj/structure/closet/secure_closet/personal/Initialize()
|
||||
/* //VOREStation Removal
|
||||
if(prob(50))
|
||||
starts_with += /obj/item/weapon/storage/backpack
|
||||
else
|
||||
starts_with += /obj/item/weapon/storage/backpack/satchel/norm
|
||||
*/
|
||||
return ..()
|
||||
|
||||
/obj/structure/closet/secure_closet/personal/patient
|
||||
name = "patient's closet"
|
||||
closet_appearance = /decl/closet_appearance/secure_closet/patient
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/under/medigown,
|
||||
/obj/item/clothing/under/color/white,
|
||||
/obj/item/clothing/shoes/white)
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/personal/cabinet
|
||||
closet_appearance = /decl/closet_appearance/cabinet/secure
|
||||
|
||||
open_sound = 'sound/effects/wooden_closet_open.ogg'
|
||||
close_sound = 'sound/effects/wooden_closet_close.ogg'
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/storage/backpack/satchel/withwallet,
|
||||
/obj/item/device/radio/headset
|
||||
)
|
||||
|
||||
/obj/structure/closet/secure_closet/personal/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if (src.opened)
|
||||
if(istype(W, /obj/item/weapon/storage/laundry_basket))
|
||||
return ..(W,user)
|
||||
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
|
||||
to_chat(user, "<span class='notice'>The locker is too small to stuff [G.affecting] into!</span>")
|
||||
if(isrobot(user))
|
||||
return
|
||||
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(W.GetID())
|
||||
var/obj/item/weapon/card/id/I = W.GetID()
|
||||
|
||||
if(src.broken)
|
||||
to_chat(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)))
|
||||
//they can open all lockers, or nobody owns this, or they own this locker
|
||||
src.locked = !( src.locked )
|
||||
|
||||
if(!src.registered_name)
|
||||
src.registered_name = I.registered_name
|
||||
src.desc = "Owned by [I.registered_name]."
|
||||
else
|
||||
to_chat(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."))
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
||||
spark_system.set_up(5, 0, src.loc)
|
||||
spark_system.start()
|
||||
playsound(src, 'sound/weapons/blade1.ogg', 50, 1)
|
||||
playsound(src, "sparks", 50, 1)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Access Denied</span>")
|
||||
update_icon()
|
||||
|
||||
/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."
|
||||
update_icon()
|
||||
if(visual_feedback)
|
||||
visible_message("<span class='warning'>[visual_feedback]</span>", "<span class='warning'>[audible_feedback]</span>")
|
||||
return 1
|
||||
|
||||
/obj/structure/closet/secure_closet/personal/verb/reset()
|
||||
set src in oview(1) // One square distance
|
||||
set category = "Object"
|
||||
set name = "Reset Lock"
|
||||
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)
|
||||
to_chat(usr, "<span class='warning'>You need to unlock it first.</span>")
|
||||
else if (src.broken)
|
||||
to_chat(usr, "<span class='warning'>It appears to be broken.</span>")
|
||||
else
|
||||
if (src.opened)
|
||||
if(!src.close())
|
||||
return
|
||||
src.locked = 1
|
||||
update_icon()
|
||||
src.registered_name = null
|
||||
src.desc = "It's a secure locker for personnel. The first card swiped gains control."
|
||||
/obj/structure/closet/secure_closet/personal
|
||||
name = "personal closet"
|
||||
desc = "It's a secure locker for personnel. The first card swiped gains control."
|
||||
req_access = list(access_all_personal_lockers)
|
||||
var/registered_name = null
|
||||
|
||||
/* //VOREStation Removal
|
||||
starts_with = list(
|
||||
/obj/item/device/radio/headset)
|
||||
*/
|
||||
|
||||
/obj/structure/closet/secure_closet/personal/Initialize()
|
||||
/* //VOREStation Removal
|
||||
if(prob(50))
|
||||
starts_with += /obj/item/weapon/storage/backpack
|
||||
else
|
||||
starts_with += /obj/item/weapon/storage/backpack/satchel/norm
|
||||
*/
|
||||
return ..()
|
||||
|
||||
/obj/structure/closet/secure_closet/personal/patient
|
||||
name = "patient's closet"
|
||||
closet_appearance = /decl/closet_appearance/secure_closet/patient
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/under/medigown,
|
||||
/obj/item/clothing/under/color/white,
|
||||
/obj/item/clothing/shoes/white)
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/personal/cabinet
|
||||
closet_appearance = /decl/closet_appearance/cabinet/secure
|
||||
|
||||
open_sound = 'sound/effects/wooden_closet_open.ogg'
|
||||
close_sound = 'sound/effects/wooden_closet_close.ogg'
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/storage/backpack/satchel/withwallet,
|
||||
/obj/item/device/radio/headset
|
||||
)
|
||||
|
||||
/obj/structure/closet/secure_closet/personal/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if (src.opened)
|
||||
if(istype(W, /obj/item/weapon/storage/laundry_basket))
|
||||
return ..(W,user)
|
||||
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
|
||||
to_chat(user, "<span class='notice'>The locker is too small to stuff [G.affecting] into!</span>")
|
||||
if(isrobot(user))
|
||||
return
|
||||
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(W.GetID())
|
||||
var/obj/item/weapon/card/id/I = W.GetID()
|
||||
|
||||
if(src.broken)
|
||||
to_chat(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)))
|
||||
//they can open all lockers, or nobody owns this, or they own this locker
|
||||
src.locked = !( src.locked )
|
||||
|
||||
if(!src.registered_name)
|
||||
src.registered_name = I.registered_name
|
||||
src.desc = "Owned by [I.registered_name]."
|
||||
else
|
||||
to_chat(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."))
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
||||
spark_system.set_up(5, 0, src.loc)
|
||||
spark_system.start()
|
||||
playsound(src, 'sound/weapons/blade1.ogg', 50, 1)
|
||||
playsound(src, "sparks", 50, 1)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Access Denied</span>")
|
||||
update_icon()
|
||||
|
||||
/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."
|
||||
update_icon()
|
||||
if(visual_feedback)
|
||||
visible_message("<span class='warning'>[visual_feedback]</span>", "<span class='warning'>[audible_feedback]</span>")
|
||||
return 1
|
||||
|
||||
/obj/structure/closet/secure_closet/personal/verb/reset()
|
||||
set src in oview(1) // One square distance
|
||||
set category = "Object"
|
||||
set name = "Reset Lock"
|
||||
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)
|
||||
to_chat(usr, "<span class='warning'>You need to unlock it first.</span>")
|
||||
else if (src.broken)
|
||||
to_chat(usr, "<span class='warning'>It appears to be broken.</span>")
|
||||
else
|
||||
if (src.opened)
|
||||
if(!src.close())
|
||||
return
|
||||
src.locked = 1
|
||||
update_icon()
|
||||
src.registered_name = null
|
||||
src.desc = "It's a secure locker for personnel. The first card swiped gains control."
|
||||
|
||||
@@ -1,93 +1,93 @@
|
||||
/obj/structure/closet/secure_closet/scientist
|
||||
name = "scientist's locker"
|
||||
req_access = list(access_tox_storage)
|
||||
closet_appearance = /decl/closet_appearance/secure_closet/science
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/under/rank/scientist,
|
||||
/obj/item/clothing/suit/storage/toggle/labcoat,
|
||||
/obj/item/clothing/shoes/white,
|
||||
/obj/item/device/radio/headset/headset_sci,
|
||||
/obj/item/weapon/tank/air,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/science,
|
||||
/obj/item/clothing/shoes/boots/winter/science)
|
||||
|
||||
/obj/structure/closet/secure_closet/scientist/Initialize()
|
||||
if(prob(50))
|
||||
starts_with += /obj/item/weapon/storage/backpack/dufflebag/sci
|
||||
else
|
||||
starts_with += /obj/item/weapon/storage/backpack/toxins
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/RD
|
||||
name = "research director's locker"
|
||||
req_access = list(access_rd)
|
||||
closet_appearance = /decl/closet_appearance/secure_closet/science/rd
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bio_suit/scientist,
|
||||
/obj/item/clothing/head/bio_hood/scientist,
|
||||
/obj/item/clothing/under/rank/research_director,
|
||||
/obj/item/clothing/under/rank/research_director/rdalt,
|
||||
/obj/item/clothing/under/rank/research_director/dress_rd,
|
||||
/obj/item/clothing/suit/storage/toggle/labcoat,
|
||||
/obj/item/clothing/suit/storage/toggle/labcoat/modern,
|
||||
/obj/item/clothing/suit/storage/toggle/labcoat/rd,
|
||||
/obj/item/clothing/under/rank/neo_rd_turtle,
|
||||
/obj/item/clothing/under/rank/neo_rd_turtle_skirt,
|
||||
/obj/item/clothing/under/rank/neo_rd_suit,
|
||||
/obj/item/clothing/under/rank/neo_rd_suit_skirt,
|
||||
/obj/item/clothing/under/rank/neo_rd_gorka,
|
||||
/obj/item/weapon/cartridge/rd,
|
||||
/obj/item/clothing/shoes/white,
|
||||
/obj/item/clothing/shoes/laceup/brown,
|
||||
/obj/item/clothing/gloves/sterile/latex,
|
||||
/obj/item/device/radio/headset/heads/rd,
|
||||
/obj/item/device/radio/headset/heads/rd/alt,
|
||||
/obj/item/weapon/tank/air,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/device/flash,
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/science,
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/science/rd,
|
||||
/obj/item/clothing/shoes/boots/winter/science,
|
||||
/obj/item/clothing/head/beret/science/rd,
|
||||
/obj/item/weapon/bluespace_harpoon) //VOREStation Add
|
||||
|
||||
/obj/structure/closet/secure_closet/xenoarchaeologist
|
||||
name = "Xenoarchaeologist Locker"
|
||||
req_access = list(access_tox_storage)
|
||||
closet_appearance = /decl/closet_appearance/secure_closet/science/xenoarch
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/under/rank/scientist,
|
||||
/obj/item/clothing/suit/storage/toggle/labcoat,
|
||||
/obj/item/clothing/suit/storage/toggle/labcoat/modern,
|
||||
/obj/item/clothing/shoes/white,
|
||||
/obj/item/weapon/melee/umbrella,
|
||||
/obj/item/clothing/glasses/science,
|
||||
/obj/item/device/radio/headset/headset_sci,
|
||||
/obj/item/weapon/storage/belt/archaeology,
|
||||
/obj/item/weapon/storage/excavation)
|
||||
|
||||
/obj/structure/closet/excavation
|
||||
name = "Excavation tools"
|
||||
closet_appearance = /decl/closet_appearance/secure_closet/engineering/tools/xenoarch
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/storage/belt/archaeology,
|
||||
/obj/item/weapon/storage/excavation,
|
||||
/obj/item/device/flashlight/lantern,
|
||||
/obj/item/device/ano_scanner,
|
||||
/obj/item/device/depth_scanner,
|
||||
/obj/item/device/core_sampler,
|
||||
/obj/item/device/gps,
|
||||
/obj/item/device/beacon_locator,
|
||||
/obj/item/device/radio/beacon,
|
||||
/obj/item/clothing/glasses/meson,
|
||||
/obj/item/weapon/pickaxe,
|
||||
/obj/item/device/measuring_tape,
|
||||
/obj/item/weapon/pickaxe/hand,
|
||||
/obj/item/weapon/storage/bag/fossils,
|
||||
/obj/item/weapon/hand_labeler)
|
||||
/obj/structure/closet/secure_closet/scientist
|
||||
name = "scientist's locker"
|
||||
req_access = list(access_tox_storage)
|
||||
closet_appearance = /decl/closet_appearance/secure_closet/science
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/under/rank/scientist,
|
||||
/obj/item/clothing/suit/storage/toggle/labcoat,
|
||||
/obj/item/clothing/shoes/white,
|
||||
/obj/item/device/radio/headset/headset_sci,
|
||||
/obj/item/weapon/tank/air,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/science,
|
||||
/obj/item/clothing/shoes/boots/winter/science)
|
||||
|
||||
/obj/structure/closet/secure_closet/scientist/Initialize()
|
||||
if(prob(50))
|
||||
starts_with += /obj/item/weapon/storage/backpack/dufflebag/sci
|
||||
else
|
||||
starts_with += /obj/item/weapon/storage/backpack/toxins
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/RD
|
||||
name = "research director's locker"
|
||||
req_access = list(access_rd)
|
||||
closet_appearance = /decl/closet_appearance/secure_closet/science/rd
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bio_suit/scientist,
|
||||
/obj/item/clothing/head/bio_hood/scientist,
|
||||
/obj/item/clothing/under/rank/research_director,
|
||||
/obj/item/clothing/under/rank/research_director/rdalt,
|
||||
/obj/item/clothing/under/rank/research_director/dress_rd,
|
||||
/obj/item/clothing/suit/storage/toggle/labcoat,
|
||||
/obj/item/clothing/suit/storage/toggle/labcoat/modern,
|
||||
/obj/item/clothing/suit/storage/toggle/labcoat/rd,
|
||||
/obj/item/clothing/under/rank/neo_rd_turtle,
|
||||
/obj/item/clothing/under/rank/neo_rd_turtle_skirt,
|
||||
/obj/item/clothing/under/rank/neo_rd_suit,
|
||||
/obj/item/clothing/under/rank/neo_rd_suit_skirt,
|
||||
/obj/item/clothing/under/rank/neo_rd_gorka,
|
||||
/obj/item/weapon/cartridge/rd,
|
||||
/obj/item/clothing/shoes/white,
|
||||
/obj/item/clothing/shoes/laceup/brown,
|
||||
/obj/item/clothing/gloves/sterile/latex,
|
||||
/obj/item/device/radio/headset/heads/rd,
|
||||
/obj/item/device/radio/headset/heads/rd/alt,
|
||||
/obj/item/weapon/tank/air,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/device/flash,
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/science,
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/science/rd,
|
||||
/obj/item/clothing/shoes/boots/winter/science,
|
||||
/obj/item/clothing/head/beret/science/rd,
|
||||
/obj/item/weapon/bluespace_harpoon) //VOREStation Add
|
||||
|
||||
/obj/structure/closet/secure_closet/xenoarchaeologist
|
||||
name = "Xenoarchaeologist Locker"
|
||||
req_access = list(access_tox_storage)
|
||||
closet_appearance = /decl/closet_appearance/secure_closet/science/xenoarch
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/under/rank/scientist,
|
||||
/obj/item/clothing/suit/storage/toggle/labcoat,
|
||||
/obj/item/clothing/suit/storage/toggle/labcoat/modern,
|
||||
/obj/item/clothing/shoes/white,
|
||||
/obj/item/weapon/melee/umbrella,
|
||||
/obj/item/clothing/glasses/science,
|
||||
/obj/item/device/radio/headset/headset_sci,
|
||||
/obj/item/weapon/storage/belt/archaeology,
|
||||
/obj/item/weapon/storage/excavation)
|
||||
|
||||
/obj/structure/closet/excavation
|
||||
name = "Excavation tools"
|
||||
closet_appearance = /decl/closet_appearance/secure_closet/engineering/tools/xenoarch
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/storage/belt/archaeology,
|
||||
/obj/item/weapon/storage/excavation,
|
||||
/obj/item/device/flashlight/lantern,
|
||||
/obj/item/device/ano_scanner,
|
||||
/obj/item/device/depth_scanner,
|
||||
/obj/item/device/core_sampler,
|
||||
/obj/item/device/gps,
|
||||
/obj/item/device/beacon_locator,
|
||||
/obj/item/device/radio/beacon,
|
||||
/obj/item/clothing/glasses/meson,
|
||||
/obj/item/weapon/pickaxe,
|
||||
/obj/item/device/measuring_tape,
|
||||
/obj/item/weapon/pickaxe/hand,
|
||||
/obj/item/weapon/storage/bag/fossils,
|
||||
/obj/item/weapon/hand_labeler)
|
||||
|
||||
@@ -1,158 +1,158 @@
|
||||
/obj/structure/closet/secure_closet
|
||||
name = "secure locker"
|
||||
desc = "It's an immobile card-locked storage unit."
|
||||
icon = 'icons/obj/closet.dmi'
|
||||
icon_state = "secure1"
|
||||
density = TRUE
|
||||
opened = 0
|
||||
var/locked = 1
|
||||
var/broken = 0
|
||||
var/large = 1
|
||||
wall_mounted = 0 //never solid (You can always pass over it)
|
||||
health = 200
|
||||
|
||||
closet_appearance = /decl/closet_appearance/secure_closet
|
||||
|
||||
/obj/structure/closet/secure_closet/can_open()
|
||||
if(locked)
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
/obj/structure/closet/secure_closet/emp_act(severity)
|
||||
for(var/obj/O in src)
|
||||
O.emp_act(severity)
|
||||
if(!broken)
|
||||
if(prob(50/severity))
|
||||
locked = !locked
|
||||
update_icon()
|
||||
if(prob(20/severity) && !opened)
|
||||
if(!locked)
|
||||
open()
|
||||
else
|
||||
req_access = list()
|
||||
req_access += pick(get_all_station_access())
|
||||
..()
|
||||
|
||||
/obj/structure/closet/secure_closet/proc/togglelock(mob/user as mob)
|
||||
if(opened)
|
||||
to_chat(user, "<span class='notice'>Close the locker first.</span>")
|
||||
return
|
||||
if(broken)
|
||||
to_chat(user, "<span class='warning'>The locker appears to be broken.</span>")
|
||||
return
|
||||
if(user.loc == src)
|
||||
to_chat(user, "<span class='notice'>You can't reach the lock from inside.</span>")
|
||||
return
|
||||
if(allowed(user))
|
||||
locked = !locked
|
||||
playsound(src, 'sound/machines/click.ogg', 15, 1, -3)
|
||||
for(var/mob/O in viewers(user, 3))
|
||||
if((O.client && !( O.blinded )))
|
||||
to_chat(O, "<span class='notice'>The locker has been [locked ? null : "un"]locked by [user].</span>")
|
||||
update_icon()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Access Denied</span>")
|
||||
|
||||
/obj/structure/closet/secure_closet/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(W.has_tool_quality(TOOL_WRENCH))
|
||||
if(opened)
|
||||
if(anchored)
|
||||
user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.")
|
||||
else
|
||||
user.visible_message("\The [user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.")
|
||||
if(do_after(user, 20 * W.toolspeed))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You [anchored? "un" : ""]secured \the [src]!</span>")
|
||||
anchored = !anchored
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You can't reach the anchoring bolts when the door is closed!</span>")
|
||||
else if(opened)
|
||||
if(istype(W, /obj/item/weapon/storage/laundry_basket))
|
||||
return ..(W,user)
|
||||
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
|
||||
to_chat(user, "<span class='notice'>The locker is too small to stuff [G.affecting] into!</span>")
|
||||
if(isrobot(user))
|
||||
return
|
||||
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(istype(W, /obj/item/weapon/melee/energy/blade))
|
||||
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>"))
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
||||
spark_system.set_up(5, 0, loc)
|
||||
spark_system.start()
|
||||
playsound(src, 'sound/weapons/blade1.ogg', 50, 1)
|
||||
playsound(src, "sparks", 50, 1)
|
||||
else if(istype(W,/obj/item/weapon/packageWrap) || W.has_tool_quality(TOOL_WELDER))
|
||||
return ..(W,user)
|
||||
else
|
||||
togglelock(user)
|
||||
|
||||
/obj/structure/closet/secure_closet/emag_act(var/remaining_charges, var/mob/user, var/emag_source, var/visual_feedback = "", var/audible_feedback = "")
|
||||
if(!broken)
|
||||
broken = 1
|
||||
locked = 0
|
||||
desc = "It appears to be broken."
|
||||
|
||||
if(visual_feedback)
|
||||
visible_message(visual_feedback, audible_feedback)
|
||||
else if(user && emag_source)
|
||||
visible_message("<span class='warning'>\The [src] has been broken by \the [user] with \an [emag_source]!</span>", "You hear a faint electrical spark.")
|
||||
else
|
||||
visible_message("<span class='warning'>\The [src] sparks and breaks open!</span>", "You hear a faint electrical spark.")
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
/obj/structure/closet/secure_closet/attack_hand(mob/user as mob)
|
||||
add_fingerprint(user)
|
||||
if(locked)
|
||||
togglelock(user)
|
||||
else
|
||||
toggle(user)
|
||||
|
||||
/obj/structure/closet/secure_closet/AltClick()
|
||||
..()
|
||||
verb_togglelock()
|
||||
|
||||
/obj/structure/closet/secure_closet/verb/verb_togglelock()
|
||||
set src in oview(1) // One square distance
|
||||
set category = "Object"
|
||||
set name = "Toggle Lock"
|
||||
|
||||
if(!usr.canmove || usr.stat || usr.restrained() || !Adjacent(usr)) // Don't use it if you're not able to! Checks for stuns, ghost and restrain
|
||||
return
|
||||
|
||||
if(ishuman(usr) || isrobot(usr))
|
||||
add_fingerprint(usr)
|
||||
togglelock(usr)
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>This mob type can't use this verb.</span>")
|
||||
|
||||
/obj/structure/closet/secure_closet/update_icon()
|
||||
if(opened)
|
||||
icon_state = "open"
|
||||
else
|
||||
if(broken)
|
||||
icon_state = "closed_emagged[sealed ? "_welded" : ""]"
|
||||
else
|
||||
if(locked)
|
||||
icon_state = "closed_locked[sealed ? "_welded" : ""]"
|
||||
else
|
||||
icon_state = "closed_unlocked[sealed ? "_welded" : ""]"
|
||||
|
||||
/obj/structure/closet/secure_closet/req_breakout()
|
||||
if(!opened && locked) return 1
|
||||
return ..() //It's a secure closet, but isn't locked.
|
||||
|
||||
/obj/structure/closet/secure_closet/break_open()
|
||||
desc += " It appears to be broken."
|
||||
broken = 1
|
||||
locked = 0
|
||||
..()
|
||||
/obj/structure/closet/secure_closet
|
||||
name = "secure locker"
|
||||
desc = "It's an immobile card-locked storage unit."
|
||||
icon = 'icons/obj/closet.dmi'
|
||||
icon_state = "secure1"
|
||||
density = TRUE
|
||||
opened = 0
|
||||
var/locked = 1
|
||||
var/broken = 0
|
||||
var/large = 1
|
||||
wall_mounted = 0 //never solid (You can always pass over it)
|
||||
health = 200
|
||||
|
||||
closet_appearance = /decl/closet_appearance/secure_closet
|
||||
|
||||
/obj/structure/closet/secure_closet/can_open()
|
||||
if(locked)
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
/obj/structure/closet/secure_closet/emp_act(severity)
|
||||
for(var/obj/O in src)
|
||||
O.emp_act(severity)
|
||||
if(!broken)
|
||||
if(prob(50/severity))
|
||||
locked = !locked
|
||||
update_icon()
|
||||
if(prob(20/severity) && !opened)
|
||||
if(!locked)
|
||||
open()
|
||||
else
|
||||
req_access = list()
|
||||
req_access += pick(get_all_station_access())
|
||||
..()
|
||||
|
||||
/obj/structure/closet/secure_closet/proc/togglelock(mob/user as mob)
|
||||
if(opened)
|
||||
to_chat(user, "<span class='notice'>Close the locker first.</span>")
|
||||
return
|
||||
if(broken)
|
||||
to_chat(user, "<span class='warning'>The locker appears to be broken.</span>")
|
||||
return
|
||||
if(user.loc == src)
|
||||
to_chat(user, "<span class='notice'>You can't reach the lock from inside.</span>")
|
||||
return
|
||||
if(allowed(user))
|
||||
locked = !locked
|
||||
playsound(src, 'sound/machines/click.ogg', 15, 1, -3)
|
||||
for(var/mob/O in viewers(user, 3))
|
||||
if((O.client && !( O.blinded )))
|
||||
to_chat(O, "<span class='notice'>The locker has been [locked ? null : "un"]locked by [user].</span>")
|
||||
update_icon()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Access Denied</span>")
|
||||
|
||||
/obj/structure/closet/secure_closet/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(W.has_tool_quality(TOOL_WRENCH))
|
||||
if(opened)
|
||||
if(anchored)
|
||||
user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.")
|
||||
else
|
||||
user.visible_message("\The [user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.")
|
||||
if(do_after(user, 20 * W.toolspeed))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You [anchored? "un" : ""]secured \the [src]!</span>")
|
||||
anchored = !anchored
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You can't reach the anchoring bolts when the door is closed!</span>")
|
||||
else if(opened)
|
||||
if(istype(W, /obj/item/weapon/storage/laundry_basket))
|
||||
return ..(W,user)
|
||||
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
|
||||
to_chat(user, "<span class='notice'>The locker is too small to stuff [G.affecting] into!</span>")
|
||||
if(isrobot(user))
|
||||
return
|
||||
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(istype(W, /obj/item/weapon/melee/energy/blade))
|
||||
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>"))
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
||||
spark_system.set_up(5, 0, loc)
|
||||
spark_system.start()
|
||||
playsound(src, 'sound/weapons/blade1.ogg', 50, 1)
|
||||
playsound(src, "sparks", 50, 1)
|
||||
else if(istype(W,/obj/item/weapon/packageWrap) || W.has_tool_quality(TOOL_WELDER))
|
||||
return ..(W,user)
|
||||
else
|
||||
togglelock(user)
|
||||
|
||||
/obj/structure/closet/secure_closet/emag_act(var/remaining_charges, var/mob/user, var/emag_source, var/visual_feedback = "", var/audible_feedback = "")
|
||||
if(!broken)
|
||||
broken = 1
|
||||
locked = 0
|
||||
desc = "It appears to be broken."
|
||||
|
||||
if(visual_feedback)
|
||||
visible_message(visual_feedback, audible_feedback)
|
||||
else if(user && emag_source)
|
||||
visible_message("<span class='warning'>\The [src] has been broken by \the [user] with \an [emag_source]!</span>", "You hear a faint electrical spark.")
|
||||
else
|
||||
visible_message("<span class='warning'>\The [src] sparks and breaks open!</span>", "You hear a faint electrical spark.")
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
/obj/structure/closet/secure_closet/attack_hand(mob/user as mob)
|
||||
add_fingerprint(user)
|
||||
if(locked)
|
||||
togglelock(user)
|
||||
else
|
||||
toggle(user)
|
||||
|
||||
/obj/structure/closet/secure_closet/AltClick()
|
||||
..()
|
||||
verb_togglelock()
|
||||
|
||||
/obj/structure/closet/secure_closet/verb/verb_togglelock()
|
||||
set src in oview(1) // One square distance
|
||||
set category = "Object"
|
||||
set name = "Toggle Lock"
|
||||
|
||||
if(!usr.canmove || usr.stat || usr.restrained() || !Adjacent(usr)) // Don't use it if you're not able to! Checks for stuns, ghost and restrain
|
||||
return
|
||||
|
||||
if(ishuman(usr) || isrobot(usr))
|
||||
add_fingerprint(usr)
|
||||
togglelock(usr)
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>This mob type can't use this verb.</span>")
|
||||
|
||||
/obj/structure/closet/secure_closet/update_icon()
|
||||
if(opened)
|
||||
icon_state = "open"
|
||||
else
|
||||
if(broken)
|
||||
icon_state = "closed_emagged[sealed ? "_welded" : ""]"
|
||||
else
|
||||
if(locked)
|
||||
icon_state = "closed_locked[sealed ? "_welded" : ""]"
|
||||
else
|
||||
icon_state = "closed_unlocked[sealed ? "_welded" : ""]"
|
||||
|
||||
/obj/structure/closet/secure_closet/req_breakout()
|
||||
if(!opened && locked) return 1
|
||||
return ..() //It's a secure closet, but isn't locked.
|
||||
|
||||
/obj/structure/closet/secure_closet/break_open()
|
||||
desc += " It appears to be broken."
|
||||
broken = 1
|
||||
locked = 0
|
||||
..()
|
||||
|
||||
@@ -1,132 +1,132 @@
|
||||
/obj/structure/closet/statue
|
||||
name = "statue"
|
||||
desc = "An incredibly lifelike marble carving"
|
||||
icon = 'icons/obj/statue.dmi'
|
||||
icon_state = "human_male"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
health = 0 //destroying the statue kills the mob within
|
||||
blocks_emissive = EMISSIVE_BLOCK_UNIQUE
|
||||
var/intialTox = 0 //these are here to keep the mob from taking damage from things that logically wouldn't affect a rock
|
||||
var/intialFire = 0 //it's a little sloppy I know but it was this or the GODMODE flag. Lesser of two evils.
|
||||
var/intialBrute = 0
|
||||
var/intialOxy = 0
|
||||
var/timer = 240 //eventually the person will be freed
|
||||
|
||||
/obj/structure/closet/statue/New(loc, var/mob/living/L)
|
||||
if(L && (ishuman(L) || L.isMonkey() || iscorgi(L)))
|
||||
if(L.buckled)
|
||||
L.buckled = 0
|
||||
L.anchored = FALSE
|
||||
if(L.client)
|
||||
L.client.perspective = EYE_PERSPECTIVE
|
||||
L.client.eye = src
|
||||
L.loc = src
|
||||
L.sdisabilities |= MUTE
|
||||
health = L.health + 100 //stoning damaged mobs will result in easier to shatter statues
|
||||
intialTox = L.getToxLoss()
|
||||
intialFire = L.getFireLoss()
|
||||
intialBrute = L.getBruteLoss()
|
||||
intialOxy = L.getOxyLoss()
|
||||
if(ishuman(L))
|
||||
name = "statue of [L.name]"
|
||||
if(L.gender == "female")
|
||||
icon_state = "human_female"
|
||||
else if(L.isMonkey())
|
||||
name = "statue of a monkey"
|
||||
icon_state = "monkey"
|
||||
else if(iscorgi(L))
|
||||
name = "statue of a corgi"
|
||||
icon_state = "corgi"
|
||||
desc = "If it takes forever, I will wait for you..."
|
||||
|
||||
if(health == 0) //meaning if the statue didn't find a valid target
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
START_PROCESSING(SSobj, src)
|
||||
..()
|
||||
|
||||
/obj/structure/closet/statue/process()
|
||||
timer--
|
||||
for(var/mob/living/M in src) //Go-go gadget stasis field
|
||||
M.setToxLoss(intialTox)
|
||||
M.adjustFireLoss(intialFire - M.getFireLoss())
|
||||
M.adjustBruteLoss(intialBrute - M.getBruteLoss())
|
||||
M.setOxyLoss(intialOxy)
|
||||
if (timer <= 0)
|
||||
dump_contents()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/closet/statue/dump_contents()
|
||||
|
||||
for(var/obj/O in src)
|
||||
O.loc = src.loc
|
||||
|
||||
for(var/mob/living/M in src)
|
||||
M.loc = src.loc
|
||||
M.sdisabilities &= ~MUTE
|
||||
M.take_overall_damage((M.health - health - 100),0) //any new damage the statue incurred is transfered to the mob
|
||||
if(M.client)
|
||||
M.client.eye = M.client.mob
|
||||
M.client.perspective = MOB_PERSPECTIVE
|
||||
|
||||
/obj/structure/closet/statue/open()
|
||||
return
|
||||
|
||||
/obj/structure/closet/statue/close()
|
||||
return
|
||||
|
||||
/obj/structure/closet/statue/toggle()
|
||||
return
|
||||
|
||||
/obj/structure/closet/statue/proc/check_health()
|
||||
if(health <= 0)
|
||||
for(var/mob/M in src)
|
||||
shatter(M)
|
||||
|
||||
/obj/structure/closet/statue/bullet_act(var/obj/item/projectile/Proj)
|
||||
health -= Proj.get_structure_damage()
|
||||
check_health()
|
||||
|
||||
return
|
||||
|
||||
/obj/structure/closet/statue/attack_generic(var/mob/user, damage, attacktext, environment_smash)
|
||||
if(damage && environment_smash)
|
||||
for(var/mob/M in src)
|
||||
shatter(M)
|
||||
|
||||
/obj/structure/closet/statue/ex_act(severity)
|
||||
for(var/mob/M in src)
|
||||
M.ex_act(severity)
|
||||
health -= 60 / severity
|
||||
check_health()
|
||||
|
||||
/obj/structure/closet/statue/attackby(obj/item/I as obj, mob/user as mob)
|
||||
health -= I.force
|
||||
user.do_attack_animation(src)
|
||||
visible_message("<span class='danger'>[user] strikes [src] with [I].</span>")
|
||||
check_health()
|
||||
|
||||
/obj/structure/closet/statue/MouseDrop_T()
|
||||
return
|
||||
|
||||
/obj/structure/closet/statue/relaymove()
|
||||
return
|
||||
|
||||
/obj/structure/closet/statue/attack_hand()
|
||||
return
|
||||
|
||||
/obj/structure/closet/statue/verb_toggleopen()
|
||||
return
|
||||
|
||||
/obj/structure/closet/statue/update_icon()
|
||||
return
|
||||
|
||||
/obj/structure/closet/statue/proc/shatter(mob/user as mob)
|
||||
if (user)
|
||||
user.dust()
|
||||
dump_contents()
|
||||
visible_message("<span class='warning'>[src] shatters!.</span>")
|
||||
qdel(src)
|
||||
/obj/structure/closet/statue
|
||||
name = "statue"
|
||||
desc = "An incredibly lifelike marble carving"
|
||||
icon = 'icons/obj/statue.dmi'
|
||||
icon_state = "human_male"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
health = 0 //destroying the statue kills the mob within
|
||||
blocks_emissive = EMISSIVE_BLOCK_UNIQUE
|
||||
var/intialTox = 0 //these are here to keep the mob from taking damage from things that logically wouldn't affect a rock
|
||||
var/intialFire = 0 //it's a little sloppy I know but it was this or the GODMODE flag. Lesser of two evils.
|
||||
var/intialBrute = 0
|
||||
var/intialOxy = 0
|
||||
var/timer = 240 //eventually the person will be freed
|
||||
|
||||
/obj/structure/closet/statue/New(loc, var/mob/living/L)
|
||||
if(L && (ishuman(L) || L.isMonkey() || iscorgi(L)))
|
||||
if(L.buckled)
|
||||
L.buckled = 0
|
||||
L.anchored = FALSE
|
||||
if(L.client)
|
||||
L.client.perspective = EYE_PERSPECTIVE
|
||||
L.client.eye = src
|
||||
L.loc = src
|
||||
L.sdisabilities |= MUTE
|
||||
health = L.health + 100 //stoning damaged mobs will result in easier to shatter statues
|
||||
intialTox = L.getToxLoss()
|
||||
intialFire = L.getFireLoss()
|
||||
intialBrute = L.getBruteLoss()
|
||||
intialOxy = L.getOxyLoss()
|
||||
if(ishuman(L))
|
||||
name = "statue of [L.name]"
|
||||
if(L.gender == "female")
|
||||
icon_state = "human_female"
|
||||
else if(L.isMonkey())
|
||||
name = "statue of a monkey"
|
||||
icon_state = "monkey"
|
||||
else if(iscorgi(L))
|
||||
name = "statue of a corgi"
|
||||
icon_state = "corgi"
|
||||
desc = "If it takes forever, I will wait for you..."
|
||||
|
||||
if(health == 0) //meaning if the statue didn't find a valid target
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
START_PROCESSING(SSobj, src)
|
||||
..()
|
||||
|
||||
/obj/structure/closet/statue/process()
|
||||
timer--
|
||||
for(var/mob/living/M in src) //Go-go gadget stasis field
|
||||
M.setToxLoss(intialTox)
|
||||
M.adjustFireLoss(intialFire - M.getFireLoss())
|
||||
M.adjustBruteLoss(intialBrute - M.getBruteLoss())
|
||||
M.setOxyLoss(intialOxy)
|
||||
if (timer <= 0)
|
||||
dump_contents()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/closet/statue/dump_contents()
|
||||
|
||||
for(var/obj/O in src)
|
||||
O.loc = src.loc
|
||||
|
||||
for(var/mob/living/M in src)
|
||||
M.loc = src.loc
|
||||
M.sdisabilities &= ~MUTE
|
||||
M.take_overall_damage((M.health - health - 100),0) //any new damage the statue incurred is transfered to the mob
|
||||
if(M.client)
|
||||
M.client.eye = M.client.mob
|
||||
M.client.perspective = MOB_PERSPECTIVE
|
||||
|
||||
/obj/structure/closet/statue/open()
|
||||
return
|
||||
|
||||
/obj/structure/closet/statue/close()
|
||||
return
|
||||
|
||||
/obj/structure/closet/statue/toggle()
|
||||
return
|
||||
|
||||
/obj/structure/closet/statue/proc/check_health()
|
||||
if(health <= 0)
|
||||
for(var/mob/M in src)
|
||||
shatter(M)
|
||||
|
||||
/obj/structure/closet/statue/bullet_act(var/obj/item/projectile/Proj)
|
||||
health -= Proj.get_structure_damage()
|
||||
check_health()
|
||||
|
||||
return
|
||||
|
||||
/obj/structure/closet/statue/attack_generic(var/mob/user, damage, attacktext, environment_smash)
|
||||
if(damage && environment_smash)
|
||||
for(var/mob/M in src)
|
||||
shatter(M)
|
||||
|
||||
/obj/structure/closet/statue/ex_act(severity)
|
||||
for(var/mob/M in src)
|
||||
M.ex_act(severity)
|
||||
health -= 60 / severity
|
||||
check_health()
|
||||
|
||||
/obj/structure/closet/statue/attackby(obj/item/I as obj, mob/user as mob)
|
||||
health -= I.force
|
||||
user.do_attack_animation(src)
|
||||
visible_message("<span class='danger'>[user] strikes [src] with [I].</span>")
|
||||
check_health()
|
||||
|
||||
/obj/structure/closet/statue/MouseDrop_T()
|
||||
return
|
||||
|
||||
/obj/structure/closet/statue/relaymove()
|
||||
return
|
||||
|
||||
/obj/structure/closet/statue/attack_hand()
|
||||
return
|
||||
|
||||
/obj/structure/closet/statue/verb_toggleopen()
|
||||
return
|
||||
|
||||
/obj/structure/closet/statue/update_icon()
|
||||
return
|
||||
|
||||
/obj/structure/closet/statue/proc/shatter(mob/user as mob)
|
||||
if (user)
|
||||
user.dust()
|
||||
dump_contents()
|
||||
visible_message("<span class='warning'>[src] shatters!.</span>")
|
||||
qdel(src)
|
||||
|
||||
@@ -1,121 +1,121 @@
|
||||
/obj/structure/closet/syndicate
|
||||
name = "armory closet"
|
||||
desc = "Why is this here?"
|
||||
closet_appearance = /decl/closet_appearance/tactical/alt
|
||||
|
||||
/obj/structure/closet/syndicate/personal
|
||||
desc = "It's a storage unit for operative gear."
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/tank/jetpack/oxygen,
|
||||
/obj/item/clothing/mask/gas/syndicate,
|
||||
/obj/item/clothing/under/syndicate,
|
||||
/obj/item/clothing/head/helmet/space/void/merc,
|
||||
/obj/item/clothing/suit/space/void/merc,
|
||||
/obj/item/weapon/tool/crowbar/red,
|
||||
/obj/item/weapon/cell/high,
|
||||
/obj/item/weapon/card/id/syndicate,
|
||||
/obj/item/device/multitool,
|
||||
/obj/item/weapon/shield/energy,
|
||||
/obj/item/clothing/shoes/magboots)
|
||||
|
||||
|
||||
/obj/structure/closet/syndicate/suit
|
||||
desc = "It's a storage unit for voidsuits."
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/tank/jetpack/oxygen,
|
||||
/obj/item/clothing/shoes/magboots,
|
||||
/obj/item/clothing/suit/space/void/merc,
|
||||
/obj/item/clothing/mask/gas/syndicate,
|
||||
/obj/item/clothing/head/helmet/space/void/merc)
|
||||
|
||||
|
||||
/obj/structure/closet/syndicate/nuclear
|
||||
desc = "It's a storage unit for nuclear-operative gear."
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/ammo_magazine/m10mm = 5,
|
||||
/obj/item/weapon/storage/box/handcuffs,
|
||||
/obj/item/weapon/storage/box/flashbangs,
|
||||
/obj/item/weapon/gun/energy/gun = 5,
|
||||
/obj/item/weapon/pinpointer/nukeop = 5,
|
||||
/obj/item/device/pda/syndicate,
|
||||
/obj/item/device/radio/uplink)
|
||||
|
||||
/obj/structure/closet/syndicate/resources
|
||||
desc = "An old, dusty locker."
|
||||
|
||||
/obj/structure/closet/syndicate/resources/Initialize()
|
||||
. = ..()
|
||||
if(!contents.len)
|
||||
var/common_min = 30 //Minimum amount of minerals in the stack for common minerals
|
||||
var/common_max = 50 //Maximum amount of HONK in the stack for HONK common minerals
|
||||
var/rare_min = 5 //Minimum HONK of HONK in the stack HONK HONK rare minerals
|
||||
var/rare_max = 20 //Maximum HONK HONK HONK in the HONK for HONK rare HONK
|
||||
|
||||
var/pickednum = rand(1, 50)
|
||||
|
||||
//Sad trombone
|
||||
if(pickednum == 1)
|
||||
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src)
|
||||
P.name = "IOU"
|
||||
P.info = "Sorry man, we needed the money so we sold your stash. It's ok, we'll double our money for sure this time!"
|
||||
|
||||
//Metal (common ore)
|
||||
if(pickednum >= 2)
|
||||
new /obj/item/stack/material/steel(src, rand(common_min, common_max))
|
||||
|
||||
//Glass (common ore)
|
||||
if(pickednum >= 5)
|
||||
new /obj/item/stack/material/glass(src, rand(common_min, common_max))
|
||||
|
||||
//Plasteel (common ore) Because it has a million more uses then phoron
|
||||
if(pickednum >= 10)
|
||||
new /obj/item/stack/material/plasteel(src, rand(common_min, common_max))
|
||||
|
||||
//Phoron (rare ore)
|
||||
if(pickednum >= 15)
|
||||
new /obj/item/stack/material/phoron(src, rand(rare_min, rare_max))
|
||||
|
||||
//Silver (rare ore)
|
||||
if(pickednum >= 20)
|
||||
new /obj/item/stack/material/silver(src, rand(rare_min, rare_max))
|
||||
|
||||
//Gold (rare ore)
|
||||
if(pickednum >= 30)
|
||||
new /obj/item/stack/material/gold(src, rand(rare_min, rare_max))
|
||||
|
||||
//Uranium (rare ore)
|
||||
if(pickednum >= 40)
|
||||
new /obj/item/stack/material/uranium(src, rand(rare_min, rare_max))
|
||||
|
||||
//Diamond (rare HONK)
|
||||
if(pickednum >= 45)
|
||||
new /obj/item/stack/material/diamond(src, rand(rare_min, rare_max))
|
||||
|
||||
//Jetpack (You hit the jackpot!)
|
||||
if(pickednum == 50)
|
||||
new /obj/item/weapon/tank/jetpack/carbondioxide(src)
|
||||
|
||||
/obj/structure/closet/syndicate/resources/everything
|
||||
desc = "It's an emergency storage closet for repairs."
|
||||
|
||||
/obj/structure/closet/syndicate/resources/everything/Initialize()
|
||||
var/list/resources = list(
|
||||
/obj/item/stack/material/steel,
|
||||
/obj/item/stack/material/glass,
|
||||
/obj/item/stack/material/gold,
|
||||
/obj/item/stack/material/silver,
|
||||
/obj/item/stack/material/phoron,
|
||||
/obj/item/stack/material/uranium,
|
||||
/obj/item/stack/material/diamond,
|
||||
/obj/item/stack/material/plasteel,
|
||||
/obj/item/stack/rods
|
||||
)
|
||||
|
||||
for(var/i = 0, i<2, i++)
|
||||
for(var/res in resources)
|
||||
new res(src, -1)
|
||||
|
||||
return ..()
|
||||
/obj/structure/closet/syndicate
|
||||
name = "armory closet"
|
||||
desc = "Why is this here?"
|
||||
closet_appearance = /decl/closet_appearance/tactical/alt
|
||||
|
||||
/obj/structure/closet/syndicate/personal
|
||||
desc = "It's a storage unit for operative gear."
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/tank/jetpack/oxygen,
|
||||
/obj/item/clothing/mask/gas/syndicate,
|
||||
/obj/item/clothing/under/syndicate,
|
||||
/obj/item/clothing/head/helmet/space/void/merc,
|
||||
/obj/item/clothing/suit/space/void/merc,
|
||||
/obj/item/weapon/tool/crowbar/red,
|
||||
/obj/item/weapon/cell/high,
|
||||
/obj/item/weapon/card/id/syndicate,
|
||||
/obj/item/device/multitool,
|
||||
/obj/item/weapon/shield/energy,
|
||||
/obj/item/clothing/shoes/magboots)
|
||||
|
||||
|
||||
/obj/structure/closet/syndicate/suit
|
||||
desc = "It's a storage unit for voidsuits."
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/tank/jetpack/oxygen,
|
||||
/obj/item/clothing/shoes/magboots,
|
||||
/obj/item/clothing/suit/space/void/merc,
|
||||
/obj/item/clothing/mask/gas/syndicate,
|
||||
/obj/item/clothing/head/helmet/space/void/merc)
|
||||
|
||||
|
||||
/obj/structure/closet/syndicate/nuclear
|
||||
desc = "It's a storage unit for nuclear-operative gear."
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/ammo_magazine/m10mm = 5,
|
||||
/obj/item/weapon/storage/box/handcuffs,
|
||||
/obj/item/weapon/storage/box/flashbangs,
|
||||
/obj/item/weapon/gun/energy/gun = 5,
|
||||
/obj/item/weapon/pinpointer/nukeop = 5,
|
||||
/obj/item/device/pda/syndicate,
|
||||
/obj/item/device/radio/uplink)
|
||||
|
||||
/obj/structure/closet/syndicate/resources
|
||||
desc = "An old, dusty locker."
|
||||
|
||||
/obj/structure/closet/syndicate/resources/Initialize()
|
||||
. = ..()
|
||||
if(!contents.len)
|
||||
var/common_min = 30 //Minimum amount of minerals in the stack for common minerals
|
||||
var/common_max = 50 //Maximum amount of HONK in the stack for HONK common minerals
|
||||
var/rare_min = 5 //Minimum HONK of HONK in the stack HONK HONK rare minerals
|
||||
var/rare_max = 20 //Maximum HONK HONK HONK in the HONK for HONK rare HONK
|
||||
|
||||
var/pickednum = rand(1, 50)
|
||||
|
||||
//Sad trombone
|
||||
if(pickednum == 1)
|
||||
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src)
|
||||
P.name = "IOU"
|
||||
P.info = "Sorry man, we needed the money so we sold your stash. It's ok, we'll double our money for sure this time!"
|
||||
|
||||
//Metal (common ore)
|
||||
if(pickednum >= 2)
|
||||
new /obj/item/stack/material/steel(src, rand(common_min, common_max))
|
||||
|
||||
//Glass (common ore)
|
||||
if(pickednum >= 5)
|
||||
new /obj/item/stack/material/glass(src, rand(common_min, common_max))
|
||||
|
||||
//Plasteel (common ore) Because it has a million more uses then phoron
|
||||
if(pickednum >= 10)
|
||||
new /obj/item/stack/material/plasteel(src, rand(common_min, common_max))
|
||||
|
||||
//Phoron (rare ore)
|
||||
if(pickednum >= 15)
|
||||
new /obj/item/stack/material/phoron(src, rand(rare_min, rare_max))
|
||||
|
||||
//Silver (rare ore)
|
||||
if(pickednum >= 20)
|
||||
new /obj/item/stack/material/silver(src, rand(rare_min, rare_max))
|
||||
|
||||
//Gold (rare ore)
|
||||
if(pickednum >= 30)
|
||||
new /obj/item/stack/material/gold(src, rand(rare_min, rare_max))
|
||||
|
||||
//Uranium (rare ore)
|
||||
if(pickednum >= 40)
|
||||
new /obj/item/stack/material/uranium(src, rand(rare_min, rare_max))
|
||||
|
||||
//Diamond (rare HONK)
|
||||
if(pickednum >= 45)
|
||||
new /obj/item/stack/material/diamond(src, rand(rare_min, rare_max))
|
||||
|
||||
//Jetpack (You hit the jackpot!)
|
||||
if(pickednum == 50)
|
||||
new /obj/item/weapon/tank/jetpack/carbondioxide(src)
|
||||
|
||||
/obj/structure/closet/syndicate/resources/everything
|
||||
desc = "It's an emergency storage closet for repairs."
|
||||
|
||||
/obj/structure/closet/syndicate/resources/everything/Initialize()
|
||||
var/list/resources = list(
|
||||
/obj/item/stack/material/steel,
|
||||
/obj/item/stack/material/glass,
|
||||
/obj/item/stack/material/gold,
|
||||
/obj/item/stack/material/silver,
|
||||
/obj/item/stack/material/phoron,
|
||||
/obj/item/stack/material/uranium,
|
||||
/obj/item/stack/material/diamond,
|
||||
/obj/item/stack/material/plasteel,
|
||||
/obj/item/stack/rods
|
||||
)
|
||||
|
||||
for(var/i = 0, i<2, i++)
|
||||
for(var/res in resources)
|
||||
new res(src, -1)
|
||||
|
||||
return ..()
|
||||
|
||||
@@ -1,229 +1,229 @@
|
||||
/* Utility Closets
|
||||
* Contains:
|
||||
* Emergency Closet
|
||||
* Fire Closet
|
||||
* Tool Closet
|
||||
* Radiation Closet
|
||||
* Bombsuit Closet
|
||||
* Hydrant
|
||||
* First Aid
|
||||
*/
|
||||
|
||||
/*
|
||||
* Emergency Closet
|
||||
*/
|
||||
/obj/structure/closet/emcloset
|
||||
name = "emergency closet"
|
||||
desc = "It's a storage unit for emergency breathmasks and O2 tanks."
|
||||
closet_appearance = /decl/closet_appearance/oxygen
|
||||
|
||||
/obj/structure/closet/emcloset/Initialize()
|
||||
switch (pickweight(list("small" = 55, "aid" = 25, "tank" = 10, "both" = 10)))
|
||||
//VOREStation Block Edit Start - Modified List
|
||||
if ("small")
|
||||
starts_with = list(
|
||||
/obj/item/weapon/tank/emergency/oxygen = 2,
|
||||
/obj/item/clothing/mask/breath = 2,
|
||||
/obj/item/clothing/suit/space/emergency = 2,
|
||||
/obj/item/clothing/head/helmet/space/emergency = 2)
|
||||
if ("aid")
|
||||
starts_with = list(
|
||||
/obj/item/weapon/tank/emergency/oxygen,
|
||||
/obj/item/weapon/storage/toolbox/emergency,
|
||||
/obj/item/clothing/mask/breath,
|
||||
/obj/item/clothing/suit/space/emergency,
|
||||
/obj/item/clothing/head/helmet/space/emergency)
|
||||
if ("tank")
|
||||
starts_with = list(
|
||||
/obj/item/weapon/tank/emergency/oxygen/engi = 2,
|
||||
/obj/item/clothing/mask/breath = 2,
|
||||
/obj/item/clothing/suit/space/emergency = 2,
|
||||
/obj/item/clothing/head/helmet/space/emergency = 2)
|
||||
if ("both")
|
||||
starts_with = list(
|
||||
/obj/item/weapon/storage/toolbox/emergency,
|
||||
/obj/item/weapon/storage/firstaid/o2,
|
||||
/obj/item/weapon/tank/emergency/oxygen/engi = 2,
|
||||
/obj/item/clothing/mask/breath = 2,
|
||||
/obj/item/clothing/suit/space/emergency = 2,
|
||||
/obj/item/clothing/head/helmet/space/emergency = 2)
|
||||
//VOREStation Block Edit End
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/structure/closet/emcloset/legacy
|
||||
starts_with = list(
|
||||
/obj/item/weapon/tank/oxygen,
|
||||
/obj/item/clothing/mask/gas)
|
||||
|
||||
/*
|
||||
* Fire Closet
|
||||
*/
|
||||
/obj/structure/closet/firecloset
|
||||
name = "fire-safety closet"
|
||||
desc = "It's a storage unit for fire-fighting supplies."
|
||||
closet_appearance = /decl/closet_appearance/oxygen/fire
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/fire,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/weapon/tank/oxygen/red,
|
||||
/obj/item/weapon/extinguisher,
|
||||
/obj/item/clothing/head/hardhat/red)
|
||||
|
||||
/obj/structure/closet/firecloset/full
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/fire,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/weapon/tank/oxygen/red,
|
||||
/obj/item/weapon/extinguisher,
|
||||
/obj/item/clothing/head/hardhat/red)
|
||||
|
||||
/obj/structure/closet/firecloset/full/double
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/fire = 2,
|
||||
/obj/item/clothing/mask/gas = 2,
|
||||
/obj/item/device/flashlight = 2,
|
||||
/obj/item/weapon/tank/oxygen/red = 2,
|
||||
/obj/item/weapon/extinguisher = 2,
|
||||
/obj/item/clothing/head/hardhat/red = 2)
|
||||
|
||||
/obj/structure/closet/firecloset/full/atmos
|
||||
name = "atmos fire-safety closet"
|
||||
desc = "It's a storage unit for atmospheric fire-fighting supplies."
|
||||
closet_appearance = /decl/closet_appearance/oxygen/fire/atmos
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/fire/heavy,
|
||||
/obj/item/weapon/tank/oxygen/red,
|
||||
/obj/item/weapon/extinguisher/atmo,
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/clothing/head/hardhat/firefighter/atmos)
|
||||
|
||||
/*
|
||||
* Tool Closet
|
||||
*/
|
||||
/obj/structure/closet/toolcloset
|
||||
name = "tool closet"
|
||||
desc = "It's a storage unit for tools."
|
||||
closet_appearance = /decl/closet_appearance/secure_closet/engineering/tools
|
||||
|
||||
/obj/structure/closet/toolcloset/Initialize()
|
||||
starts_with = list()
|
||||
if(prob(40))
|
||||
starts_with += /obj/item/clothing/suit/storage/hazardvest
|
||||
if(prob(70))
|
||||
starts_with += /obj/item/device/flashlight
|
||||
if(prob(70))
|
||||
starts_with += /obj/item/weapon/tool/screwdriver
|
||||
if(prob(70))
|
||||
starts_with += /obj/item/weapon/tool/wrench
|
||||
if(prob(70))
|
||||
starts_with += /obj/item/weapon/weldingtool
|
||||
if(prob(70))
|
||||
starts_with += /obj/item/weapon/tool/crowbar
|
||||
if(prob(70))
|
||||
starts_with += /obj/item/weapon/tool/wirecutters
|
||||
if(prob(70))
|
||||
starts_with += /obj/item/device/t_scanner
|
||||
if(prob(20))
|
||||
starts_with += /obj/item/weapon/storage/belt/utility
|
||||
if(prob(30))
|
||||
starts_with += /obj/item/stack/cable_coil/random
|
||||
if(prob(30))
|
||||
starts_with += /obj/item/stack/cable_coil/random
|
||||
if(prob(30))
|
||||
starts_with += /obj/item/stack/cable_coil/random
|
||||
if(prob(20))
|
||||
starts_with += /obj/item/device/multitool
|
||||
if(prob(5))
|
||||
starts_with += /obj/item/clothing/gloves/yellow
|
||||
if(prob(40))
|
||||
starts_with += /obj/item/clothing/head/hardhat
|
||||
if(prob(30))
|
||||
starts_with += /obj/item/weapon/reagent_containers/spray/windowsealant //VOREStation Add
|
||||
return ..()
|
||||
|
||||
/*
|
||||
* Radiation Closet
|
||||
*/
|
||||
/obj/structure/closet/radiation
|
||||
name = "radiation suit closet"
|
||||
desc = "It's a storage unit for rad-protective suits."
|
||||
closet_appearance = /decl/closet_appearance/secure_closet/engineering/tools/radiation
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/radiation = 2,
|
||||
/obj/item/clothing/head/radiation = 2,
|
||||
/obj/item/device/geiger = 2)
|
||||
|
||||
/*
|
||||
* Bombsuit closet
|
||||
*/
|
||||
/obj/structure/closet/bombcloset
|
||||
name = "\improper EOD closet"
|
||||
desc = "It's a storage unit for explosion-protective suits."
|
||||
closet_appearance = /decl/closet_appearance/bomb
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bomb_suit,
|
||||
/obj/item/clothing/under/color/black,
|
||||
/obj/item/clothing/shoes/black,
|
||||
/obj/item/clothing/head/bomb_hood)
|
||||
|
||||
/obj/structure/closet/bombcloset/double
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bomb_suit = 2,
|
||||
/obj/item/clothing/under/color/black = 2,
|
||||
/obj/item/clothing/shoes/black = 2,
|
||||
/obj/item/clothing/head/bomb_hood = 2)
|
||||
|
||||
/obj/structure/closet/bombclosetsecurity
|
||||
name = "\improper EOD closet"
|
||||
desc = "It's a storage unit for explosion-protective suits."
|
||||
closet_appearance = /decl/closet_appearance/bomb/security
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bomb_suit/security,
|
||||
/obj/item/clothing/under/rank/security,
|
||||
/obj/item/clothing/shoes/brown,
|
||||
/obj/item/clothing/head/bomb_hood/security)
|
||||
|
||||
/*
|
||||
* Hydrant
|
||||
*/
|
||||
/obj/structure/closet/hydrant //wall mounted fire closet
|
||||
name = "fire-safety closet"
|
||||
desc = "It's a storage unit for fire-fighting supplies."
|
||||
icon = 'icons/obj/closets/bases/wall.dmi'
|
||||
closet_appearance = /decl/closet_appearance/wall/hydrant
|
||||
plane = TURF_PLANE
|
||||
layer = ABOVE_TURF_LAYER
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
wall_mounted = 1
|
||||
store_mobs = 0
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/fire/firefighter,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/weapon/tank/oxygen/red,
|
||||
/obj/item/weapon/extinguisher,
|
||||
/obj/item/clothing/head/hardhat/red)
|
||||
|
||||
/*
|
||||
* First Aid
|
||||
*/
|
||||
/obj/structure/closet/medical_wall //wall mounted medical closet
|
||||
name = "first-aid closet"
|
||||
desc = "It's wall-mounted storage unit for first aid supplies."
|
||||
icon = 'icons/obj/closets/bases/wall.dmi'
|
||||
closet_appearance = /decl/closet_appearance/wall/medical
|
||||
plane = TURF_PLANE
|
||||
layer = ABOVE_TURF_LAYER
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
wall_mounted = 1
|
||||
store_mobs = 0
|
||||
/* Utility Closets
|
||||
* Contains:
|
||||
* Emergency Closet
|
||||
* Fire Closet
|
||||
* Tool Closet
|
||||
* Radiation Closet
|
||||
* Bombsuit Closet
|
||||
* Hydrant
|
||||
* First Aid
|
||||
*/
|
||||
|
||||
/*
|
||||
* Emergency Closet
|
||||
*/
|
||||
/obj/structure/closet/emcloset
|
||||
name = "emergency closet"
|
||||
desc = "It's a storage unit for emergency breathmasks and O2 tanks."
|
||||
closet_appearance = /decl/closet_appearance/oxygen
|
||||
|
||||
/obj/structure/closet/emcloset/Initialize()
|
||||
switch (pickweight(list("small" = 55, "aid" = 25, "tank" = 10, "both" = 10)))
|
||||
//VOREStation Block Edit Start - Modified List
|
||||
if ("small")
|
||||
starts_with = list(
|
||||
/obj/item/weapon/tank/emergency/oxygen = 2,
|
||||
/obj/item/clothing/mask/breath = 2,
|
||||
/obj/item/clothing/suit/space/emergency = 2,
|
||||
/obj/item/clothing/head/helmet/space/emergency = 2)
|
||||
if ("aid")
|
||||
starts_with = list(
|
||||
/obj/item/weapon/tank/emergency/oxygen,
|
||||
/obj/item/weapon/storage/toolbox/emergency,
|
||||
/obj/item/clothing/mask/breath,
|
||||
/obj/item/clothing/suit/space/emergency,
|
||||
/obj/item/clothing/head/helmet/space/emergency)
|
||||
if ("tank")
|
||||
starts_with = list(
|
||||
/obj/item/weapon/tank/emergency/oxygen/engi = 2,
|
||||
/obj/item/clothing/mask/breath = 2,
|
||||
/obj/item/clothing/suit/space/emergency = 2,
|
||||
/obj/item/clothing/head/helmet/space/emergency = 2)
|
||||
if ("both")
|
||||
starts_with = list(
|
||||
/obj/item/weapon/storage/toolbox/emergency,
|
||||
/obj/item/weapon/storage/firstaid/o2,
|
||||
/obj/item/weapon/tank/emergency/oxygen/engi = 2,
|
||||
/obj/item/clothing/mask/breath = 2,
|
||||
/obj/item/clothing/suit/space/emergency = 2,
|
||||
/obj/item/clothing/head/helmet/space/emergency = 2)
|
||||
//VOREStation Block Edit End
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/structure/closet/emcloset/legacy
|
||||
starts_with = list(
|
||||
/obj/item/weapon/tank/oxygen,
|
||||
/obj/item/clothing/mask/gas)
|
||||
|
||||
/*
|
||||
* Fire Closet
|
||||
*/
|
||||
/obj/structure/closet/firecloset
|
||||
name = "fire-safety closet"
|
||||
desc = "It's a storage unit for fire-fighting supplies."
|
||||
closet_appearance = /decl/closet_appearance/oxygen/fire
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/fire,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/weapon/tank/oxygen/red,
|
||||
/obj/item/weapon/extinguisher,
|
||||
/obj/item/clothing/head/hardhat/red)
|
||||
|
||||
/obj/structure/closet/firecloset/full
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/fire,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/weapon/tank/oxygen/red,
|
||||
/obj/item/weapon/extinguisher,
|
||||
/obj/item/clothing/head/hardhat/red)
|
||||
|
||||
/obj/structure/closet/firecloset/full/double
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/fire = 2,
|
||||
/obj/item/clothing/mask/gas = 2,
|
||||
/obj/item/device/flashlight = 2,
|
||||
/obj/item/weapon/tank/oxygen/red = 2,
|
||||
/obj/item/weapon/extinguisher = 2,
|
||||
/obj/item/clothing/head/hardhat/red = 2)
|
||||
|
||||
/obj/structure/closet/firecloset/full/atmos
|
||||
name = "atmos fire-safety closet"
|
||||
desc = "It's a storage unit for atmospheric fire-fighting supplies."
|
||||
closet_appearance = /decl/closet_appearance/oxygen/fire/atmos
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/fire/heavy,
|
||||
/obj/item/weapon/tank/oxygen/red,
|
||||
/obj/item/weapon/extinguisher/atmo,
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/clothing/head/hardhat/firefighter/atmos)
|
||||
|
||||
/*
|
||||
* Tool Closet
|
||||
*/
|
||||
/obj/structure/closet/toolcloset
|
||||
name = "tool closet"
|
||||
desc = "It's a storage unit for tools."
|
||||
closet_appearance = /decl/closet_appearance/secure_closet/engineering/tools
|
||||
|
||||
/obj/structure/closet/toolcloset/Initialize()
|
||||
starts_with = list()
|
||||
if(prob(40))
|
||||
starts_with += /obj/item/clothing/suit/storage/hazardvest
|
||||
if(prob(70))
|
||||
starts_with += /obj/item/device/flashlight
|
||||
if(prob(70))
|
||||
starts_with += /obj/item/weapon/tool/screwdriver
|
||||
if(prob(70))
|
||||
starts_with += /obj/item/weapon/tool/wrench
|
||||
if(prob(70))
|
||||
starts_with += /obj/item/weapon/weldingtool
|
||||
if(prob(70))
|
||||
starts_with += /obj/item/weapon/tool/crowbar
|
||||
if(prob(70))
|
||||
starts_with += /obj/item/weapon/tool/wirecutters
|
||||
if(prob(70))
|
||||
starts_with += /obj/item/device/t_scanner
|
||||
if(prob(20))
|
||||
starts_with += /obj/item/weapon/storage/belt/utility
|
||||
if(prob(30))
|
||||
starts_with += /obj/item/stack/cable_coil/random
|
||||
if(prob(30))
|
||||
starts_with += /obj/item/stack/cable_coil/random
|
||||
if(prob(30))
|
||||
starts_with += /obj/item/stack/cable_coil/random
|
||||
if(prob(20))
|
||||
starts_with += /obj/item/device/multitool
|
||||
if(prob(5))
|
||||
starts_with += /obj/item/clothing/gloves/yellow
|
||||
if(prob(40))
|
||||
starts_with += /obj/item/clothing/head/hardhat
|
||||
if(prob(30))
|
||||
starts_with += /obj/item/weapon/reagent_containers/spray/windowsealant //VOREStation Add
|
||||
return ..()
|
||||
|
||||
/*
|
||||
* Radiation Closet
|
||||
*/
|
||||
/obj/structure/closet/radiation
|
||||
name = "radiation suit closet"
|
||||
desc = "It's a storage unit for rad-protective suits."
|
||||
closet_appearance = /decl/closet_appearance/secure_closet/engineering/tools/radiation
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/radiation = 2,
|
||||
/obj/item/clothing/head/radiation = 2,
|
||||
/obj/item/device/geiger = 2)
|
||||
|
||||
/*
|
||||
* Bombsuit closet
|
||||
*/
|
||||
/obj/structure/closet/bombcloset
|
||||
name = "\improper EOD closet"
|
||||
desc = "It's a storage unit for explosion-protective suits."
|
||||
closet_appearance = /decl/closet_appearance/bomb
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bomb_suit,
|
||||
/obj/item/clothing/under/color/black,
|
||||
/obj/item/clothing/shoes/black,
|
||||
/obj/item/clothing/head/bomb_hood)
|
||||
|
||||
/obj/structure/closet/bombcloset/double
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bomb_suit = 2,
|
||||
/obj/item/clothing/under/color/black = 2,
|
||||
/obj/item/clothing/shoes/black = 2,
|
||||
/obj/item/clothing/head/bomb_hood = 2)
|
||||
|
||||
/obj/structure/closet/bombclosetsecurity
|
||||
name = "\improper EOD closet"
|
||||
desc = "It's a storage unit for explosion-protective suits."
|
||||
closet_appearance = /decl/closet_appearance/bomb/security
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bomb_suit/security,
|
||||
/obj/item/clothing/under/rank/security,
|
||||
/obj/item/clothing/shoes/brown,
|
||||
/obj/item/clothing/head/bomb_hood/security)
|
||||
|
||||
/*
|
||||
* Hydrant
|
||||
*/
|
||||
/obj/structure/closet/hydrant //wall mounted fire closet
|
||||
name = "fire-safety closet"
|
||||
desc = "It's a storage unit for fire-fighting supplies."
|
||||
icon = 'icons/obj/closets/bases/wall.dmi'
|
||||
closet_appearance = /decl/closet_appearance/wall/hydrant
|
||||
plane = TURF_PLANE
|
||||
layer = ABOVE_TURF_LAYER
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
wall_mounted = 1
|
||||
store_mobs = 0
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/fire/firefighter,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/weapon/tank/oxygen/red,
|
||||
/obj/item/weapon/extinguisher,
|
||||
/obj/item/clothing/head/hardhat/red)
|
||||
|
||||
/*
|
||||
* First Aid
|
||||
*/
|
||||
/obj/structure/closet/medical_wall //wall mounted medical closet
|
||||
name = "first-aid closet"
|
||||
desc = "It's wall-mounted storage unit for first aid supplies."
|
||||
icon = 'icons/obj/closets/bases/wall.dmi'
|
||||
closet_appearance = /decl/closet_appearance/wall/medical
|
||||
plane = TURF_PLANE
|
||||
layer = ABOVE_TURF_LAYER
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
wall_mounted = 1
|
||||
store_mobs = 0
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/structure/closet/firecloset/Initialize()
|
||||
starts_with += /obj/item/weapon/storage/toolbox/emergency
|
||||
return ..()
|
||||
|
||||
/obj/structure/closet/hydrant/New()
|
||||
starts_with += /obj/item/weapon/storage/toolbox/emergency
|
||||
return ..()
|
||||
/obj/structure/closet/firecloset/Initialize()
|
||||
starts_with += /obj/item/weapon/storage/toolbox/emergency
|
||||
return ..()
|
||||
|
||||
/obj/structure/closet/hydrant/New()
|
||||
starts_with += /obj/item/weapon/storage/toolbox/emergency
|
||||
return ..()
|
||||
|
||||
@@ -1,132 +1,132 @@
|
||||
/obj/structure/largecrate
|
||||
name = "large crate"
|
||||
desc = "A hefty wooden crate."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "densecrate"
|
||||
density = TRUE
|
||||
var/list/starts_with
|
||||
|
||||
/obj/structure/largecrate/Initialize()
|
||||
. = ..()
|
||||
if(starts_with)
|
||||
create_objects_in_loc(src, starts_with)
|
||||
starts_with = null
|
||||
for(var/obj/I in src.loc)
|
||||
if(I.density || I.anchored || I == src || !I.simulated)
|
||||
continue
|
||||
I.forceMove(src)
|
||||
update_icon()
|
||||
|
||||
/obj/structure/largecrate/attack_hand(mob/user as mob)
|
||||
to_chat(user, "<span class='notice'>You need a crowbar to pry this open!</span>")
|
||||
return
|
||||
|
||||
/obj/structure/largecrate/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T)
|
||||
to_chat(user, "<span class='notice'>You can't open this here!</span>")
|
||||
if(W.has_tool_quality(TOOL_CROWBAR))
|
||||
new /obj/item/stack/material/wood(src)
|
||||
|
||||
for(var/atom/movable/AM in contents)
|
||||
if(AM.simulated)
|
||||
AM.forceMove(T)
|
||||
//VOREStation Add Start
|
||||
if(isanimal(AM))
|
||||
var/mob/living/simple_mob/AMBLINAL = AM
|
||||
if(!AMBLINAL.mind)
|
||||
AMBLINAL.ghostjoin = 1
|
||||
AMBLINAL.ghostjoin_icon()
|
||||
active_ghost_pods |= AMBLINAL
|
||||
//VOREStation Add End
|
||||
user.visible_message("<span class='notice'>[user] pries \the [src] open.</span>", \
|
||||
"<span class='notice'>You pry open \the [src].</span>", \
|
||||
"<span class='notice'>You hear splitting wood.</span>")
|
||||
qdel(src)
|
||||
else
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/structure/largecrate/mule
|
||||
name = "MULE crate"
|
||||
|
||||
/obj/structure/largecrate/hoverpod
|
||||
name = "\improper Hoverpod assembly crate"
|
||||
desc = "You aren't sure how this crate is so light, but the Wulf Aeronautics logo might be a hint."
|
||||
icon_state = "vehiclecrate"
|
||||
|
||||
/obj/structure/largecrate/hoverpod/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(W.has_tool_quality(TOOL_CROWBAR))
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME
|
||||
var/obj/mecha/working/hoverpod/H = new (loc)
|
||||
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp
|
||||
ME.attach(H)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tool/passenger
|
||||
ME.attach(H)
|
||||
..()
|
||||
|
||||
/obj/structure/largecrate/donksoftvendor
|
||||
name = "\improper Donk-Soft vendor crate"
|
||||
desc = "A hefty wooden crate displaying the logo of Donk-Soft. It's rather heavy."
|
||||
starts_with = list(/obj/machinery/vending/donksoft)
|
||||
|
||||
/obj/structure/largecrate/vehicle
|
||||
name = "vehicle crate"
|
||||
desc = "Wulf Aeronautics says it comes in a box for the consumer's sake... How is this so light?"
|
||||
icon_state = "vehiclecrate"
|
||||
|
||||
/obj/structure/largecrate/vehicle/Initialize()
|
||||
. = ..()
|
||||
for(var/obj/O in contents)
|
||||
O.update_icon()
|
||||
|
||||
/obj/structure/largecrate/vehicle/bike
|
||||
name = "spacebike crate"
|
||||
starts_with = list(/obj/structure/vehiclecage/spacebike)
|
||||
|
||||
/obj/structure/largecrate/vehicle/quadbike
|
||||
name = "\improper ATV crate"
|
||||
desc = "A hefty wooden crate proudly displaying the logo of Ward-Takahashi's automotive division."
|
||||
starts_with = list(/obj/structure/vehiclecage/quadbike)
|
||||
|
||||
/obj/structure/largecrate/vehicle/quadtrailer
|
||||
name = "\improper ATV trailer crate"
|
||||
desc = "A hefty wooden crate proudly displaying the logo of Ward-Takahashi's automotive division."
|
||||
starts_with = list(/obj/structure/vehiclecage/quadtrailer)
|
||||
|
||||
/obj/structure/largecrate/animal
|
||||
icon_state = "crittercrate"
|
||||
desc = "A hefty wooden crate with air holes. It is marked with the logo of NanoTrasen Pastures and the slogan, '90% less cloning defects* than competing brands**, or your money back***!'"
|
||||
|
||||
/obj/structure/largecrate/animal/mulebot
|
||||
name = "Mulebot crate"
|
||||
desc = "A hefty wooden crate labelled 'Proud Product of the Xion Manufacturing Group'"
|
||||
icon_state = "mulecrate"
|
||||
starts_with = list(/mob/living/bot/mulebot)
|
||||
|
||||
/obj/structure/largecrate/animal/corgi
|
||||
name = "corgi carrier"
|
||||
starts_with = list(/mob/living/simple_mob/animal/passive/dog/corgi)
|
||||
|
||||
/obj/structure/largecrate/animal/cow
|
||||
name = "cow crate"
|
||||
starts_with = list(/mob/living/simple_mob/animal/passive/cow)
|
||||
|
||||
/obj/structure/largecrate/animal/goat
|
||||
name = "goat crate"
|
||||
starts_with = list(/mob/living/simple_mob/animal/goat)
|
||||
|
||||
/obj/structure/largecrate/animal/cat
|
||||
name = "cat carrier"
|
||||
starts_with = list(/mob/living/simple_mob/animal/passive/cat)
|
||||
|
||||
/obj/structure/largecrate/animal/cat/bones
|
||||
starts_with = list(/mob/living/simple_mob/animal/passive/cat/bones)
|
||||
|
||||
/obj/structure/largecrate/animal/chick
|
||||
name = "chicken crate"
|
||||
starts_with = list(/mob/living/simple_mob/animal/passive/chick = 5)
|
||||
|
||||
/obj/structure/largecrate/animal/catslug
|
||||
name = "catslug carrier"
|
||||
starts_with = list(/mob/living/simple_mob/vore/alienanimals/catslug)
|
||||
/obj/structure/largecrate
|
||||
name = "large crate"
|
||||
desc = "A hefty wooden crate."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "densecrate"
|
||||
density = TRUE
|
||||
var/list/starts_with
|
||||
|
||||
/obj/structure/largecrate/Initialize()
|
||||
. = ..()
|
||||
if(starts_with)
|
||||
create_objects_in_loc(src, starts_with)
|
||||
starts_with = null
|
||||
for(var/obj/I in src.loc)
|
||||
if(I.density || I.anchored || I == src || !I.simulated)
|
||||
continue
|
||||
I.forceMove(src)
|
||||
update_icon()
|
||||
|
||||
/obj/structure/largecrate/attack_hand(mob/user as mob)
|
||||
to_chat(user, "<span class='notice'>You need a crowbar to pry this open!</span>")
|
||||
return
|
||||
|
||||
/obj/structure/largecrate/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T)
|
||||
to_chat(user, "<span class='notice'>You can't open this here!</span>")
|
||||
if(W.has_tool_quality(TOOL_CROWBAR))
|
||||
new /obj/item/stack/material/wood(src)
|
||||
|
||||
for(var/atom/movable/AM in contents)
|
||||
if(AM.simulated)
|
||||
AM.forceMove(T)
|
||||
//VOREStation Add Start
|
||||
if(isanimal(AM))
|
||||
var/mob/living/simple_mob/AMBLINAL = AM
|
||||
if(!AMBLINAL.mind)
|
||||
AMBLINAL.ghostjoin = 1
|
||||
AMBLINAL.ghostjoin_icon()
|
||||
active_ghost_pods |= AMBLINAL
|
||||
//VOREStation Add End
|
||||
user.visible_message("<span class='notice'>[user] pries \the [src] open.</span>", \
|
||||
"<span class='notice'>You pry open \the [src].</span>", \
|
||||
"<span class='notice'>You hear splitting wood.</span>")
|
||||
qdel(src)
|
||||
else
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/structure/largecrate/mule
|
||||
name = "MULE crate"
|
||||
|
||||
/obj/structure/largecrate/hoverpod
|
||||
name = "\improper Hoverpod assembly crate"
|
||||
desc = "You aren't sure how this crate is so light, but the Wulf Aeronautics logo might be a hint."
|
||||
icon_state = "vehiclecrate"
|
||||
|
||||
/obj/structure/largecrate/hoverpod/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(W.has_tool_quality(TOOL_CROWBAR))
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME
|
||||
var/obj/mecha/working/hoverpod/H = new (loc)
|
||||
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp
|
||||
ME.attach(H)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tool/passenger
|
||||
ME.attach(H)
|
||||
..()
|
||||
|
||||
/obj/structure/largecrate/donksoftvendor
|
||||
name = "\improper Donk-Soft vendor crate"
|
||||
desc = "A hefty wooden crate displaying the logo of Donk-Soft. It's rather heavy."
|
||||
starts_with = list(/obj/machinery/vending/donksoft)
|
||||
|
||||
/obj/structure/largecrate/vehicle
|
||||
name = "vehicle crate"
|
||||
desc = "Wulf Aeronautics says it comes in a box for the consumer's sake... How is this so light?"
|
||||
icon_state = "vehiclecrate"
|
||||
|
||||
/obj/structure/largecrate/vehicle/Initialize()
|
||||
. = ..()
|
||||
for(var/obj/O in contents)
|
||||
O.update_icon()
|
||||
|
||||
/obj/structure/largecrate/vehicle/bike
|
||||
name = "spacebike crate"
|
||||
starts_with = list(/obj/structure/vehiclecage/spacebike)
|
||||
|
||||
/obj/structure/largecrate/vehicle/quadbike
|
||||
name = "\improper ATV crate"
|
||||
desc = "A hefty wooden crate proudly displaying the logo of Ward-Takahashi's automotive division."
|
||||
starts_with = list(/obj/structure/vehiclecage/quadbike)
|
||||
|
||||
/obj/structure/largecrate/vehicle/quadtrailer
|
||||
name = "\improper ATV trailer crate"
|
||||
desc = "A hefty wooden crate proudly displaying the logo of Ward-Takahashi's automotive division."
|
||||
starts_with = list(/obj/structure/vehiclecage/quadtrailer)
|
||||
|
||||
/obj/structure/largecrate/animal
|
||||
icon_state = "crittercrate"
|
||||
desc = "A hefty wooden crate with air holes. It is marked with the logo of NanoTrasen Pastures and the slogan, '90% less cloning defects* than competing brands**, or your money back***!'"
|
||||
|
||||
/obj/structure/largecrate/animal/mulebot
|
||||
name = "Mulebot crate"
|
||||
desc = "A hefty wooden crate labelled 'Proud Product of the Xion Manufacturing Group'"
|
||||
icon_state = "mulecrate"
|
||||
starts_with = list(/mob/living/bot/mulebot)
|
||||
|
||||
/obj/structure/largecrate/animal/corgi
|
||||
name = "corgi carrier"
|
||||
starts_with = list(/mob/living/simple_mob/animal/passive/dog/corgi)
|
||||
|
||||
/obj/structure/largecrate/animal/cow
|
||||
name = "cow crate"
|
||||
starts_with = list(/mob/living/simple_mob/animal/passive/cow)
|
||||
|
||||
/obj/structure/largecrate/animal/goat
|
||||
name = "goat crate"
|
||||
starts_with = list(/mob/living/simple_mob/animal/goat)
|
||||
|
||||
/obj/structure/largecrate/animal/cat
|
||||
name = "cat carrier"
|
||||
starts_with = list(/mob/living/simple_mob/animal/passive/cat)
|
||||
|
||||
/obj/structure/largecrate/animal/cat/bones
|
||||
starts_with = list(/mob/living/simple_mob/animal/passive/cat/bones)
|
||||
|
||||
/obj/structure/largecrate/animal/chick
|
||||
name = "chicken crate"
|
||||
starts_with = list(/mob/living/simple_mob/animal/passive/chick = 5)
|
||||
|
||||
/obj/structure/largecrate/animal/catslug
|
||||
name = "catslug carrier"
|
||||
starts_with = list(/mob/living/simple_mob/vore/alienanimals/catslug)
|
||||
|
||||
@@ -1,81 +1,81 @@
|
||||
/obj/structure/displaycase
|
||||
name = "display case"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "glassbox1"
|
||||
desc = "A display case for prized possessions. It taunts you to kick it."
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
unacidable = TRUE//Dissolving the case would also delete the gun.
|
||||
var/health = 30
|
||||
var/occupied = 1
|
||||
var/destroyed = 0
|
||||
|
||||
/obj/structure/displaycase/ex_act(severity)
|
||||
switch(severity)
|
||||
if (1)
|
||||
new /obj/item/weapon/material/shard( src.loc )
|
||||
if (occupied)
|
||||
new /obj/item/weapon/gun/energy/captain( src.loc )
|
||||
occupied = 0
|
||||
qdel(src)
|
||||
if (2)
|
||||
if (prob(50))
|
||||
src.health -= 15
|
||||
src.healthcheck()
|
||||
if (3)
|
||||
if (prob(50))
|
||||
src.health -= 5
|
||||
src.healthcheck()
|
||||
|
||||
|
||||
/obj/structure/displaycase/bullet_act(var/obj/item/projectile/Proj)
|
||||
health -= Proj.get_structure_damage()
|
||||
..()
|
||||
src.healthcheck()
|
||||
return
|
||||
|
||||
/obj/structure/displaycase/proc/healthcheck()
|
||||
if (src.health <= 0)
|
||||
if (!( src.destroyed ))
|
||||
src.density = FALSE
|
||||
src.destroyed = 1
|
||||
new /obj/item/weapon/material/shard( src.loc )
|
||||
playsound(src, "shatter", 70, 1)
|
||||
update_icon()
|
||||
else
|
||||
playsound(src, 'sound/effects/Glasshit.ogg', 75, 1)
|
||||
return
|
||||
|
||||
/obj/structure/displaycase/update_icon()
|
||||
if(src.destroyed)
|
||||
src.icon_state = "glassboxb[src.occupied]"
|
||||
else
|
||||
src.icon_state = "glassbox[src.occupied]"
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/displaycase/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
user.setClickCooldown(user.get_attack_speed(W))
|
||||
user.do_attack_animation(src)
|
||||
playsound(src, 'sound/effects/Glasshit.ogg', 50, 1)
|
||||
src.health -= W.force
|
||||
src.healthcheck()
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/structure/displaycase/attack_hand(mob/user as mob)
|
||||
if (src.destroyed && src.occupied)
|
||||
new /obj/item/weapon/gun/energy/captain( src.loc )
|
||||
to_chat(user, "<span class='notice'>You deactivate the hover field built into the case.</span>")
|
||||
src.occupied = 0
|
||||
src.add_fingerprint(user)
|
||||
update_icon()
|
||||
return
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>You kick the display case.</span>")
|
||||
for(var/mob/O in oviewers())
|
||||
if ((O.client && !( O.blinded )))
|
||||
to_chat(O, "<span class='warning'>[usr] kicks the display case.</span>")
|
||||
src.health -= 2
|
||||
healthcheck()
|
||||
return
|
||||
/obj/structure/displaycase
|
||||
name = "display case"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "glassbox1"
|
||||
desc = "A display case for prized possessions. It taunts you to kick it."
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
unacidable = TRUE//Dissolving the case would also delete the gun.
|
||||
var/health = 30
|
||||
var/occupied = 1
|
||||
var/destroyed = 0
|
||||
|
||||
/obj/structure/displaycase/ex_act(severity)
|
||||
switch(severity)
|
||||
if (1)
|
||||
new /obj/item/weapon/material/shard( src.loc )
|
||||
if (occupied)
|
||||
new /obj/item/weapon/gun/energy/captain( src.loc )
|
||||
occupied = 0
|
||||
qdel(src)
|
||||
if (2)
|
||||
if (prob(50))
|
||||
src.health -= 15
|
||||
src.healthcheck()
|
||||
if (3)
|
||||
if (prob(50))
|
||||
src.health -= 5
|
||||
src.healthcheck()
|
||||
|
||||
|
||||
/obj/structure/displaycase/bullet_act(var/obj/item/projectile/Proj)
|
||||
health -= Proj.get_structure_damage()
|
||||
..()
|
||||
src.healthcheck()
|
||||
return
|
||||
|
||||
/obj/structure/displaycase/proc/healthcheck()
|
||||
if (src.health <= 0)
|
||||
if (!( src.destroyed ))
|
||||
src.density = FALSE
|
||||
src.destroyed = 1
|
||||
new /obj/item/weapon/material/shard( src.loc )
|
||||
playsound(src, "shatter", 70, 1)
|
||||
update_icon()
|
||||
else
|
||||
playsound(src, 'sound/effects/Glasshit.ogg', 75, 1)
|
||||
return
|
||||
|
||||
/obj/structure/displaycase/update_icon()
|
||||
if(src.destroyed)
|
||||
src.icon_state = "glassboxb[src.occupied]"
|
||||
else
|
||||
src.icon_state = "glassbox[src.occupied]"
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/displaycase/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
user.setClickCooldown(user.get_attack_speed(W))
|
||||
user.do_attack_animation(src)
|
||||
playsound(src, 'sound/effects/Glasshit.ogg', 50, 1)
|
||||
src.health -= W.force
|
||||
src.healthcheck()
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/structure/displaycase/attack_hand(mob/user as mob)
|
||||
if (src.destroyed && src.occupied)
|
||||
new /obj/item/weapon/gun/energy/captain( src.loc )
|
||||
to_chat(user, "<span class='notice'>You deactivate the hover field built into the case.</span>")
|
||||
src.occupied = 0
|
||||
src.add_fingerprint(user)
|
||||
update_icon()
|
||||
return
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>You kick the display case.</span>")
|
||||
for(var/mob/O in oviewers())
|
||||
if ((O.client && !( O.blinded )))
|
||||
to_chat(O, "<span class='warning'>[usr] kicks the display case.</span>")
|
||||
src.health -= 2
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
@@ -1,329 +1,329 @@
|
||||
/obj/structure/door_assembly
|
||||
name = "airlock assembly"
|
||||
icon = 'icons/obj/doors/door_assembly.dmi'
|
||||
icon_state = "door_as_0"
|
||||
anchored = FALSE
|
||||
density = TRUE
|
||||
w_class = ITEMSIZE_HUGE
|
||||
var/state = 0
|
||||
var/base_icon_state = ""
|
||||
var/base_name = "airlock"
|
||||
var/obj/item/weapon/airlock_electronics/electronics = null
|
||||
var/airlock_type = "" //the type path of the airlock once completed
|
||||
var/glass_type = "/glass"
|
||||
var/glass = 0 // 0 = glass can be installed. -1 = glass can't be installed. 1 = glass is already installed. Text = mineral plating is installed instead.
|
||||
var/created_name = null
|
||||
|
||||
/obj/structure/door_assembly/New()
|
||||
update_state()
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_com
|
||||
base_icon_state = "com"
|
||||
base_name = "Command airlock"
|
||||
glass_type = "/glass_command"
|
||||
airlock_type = "/command"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_sec
|
||||
base_icon_state = "sec"
|
||||
base_name = "Security airlock"
|
||||
glass_type = "/glass_security"
|
||||
airlock_type = "/security"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_eng
|
||||
base_icon_state = "eng"
|
||||
base_name = "Engineering airlock"
|
||||
glass_type = "/glass_engineering"
|
||||
airlock_type = "/engineering"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_eat
|
||||
base_icon_state = "eat"
|
||||
base_name = "Engineering atmos airlock"
|
||||
glass_type = "/glass_engineeringatmos"
|
||||
airlock_type = "/engineering"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_min
|
||||
base_icon_state = "min"
|
||||
base_name = "Mining airlock"
|
||||
glass_type = "/glass_mining"
|
||||
airlock_type = "/mining"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_atmo
|
||||
base_icon_state = "atmo"
|
||||
base_name = "Atmospherics airlock"
|
||||
glass_type = "/glass_atmos"
|
||||
airlock_type = "/atmos"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_research
|
||||
base_icon_state = "res"
|
||||
base_name = "Research airlock"
|
||||
glass_type = "/glass_research"
|
||||
airlock_type = "/research"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_science
|
||||
base_icon_state = "sci"
|
||||
base_name = "Science airlock"
|
||||
glass_type = "/glass_science"
|
||||
airlock_type = "/science"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_med
|
||||
base_icon_state = "med"
|
||||
base_name = "Medical airlock"
|
||||
glass_type = "/glass_medical"
|
||||
airlock_type = "/medical"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_ext
|
||||
base_icon_state = "ext"
|
||||
base_name = "External airlock"
|
||||
glass_type = "/glass_external"
|
||||
airlock_type = "/external"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_mai
|
||||
base_icon_state = "mai"
|
||||
base_name = "Maintenance airlock"
|
||||
airlock_type = "/maintenance"
|
||||
glass = -1
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_fre
|
||||
base_icon_state = "fre"
|
||||
base_name = "Freezer airlock"
|
||||
airlock_type = "/freezer"
|
||||
glass = -1
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_hatch
|
||||
base_icon_state = "hatch"
|
||||
base_name = "airtight hatch"
|
||||
airlock_type = "/hatch"
|
||||
glass = -1
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_mhatch
|
||||
base_icon_state = "mhatch"
|
||||
base_name = "maintenance hatch"
|
||||
airlock_type = "/maintenance_hatch"
|
||||
glass = -1
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_highsecurity // Borrowing this until WJohnston makes sprites for the assembly
|
||||
base_icon_state = "highsec"
|
||||
base_name = "high security airlock"
|
||||
airlock_type = "/highsecurity"
|
||||
glass = -1
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_voidcraft
|
||||
base_icon_state = "voidcraft"
|
||||
base_name = "voidcraft hatch"
|
||||
airlock_type = "/voidcraft"
|
||||
glass = -1
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_voidcraft/vertical
|
||||
base_icon_state = "voidcraft_vertical"
|
||||
airlock_type = "/voidcraft/vertical"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_alien
|
||||
base_icon_state = "alien"
|
||||
base_name = "alien airlock"
|
||||
airlock_type = "/alien"
|
||||
glass = -1
|
||||
|
||||
/obj/structure/door_assembly/multi_tile
|
||||
icon = 'icons/obj/doors/door_assembly2x1.dmi'
|
||||
dir = EAST
|
||||
var/width = 1
|
||||
|
||||
/*Temporary until we get sprites.
|
||||
glass_type = "/multi_tile/glass"
|
||||
airlock_type = "/multi_tile/maint"
|
||||
glass = 1*/
|
||||
base_icon_state = "g" //Remember to delete this line when reverting "glass" var to 1.
|
||||
airlock_type = "/multi_tile/glass"
|
||||
glass = -1 //To prevent bugs in deconstruction process.
|
||||
|
||||
/obj/structure/door_assembly/multi_tile/New()
|
||||
if(dir in list(EAST, WEST))
|
||||
bound_width = width * world.icon_size
|
||||
bound_height = world.icon_size
|
||||
else
|
||||
bound_width = world.icon_size
|
||||
bound_height = width * world.icon_size
|
||||
update_state()
|
||||
|
||||
/obj/structure/door_assembly/multi_tile/Moved(atom/old_loc, direction, forced = FALSE)
|
||||
. = ..()
|
||||
if(dir in list(EAST, WEST))
|
||||
bound_width = width * world.icon_size
|
||||
bound_height = world.icon_size
|
||||
else
|
||||
bound_width = world.icon_size
|
||||
bound_height = width * world.icon_size
|
||||
|
||||
/obj/structure/door_assembly/proc/rename_door(mob/living/user)
|
||||
var/t = sanitizeSafe(tgui_input_text(user, "Enter the name for the [base_name].", src.name, src.created_name, MAX_NAME_LEN), MAX_NAME_LEN)
|
||||
if(!in_range(src, user) && src.loc != user) return
|
||||
created_name = t
|
||||
update_state()
|
||||
|
||||
/obj/structure/door_assembly/attack_robot(mob/living/silicon/robot/user)
|
||||
if(Adjacent(user) && (user.module && (istype(user.module,/obj/item/weapon/robot_module/robot/engineering)) \
|
||||
|| istype(user.module,/obj/item/weapon/robot_module/drone))) //Only drone (and engiborg) needs this.
|
||||
rename_door(user)
|
||||
|
||||
/obj/structure/door_assembly/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/pen))
|
||||
rename_door(user)
|
||||
return
|
||||
|
||||
if(W.has_tool_quality(TOOL_WELDER) && ( (istext(glass)) || (glass == 1) || (!anchored) ))
|
||||
var/obj/item/weapon/weldingtool/WT = W.get_welder()
|
||||
if (WT.remove_fuel(0, user))
|
||||
playsound(src, WT.usesound, 50, 1)
|
||||
if(istext(glass))
|
||||
user.visible_message("[user] welds the [glass] plating off the airlock assembly.", "You start to weld the [glass] plating off the airlock assembly.")
|
||||
if(do_after(user, 4 SECONDS * WT.toolspeed, src, exclusive = TASK_ALL_EXCLUSIVE))
|
||||
if(!src || !WT.isOn()) return
|
||||
to_chat(user, "<span class='notice'>You welded the [glass] plating off!</span>")
|
||||
var/M = text2path("/obj/item/stack/material/[glass]")
|
||||
new M(src.loc, 2)
|
||||
glass = 0
|
||||
else if(glass == 1)
|
||||
user.visible_message("[user] welds the glass panel out of the airlock assembly.", "You start to weld the glass panel out of the airlock assembly.")
|
||||
if(do_after(user, 4 SECONDS * WT.toolspeed, src, exclusive = TASK_ALL_EXCLUSIVE))
|
||||
if(!src || !WT.isOn()) return
|
||||
to_chat(user, "<span class='notice'>You welded the glass panel out!</span>")
|
||||
new /obj/item/stack/material/glass/reinforced(src.loc)
|
||||
glass = 0
|
||||
else if(!anchored)
|
||||
user.visible_message("[user] dissassembles the airlock assembly.", "You start to dissassemble the airlock assembly.")
|
||||
if(do_after(user, 4 SECONDS * WT.toolspeed, src, exclusive = TASK_ALL_EXCLUSIVE))
|
||||
if(!src || !WT.isOn()) return
|
||||
to_chat(user, "<span class='notice'>You dissasembled the airlock assembly!</span>")
|
||||
new /obj/item/stack/material/steel(src.loc, 4)
|
||||
qdel (src)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You need more welding fuel.</span>")
|
||||
return
|
||||
|
||||
else if(W.has_tool_quality(TOOL_WRENCH) && state == 0)
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
if(anchored)
|
||||
user.visible_message("[user] begins unsecuring the airlock assembly from the floor.", "You starts unsecuring the airlock assembly from the floor.")
|
||||
else
|
||||
user.visible_message("[user] begins securing the airlock assembly to the floor.", "You starts securing the airlock assembly to the floor.")
|
||||
|
||||
if(do_after(user, 4 SECONDS * W.toolspeed, src, exclusive = TASK_ALL_EXCLUSIVE))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You [anchored? "un" : ""]secured the airlock assembly!</span>")
|
||||
anchored = !anchored
|
||||
|
||||
else if(istype(W, /obj/item/stack/cable_coil) && state == 0 && anchored)
|
||||
var/obj/item/stack/cable_coil/C = W
|
||||
if (C.get_amount() < 1)
|
||||
to_chat(user, "<span class='warning'>You need one length of coil to wire the airlock assembly.</span>")
|
||||
return
|
||||
user.visible_message("[user] wires the airlock assembly.", "You start to wire the airlock assembly.")
|
||||
if(do_after(user, 4 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE) && state == 0 && anchored)
|
||||
if (C.use(1))
|
||||
src.state = 1
|
||||
to_chat(user, "<span class='notice'>You wire the airlock.</span>")
|
||||
|
||||
else if(W.has_tool_quality(TOOL_WIRECUTTER) && state == 1 )
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly.")
|
||||
|
||||
if(do_after(user, 4 SECONDS * W.toolspeed, src, exclusive = TASK_ALL_EXCLUSIVE))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You cut the airlock wires.!</span>")
|
||||
new/obj/item/stack/cable_coil(src.loc, 1)
|
||||
src.state = 0
|
||||
|
||||
else if(istype(W, /obj/item/weapon/airlock_electronics) && state == 1)
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly.")
|
||||
|
||||
if(do_after(user, 4 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE))
|
||||
if(!src) return
|
||||
user.drop_item()
|
||||
W.loc = src
|
||||
to_chat(user, "<span class='notice'>You installed the airlock electronics!</span>")
|
||||
src.state = 2
|
||||
src.electronics = W
|
||||
|
||||
else if(W.has_tool_quality(TOOL_CROWBAR) && state == 2 )
|
||||
//This should never happen, but just in case I guess
|
||||
if (!electronics)
|
||||
to_chat(user, "<span class='notice'>There was nothing to remove.</span>")
|
||||
src.state = 1
|
||||
return
|
||||
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
user.visible_message("\The [user] starts removing the electronics from the airlock assembly.", "You start removing the electronics from the airlock assembly.")
|
||||
|
||||
if(do_after(user, 4 SECONDS * W.toolspeed, src, exclusive = TASK_ALL_EXCLUSIVE))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You removed the airlock electronics!</span>")
|
||||
src.state = 1
|
||||
electronics.loc = src.loc
|
||||
electronics = null
|
||||
|
||||
else if(istype(W, /obj/item/stack/material) && !glass)
|
||||
var/obj/item/stack/S = W
|
||||
var/material_name = S.get_material_name()
|
||||
if (S)
|
||||
if (S.get_amount() >= 1)
|
||||
if(material_name == "rglass")
|
||||
playsound(src, 'sound/items/Crowbar.ogg', 100, 1)
|
||||
user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.")
|
||||
if(do_after(user, 4 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE) && !glass)
|
||||
if (S.use(1))
|
||||
to_chat(user, "<span class='notice'>You installed reinforced glass windows into the airlock assembly.</span>")
|
||||
glass = 1
|
||||
else if(material_name)
|
||||
// Ugly hack, will suffice for now. Need to fix it upstream as well, may rewrite mineral walls. ~Z
|
||||
if(!(material_name in list("gold", "silver", "diamond", "uranium", "phoron", "sandstone")))
|
||||
to_chat(user, "You cannot make an airlock out of that material.")
|
||||
return
|
||||
if(S.get_amount() >= 2)
|
||||
playsound(src, 'sound/items/Crowbar.ogg', 100, 1)
|
||||
user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.")
|
||||
if(do_after(user, 4 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE) && !glass)
|
||||
if (S.use(2))
|
||||
to_chat(user, "<span class='notice'>You installed [material_display_name(material_name)] plating into the airlock assembly.</span>")
|
||||
glass = material_name
|
||||
|
||||
else if(W.has_tool_quality(TOOL_SCREWDRIVER) && state == 2 )
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
to_chat(user, "<span class='notice'>Now finishing the airlock.</span>")
|
||||
|
||||
if(do_after(user, 4 SECONDS * W.toolspeed, src, exclusive = TASK_ALL_EXCLUSIVE))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You finish the airlock!</span>")
|
||||
var/path
|
||||
if(istext(glass))
|
||||
path = text2path("/obj/machinery/door/airlock/[glass]")
|
||||
else if (glass == 1)
|
||||
path = text2path("/obj/machinery/door/airlock[glass_type]")
|
||||
else
|
||||
path = text2path("/obj/machinery/door/airlock[airlock_type]")
|
||||
|
||||
new path(src.loc, src)
|
||||
qdel(src)
|
||||
else
|
||||
..()
|
||||
update_state()
|
||||
|
||||
/obj/structure/door_assembly/proc/update_state()
|
||||
icon_state = "door_as_[glass == 1 ? "g" : ""][istext(glass) ? glass : base_icon_state][state]"
|
||||
name = ""
|
||||
switch (state)
|
||||
if(0)
|
||||
if (anchored)
|
||||
name = "secured "
|
||||
if(1)
|
||||
name = "wired "
|
||||
if(2)
|
||||
name = "near finished "
|
||||
name += "[glass == 1 ? "window " : ""][istext(glass) ? "[glass] airlock" : base_name] assembly ([created_name])"
|
||||
|
||||
// Airlock frames are indestructable, so bullets hitting them would always be stopped.
|
||||
// To fix this, airlock assemblies will sometimes let bullets pass through, since generally the sprite shows them partially open.
|
||||
/obj/structure/door_assembly/bullet_act(var/obj/item/projectile/P)
|
||||
if(prob(40)) // Chance for the frame to let the bullet keep going.
|
||||
return PROJECTILE_CONTINUE
|
||||
return ..()
|
||||
/obj/structure/door_assembly
|
||||
name = "airlock assembly"
|
||||
icon = 'icons/obj/doors/door_assembly.dmi'
|
||||
icon_state = "door_as_0"
|
||||
anchored = FALSE
|
||||
density = TRUE
|
||||
w_class = ITEMSIZE_HUGE
|
||||
var/state = 0
|
||||
var/base_icon_state = ""
|
||||
var/base_name = "airlock"
|
||||
var/obj/item/weapon/airlock_electronics/electronics = null
|
||||
var/airlock_type = "" //the type path of the airlock once completed
|
||||
var/glass_type = "/glass"
|
||||
var/glass = 0 // 0 = glass can be installed. -1 = glass can't be installed. 1 = glass is already installed. Text = mineral plating is installed instead.
|
||||
var/created_name = null
|
||||
|
||||
/obj/structure/door_assembly/New()
|
||||
update_state()
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_com
|
||||
base_icon_state = "com"
|
||||
base_name = "Command airlock"
|
||||
glass_type = "/glass_command"
|
||||
airlock_type = "/command"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_sec
|
||||
base_icon_state = "sec"
|
||||
base_name = "Security airlock"
|
||||
glass_type = "/glass_security"
|
||||
airlock_type = "/security"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_eng
|
||||
base_icon_state = "eng"
|
||||
base_name = "Engineering airlock"
|
||||
glass_type = "/glass_engineering"
|
||||
airlock_type = "/engineering"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_eat
|
||||
base_icon_state = "eat"
|
||||
base_name = "Engineering atmos airlock"
|
||||
glass_type = "/glass_engineeringatmos"
|
||||
airlock_type = "/engineering"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_min
|
||||
base_icon_state = "min"
|
||||
base_name = "Mining airlock"
|
||||
glass_type = "/glass_mining"
|
||||
airlock_type = "/mining"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_atmo
|
||||
base_icon_state = "atmo"
|
||||
base_name = "Atmospherics airlock"
|
||||
glass_type = "/glass_atmos"
|
||||
airlock_type = "/atmos"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_research
|
||||
base_icon_state = "res"
|
||||
base_name = "Research airlock"
|
||||
glass_type = "/glass_research"
|
||||
airlock_type = "/research"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_science
|
||||
base_icon_state = "sci"
|
||||
base_name = "Science airlock"
|
||||
glass_type = "/glass_science"
|
||||
airlock_type = "/science"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_med
|
||||
base_icon_state = "med"
|
||||
base_name = "Medical airlock"
|
||||
glass_type = "/glass_medical"
|
||||
airlock_type = "/medical"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_ext
|
||||
base_icon_state = "ext"
|
||||
base_name = "External airlock"
|
||||
glass_type = "/glass_external"
|
||||
airlock_type = "/external"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_mai
|
||||
base_icon_state = "mai"
|
||||
base_name = "Maintenance airlock"
|
||||
airlock_type = "/maintenance"
|
||||
glass = -1
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_fre
|
||||
base_icon_state = "fre"
|
||||
base_name = "Freezer airlock"
|
||||
airlock_type = "/freezer"
|
||||
glass = -1
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_hatch
|
||||
base_icon_state = "hatch"
|
||||
base_name = "airtight hatch"
|
||||
airlock_type = "/hatch"
|
||||
glass = -1
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_mhatch
|
||||
base_icon_state = "mhatch"
|
||||
base_name = "maintenance hatch"
|
||||
airlock_type = "/maintenance_hatch"
|
||||
glass = -1
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_highsecurity // Borrowing this until WJohnston makes sprites for the assembly
|
||||
base_icon_state = "highsec"
|
||||
base_name = "high security airlock"
|
||||
airlock_type = "/highsecurity"
|
||||
glass = -1
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_voidcraft
|
||||
base_icon_state = "voidcraft"
|
||||
base_name = "voidcraft hatch"
|
||||
airlock_type = "/voidcraft"
|
||||
glass = -1
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_voidcraft/vertical
|
||||
base_icon_state = "voidcraft_vertical"
|
||||
airlock_type = "/voidcraft/vertical"
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_alien
|
||||
base_icon_state = "alien"
|
||||
base_name = "alien airlock"
|
||||
airlock_type = "/alien"
|
||||
glass = -1
|
||||
|
||||
/obj/structure/door_assembly/multi_tile
|
||||
icon = 'icons/obj/doors/door_assembly2x1.dmi'
|
||||
dir = EAST
|
||||
var/width = 1
|
||||
|
||||
/*Temporary until we get sprites.
|
||||
glass_type = "/multi_tile/glass"
|
||||
airlock_type = "/multi_tile/maint"
|
||||
glass = 1*/
|
||||
base_icon_state = "g" //Remember to delete this line when reverting "glass" var to 1.
|
||||
airlock_type = "/multi_tile/glass"
|
||||
glass = -1 //To prevent bugs in deconstruction process.
|
||||
|
||||
/obj/structure/door_assembly/multi_tile/New()
|
||||
if(dir in list(EAST, WEST))
|
||||
bound_width = width * world.icon_size
|
||||
bound_height = world.icon_size
|
||||
else
|
||||
bound_width = world.icon_size
|
||||
bound_height = width * world.icon_size
|
||||
update_state()
|
||||
|
||||
/obj/structure/door_assembly/multi_tile/Moved(atom/old_loc, direction, forced = FALSE)
|
||||
. = ..()
|
||||
if(dir in list(EAST, WEST))
|
||||
bound_width = width * world.icon_size
|
||||
bound_height = world.icon_size
|
||||
else
|
||||
bound_width = world.icon_size
|
||||
bound_height = width * world.icon_size
|
||||
|
||||
/obj/structure/door_assembly/proc/rename_door(mob/living/user)
|
||||
var/t = sanitizeSafe(tgui_input_text(user, "Enter the name for the [base_name].", src.name, src.created_name, MAX_NAME_LEN), MAX_NAME_LEN)
|
||||
if(!in_range(src, user) && src.loc != user) return
|
||||
created_name = t
|
||||
update_state()
|
||||
|
||||
/obj/structure/door_assembly/attack_robot(mob/living/silicon/robot/user)
|
||||
if(Adjacent(user) && (user.module && (istype(user.module,/obj/item/weapon/robot_module/robot/engineering)) \
|
||||
|| istype(user.module,/obj/item/weapon/robot_module/drone))) //Only drone (and engiborg) needs this.
|
||||
rename_door(user)
|
||||
|
||||
/obj/structure/door_assembly/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/pen))
|
||||
rename_door(user)
|
||||
return
|
||||
|
||||
if(W.has_tool_quality(TOOL_WELDER) && ( (istext(glass)) || (glass == 1) || (!anchored) ))
|
||||
var/obj/item/weapon/weldingtool/WT = W.get_welder()
|
||||
if (WT.remove_fuel(0, user))
|
||||
playsound(src, WT.usesound, 50, 1)
|
||||
if(istext(glass))
|
||||
user.visible_message("[user] welds the [glass] plating off the airlock assembly.", "You start to weld the [glass] plating off the airlock assembly.")
|
||||
if(do_after(user, 4 SECONDS * WT.toolspeed, src, exclusive = TASK_ALL_EXCLUSIVE))
|
||||
if(!src || !WT.isOn()) return
|
||||
to_chat(user, "<span class='notice'>You welded the [glass] plating off!</span>")
|
||||
var/M = text2path("/obj/item/stack/material/[glass]")
|
||||
new M(src.loc, 2)
|
||||
glass = 0
|
||||
else if(glass == 1)
|
||||
user.visible_message("[user] welds the glass panel out of the airlock assembly.", "You start to weld the glass panel out of the airlock assembly.")
|
||||
if(do_after(user, 4 SECONDS * WT.toolspeed, src, exclusive = TASK_ALL_EXCLUSIVE))
|
||||
if(!src || !WT.isOn()) return
|
||||
to_chat(user, "<span class='notice'>You welded the glass panel out!</span>")
|
||||
new /obj/item/stack/material/glass/reinforced(src.loc)
|
||||
glass = 0
|
||||
else if(!anchored)
|
||||
user.visible_message("[user] dissassembles the airlock assembly.", "You start to dissassemble the airlock assembly.")
|
||||
if(do_after(user, 4 SECONDS * WT.toolspeed, src, exclusive = TASK_ALL_EXCLUSIVE))
|
||||
if(!src || !WT.isOn()) return
|
||||
to_chat(user, "<span class='notice'>You dissasembled the airlock assembly!</span>")
|
||||
new /obj/item/stack/material/steel(src.loc, 4)
|
||||
qdel (src)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You need more welding fuel.</span>")
|
||||
return
|
||||
|
||||
else if(W.has_tool_quality(TOOL_WRENCH) && state == 0)
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
if(anchored)
|
||||
user.visible_message("[user] begins unsecuring the airlock assembly from the floor.", "You starts unsecuring the airlock assembly from the floor.")
|
||||
else
|
||||
user.visible_message("[user] begins securing the airlock assembly to the floor.", "You starts securing the airlock assembly to the floor.")
|
||||
|
||||
if(do_after(user, 4 SECONDS * W.toolspeed, src, exclusive = TASK_ALL_EXCLUSIVE))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You [anchored? "un" : ""]secured the airlock assembly!</span>")
|
||||
anchored = !anchored
|
||||
|
||||
else if(istype(W, /obj/item/stack/cable_coil) && state == 0 && anchored)
|
||||
var/obj/item/stack/cable_coil/C = W
|
||||
if (C.get_amount() < 1)
|
||||
to_chat(user, "<span class='warning'>You need one length of coil to wire the airlock assembly.</span>")
|
||||
return
|
||||
user.visible_message("[user] wires the airlock assembly.", "You start to wire the airlock assembly.")
|
||||
if(do_after(user, 4 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE) && state == 0 && anchored)
|
||||
if (C.use(1))
|
||||
src.state = 1
|
||||
to_chat(user, "<span class='notice'>You wire the airlock.</span>")
|
||||
|
||||
else if(W.has_tool_quality(TOOL_WIRECUTTER) && state == 1 )
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly.")
|
||||
|
||||
if(do_after(user, 4 SECONDS * W.toolspeed, src, exclusive = TASK_ALL_EXCLUSIVE))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You cut the airlock wires.!</span>")
|
||||
new/obj/item/stack/cable_coil(src.loc, 1)
|
||||
src.state = 0
|
||||
|
||||
else if(istype(W, /obj/item/weapon/airlock_electronics) && state == 1)
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly.")
|
||||
|
||||
if(do_after(user, 4 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE))
|
||||
if(!src) return
|
||||
user.drop_item()
|
||||
W.loc = src
|
||||
to_chat(user, "<span class='notice'>You installed the airlock electronics!</span>")
|
||||
src.state = 2
|
||||
src.electronics = W
|
||||
|
||||
else if(W.has_tool_quality(TOOL_CROWBAR) && state == 2 )
|
||||
//This should never happen, but just in case I guess
|
||||
if (!electronics)
|
||||
to_chat(user, "<span class='notice'>There was nothing to remove.</span>")
|
||||
src.state = 1
|
||||
return
|
||||
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
user.visible_message("\The [user] starts removing the electronics from the airlock assembly.", "You start removing the electronics from the airlock assembly.")
|
||||
|
||||
if(do_after(user, 4 SECONDS * W.toolspeed, src, exclusive = TASK_ALL_EXCLUSIVE))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You removed the airlock electronics!</span>")
|
||||
src.state = 1
|
||||
electronics.loc = src.loc
|
||||
electronics = null
|
||||
|
||||
else if(istype(W, /obj/item/stack/material) && !glass)
|
||||
var/obj/item/stack/S = W
|
||||
var/material_name = S.get_material_name()
|
||||
if (S)
|
||||
if (S.get_amount() >= 1)
|
||||
if(material_name == "rglass")
|
||||
playsound(src, 'sound/items/Crowbar.ogg', 100, 1)
|
||||
user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.")
|
||||
if(do_after(user, 4 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE) && !glass)
|
||||
if (S.use(1))
|
||||
to_chat(user, "<span class='notice'>You installed reinforced glass windows into the airlock assembly.</span>")
|
||||
glass = 1
|
||||
else if(material_name)
|
||||
// Ugly hack, will suffice for now. Need to fix it upstream as well, may rewrite mineral walls. ~Z
|
||||
if(!(material_name in list("gold", "silver", "diamond", "uranium", "phoron", "sandstone")))
|
||||
to_chat(user, "You cannot make an airlock out of that material.")
|
||||
return
|
||||
if(S.get_amount() >= 2)
|
||||
playsound(src, 'sound/items/Crowbar.ogg', 100, 1)
|
||||
user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.")
|
||||
if(do_after(user, 4 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE) && !glass)
|
||||
if (S.use(2))
|
||||
to_chat(user, "<span class='notice'>You installed [material_display_name(material_name)] plating into the airlock assembly.</span>")
|
||||
glass = material_name
|
||||
|
||||
else if(W.has_tool_quality(TOOL_SCREWDRIVER) && state == 2 )
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
to_chat(user, "<span class='notice'>Now finishing the airlock.</span>")
|
||||
|
||||
if(do_after(user, 4 SECONDS * W.toolspeed, src, exclusive = TASK_ALL_EXCLUSIVE))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You finish the airlock!</span>")
|
||||
var/path
|
||||
if(istext(glass))
|
||||
path = text2path("/obj/machinery/door/airlock/[glass]")
|
||||
else if (glass == 1)
|
||||
path = text2path("/obj/machinery/door/airlock[glass_type]")
|
||||
else
|
||||
path = text2path("/obj/machinery/door/airlock[airlock_type]")
|
||||
|
||||
new path(src.loc, src)
|
||||
qdel(src)
|
||||
else
|
||||
..()
|
||||
update_state()
|
||||
|
||||
/obj/structure/door_assembly/proc/update_state()
|
||||
icon_state = "door_as_[glass == 1 ? "g" : ""][istext(glass) ? glass : base_icon_state][state]"
|
||||
name = ""
|
||||
switch (state)
|
||||
if(0)
|
||||
if (anchored)
|
||||
name = "secured "
|
||||
if(1)
|
||||
name = "wired "
|
||||
if(2)
|
||||
name = "near finished "
|
||||
name += "[glass == 1 ? "window " : ""][istext(glass) ? "[glass] airlock" : base_name] assembly ([created_name])"
|
||||
|
||||
// Airlock frames are indestructable, so bullets hitting them would always be stopped.
|
||||
// To fix this, airlock assemblies will sometimes let bullets pass through, since generally the sprite shows them partially open.
|
||||
/obj/structure/door_assembly/bullet_act(var/obj/item/projectile/P)
|
||||
if(prob(40)) // Chance for the frame to let the bullet keep going.
|
||||
return PROJECTILE_CONTINUE
|
||||
return ..()
|
||||
|
||||
@@ -1,74 +1,74 @@
|
||||
/obj/structure/fitness/boxing_ropes
|
||||
name = "ropes"
|
||||
desc = "Firm yet springy, perhaps this could be useful!"
|
||||
icon = 'icons/obj/fitness_vr.dmi'
|
||||
icon_state = "ropes"
|
||||
density = TRUE
|
||||
throwpass = TRUE
|
||||
climbable = TRUE
|
||||
layer = WINDOW_LAYER
|
||||
anchored = TRUE
|
||||
flags = ON_BORDER
|
||||
|
||||
/obj/structure/fitness/boxing_ropes/CanPass(atom/movable/mover, turf/target)
|
||||
if(istype(mover) && mover.checkpass(PASSTABLE))
|
||||
return TRUE
|
||||
if(get_dir(mover, target) == reverse_dir[dir]) // From elsewhere to here, can't move against our dir
|
||||
return !density
|
||||
return TRUE
|
||||
|
||||
/obj/structure/fitness/boxing_ropes/Uncross(atom/movable/mover, turf/target)
|
||||
if(istype(mover) && mover.checkpass(PASSTABLE))
|
||||
return TRUE
|
||||
if(get_dir(mover, target) == dir) // From here to elsewhere, can't move in our dir
|
||||
return !density
|
||||
return TRUE
|
||||
/obj/structure/fitness/boxing_ropes/do_climb(var/mob/living/user) //Sets it so that players can climb *over* the turf and will enter the the turf **this** turf is facing.
|
||||
if(!can_climb(user))
|
||||
return
|
||||
|
||||
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
|
||||
LAZYDISTINCTADD(climbers, user)
|
||||
|
||||
if(!do_after(user,(issmall(user) ? 20 : 34)))
|
||||
LAZYREMOVE(climbers, user)
|
||||
return
|
||||
|
||||
if(!can_climb(user, post_climb_check=1))
|
||||
LAZYREMOVE(climbers, user)
|
||||
return
|
||||
|
||||
if(get_turf(user) == get_turf(src))
|
||||
usr.forceMove(get_step(src, src.dir))
|
||||
else
|
||||
usr.forceMove(get_turf(src))
|
||||
|
||||
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
|
||||
LAZYREMOVE(climbers, user)
|
||||
|
||||
/obj/structure/fitness/boxing_ropes/can_climb(var/mob/living/user, post_climb_check=0) //Sets it to keep people from climbing over into the next turf if it is occupied.
|
||||
if(!..())
|
||||
return 0
|
||||
|
||||
if(get_turf(user) == get_turf(src))
|
||||
var/obj/occupied = neighbor_turf_impassable()
|
||||
if(occupied)
|
||||
to_chat(user, "<span class='danger'>You can't climb there, there's \a [occupied] in the way.</span>")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/structure/fitness/boxing_ropes/bottom
|
||||
plane = MOB_PLANE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
|
||||
/obj/structure/fitness/boxing_ropes/turnbuckle
|
||||
name = "turnbuckle"
|
||||
desc = "A sturdy post that looks like it could support even the most heaviest of heavy weights!"
|
||||
icon = 'icons/obj/fitness_vr.dmi'
|
||||
icon_state = "turnbuckle"
|
||||
layer = WINDOW_LAYER
|
||||
|
||||
/turf/simulated/fitness
|
||||
name = "Mat"
|
||||
icon = 'icons/turf/floors_vr.dmi'
|
||||
/obj/structure/fitness/boxing_ropes
|
||||
name = "ropes"
|
||||
desc = "Firm yet springy, perhaps this could be useful!"
|
||||
icon = 'icons/obj/fitness_vr.dmi'
|
||||
icon_state = "ropes"
|
||||
density = TRUE
|
||||
throwpass = TRUE
|
||||
climbable = TRUE
|
||||
layer = WINDOW_LAYER
|
||||
anchored = TRUE
|
||||
flags = ON_BORDER
|
||||
|
||||
/obj/structure/fitness/boxing_ropes/CanPass(atom/movable/mover, turf/target)
|
||||
if(istype(mover) && mover.checkpass(PASSTABLE))
|
||||
return TRUE
|
||||
if(get_dir(mover, target) == reverse_dir[dir]) // From elsewhere to here, can't move against our dir
|
||||
return !density
|
||||
return TRUE
|
||||
|
||||
/obj/structure/fitness/boxing_ropes/Uncross(atom/movable/mover, turf/target)
|
||||
if(istype(mover) && mover.checkpass(PASSTABLE))
|
||||
return TRUE
|
||||
if(get_dir(mover, target) == dir) // From here to elsewhere, can't move in our dir
|
||||
return !density
|
||||
return TRUE
|
||||
/obj/structure/fitness/boxing_ropes/do_climb(var/mob/living/user) //Sets it so that players can climb *over* the turf and will enter the the turf **this** turf is facing.
|
||||
if(!can_climb(user))
|
||||
return
|
||||
|
||||
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
|
||||
LAZYDISTINCTADD(climbers, user)
|
||||
|
||||
if(!do_after(user,(issmall(user) ? 20 : 34)))
|
||||
LAZYREMOVE(climbers, user)
|
||||
return
|
||||
|
||||
if(!can_climb(user, post_climb_check=1))
|
||||
LAZYREMOVE(climbers, user)
|
||||
return
|
||||
|
||||
if(get_turf(user) == get_turf(src))
|
||||
usr.forceMove(get_step(src, src.dir))
|
||||
else
|
||||
usr.forceMove(get_turf(src))
|
||||
|
||||
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
|
||||
LAZYREMOVE(climbers, user)
|
||||
|
||||
/obj/structure/fitness/boxing_ropes/can_climb(var/mob/living/user, post_climb_check=0) //Sets it to keep people from climbing over into the next turf if it is occupied.
|
||||
if(!..())
|
||||
return 0
|
||||
|
||||
if(get_turf(user) == get_turf(src))
|
||||
var/obj/occupied = neighbor_turf_impassable()
|
||||
if(occupied)
|
||||
to_chat(user, "<span class='danger'>You can't climb there, there's \a [occupied] in the way.</span>")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/structure/fitness/boxing_ropes/bottom
|
||||
plane = MOB_PLANE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
|
||||
/obj/structure/fitness/boxing_ropes/turnbuckle
|
||||
name = "turnbuckle"
|
||||
desc = "A sturdy post that looks like it could support even the most heaviest of heavy weights!"
|
||||
icon = 'icons/obj/fitness_vr.dmi'
|
||||
icon_state = "turnbuckle"
|
||||
layer = WINDOW_LAYER
|
||||
|
||||
/turf/simulated/fitness
|
||||
name = "Mat"
|
||||
icon = 'icons/turf/floors_vr.dmi'
|
||||
icon_state = "fit_mat"
|
||||
@@ -1,32 +1,32 @@
|
||||
/obj/structure/flora/tree/bigtree
|
||||
icon = 'icons/obj/flora/moretrees_vr.dmi'
|
||||
icon_state = "bigtree1"
|
||||
base_state = "tree"
|
||||
product = /obj/item/stack/material/log
|
||||
product_amount = 20
|
||||
health = 400
|
||||
max_health = 400
|
||||
pixel_x = -65
|
||||
pixel_y = -8
|
||||
layer = MOB_LAYER - 1
|
||||
shake_animation_degrees = 2
|
||||
|
||||
/obj/structure/flora/tree/bigtree/choose_icon_state()
|
||||
return "[base_state][rand(1, 4)]"
|
||||
|
||||
/obj/structure/flora/tree/bigtree/Initialize()
|
||||
. = ..()
|
||||
|
||||
var/image/i = image('icons/obj/flora/moretrees_vr.dmi', "[icon_state]-b")
|
||||
i.plane = ABOVE_MOB_PLANE
|
||||
add_overlay(i)
|
||||
|
||||
/obj/structure/flora/tree/bigtree/stump()
|
||||
if(is_stump)
|
||||
return
|
||||
|
||||
is_stump = TRUE
|
||||
density = FALSE
|
||||
icon_state = "[icon_state]_stump"
|
||||
cut_overlays()
|
||||
/obj/structure/flora/tree/bigtree
|
||||
icon = 'icons/obj/flora/moretrees_vr.dmi'
|
||||
icon_state = "bigtree1"
|
||||
base_state = "tree"
|
||||
product = /obj/item/stack/material/log
|
||||
product_amount = 20
|
||||
health = 400
|
||||
max_health = 400
|
||||
pixel_x = -65
|
||||
pixel_y = -8
|
||||
layer = MOB_LAYER - 1
|
||||
shake_animation_degrees = 2
|
||||
|
||||
/obj/structure/flora/tree/bigtree/choose_icon_state()
|
||||
return "[base_state][rand(1, 4)]"
|
||||
|
||||
/obj/structure/flora/tree/bigtree/Initialize()
|
||||
. = ..()
|
||||
|
||||
var/image/i = image('icons/obj/flora/moretrees_vr.dmi', "[icon_state]-b")
|
||||
i.plane = ABOVE_MOB_PLANE
|
||||
add_overlay(i)
|
||||
|
||||
/obj/structure/flora/tree/bigtree/stump()
|
||||
if(is_stump)
|
||||
return
|
||||
|
||||
is_stump = TRUE
|
||||
density = FALSE
|
||||
icon_state = "[icon_state]_stump"
|
||||
cut_overlays()
|
||||
set_light(0)
|
||||
@@ -1,421 +1,421 @@
|
||||
/obj/structure/girder
|
||||
name = "girder"
|
||||
icon_state = "girder"
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
plane = PLATING_PLANE
|
||||
w_class = ITEMSIZE_HUGE
|
||||
var/state = 0
|
||||
var/health = 200
|
||||
var/max_health = 200
|
||||
var/displaced_health = 50
|
||||
var/current_damage = 0
|
||||
var/cover = 50 //how much cover the girder provides against projectiles.
|
||||
var/default_material = MAT_STEEL
|
||||
var/datum/material/girder_material
|
||||
var/datum/material/reinf_material
|
||||
var/reinforcing = 0
|
||||
var/applies_material_colour = 1
|
||||
var/wall_type = /turf/simulated/wall
|
||||
|
||||
/obj/structure/girder/New(var/newloc, var/material_key)
|
||||
..(newloc)
|
||||
if(!material_key)
|
||||
material_key = default_material
|
||||
set_material(material_key)
|
||||
update_icon()
|
||||
|
||||
/obj/structure/girder/Destroy()
|
||||
if(girder_material.products_need_process())
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
. = ..()
|
||||
|
||||
/obj/structure/girder/process()
|
||||
if(!radiate())
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return
|
||||
|
||||
/obj/structure/girder/proc/radiate()
|
||||
var/total_radiation = girder_material.radioactivity + (reinf_material ? reinf_material.radioactivity / 2 : 0)
|
||||
if(!total_radiation)
|
||||
return
|
||||
|
||||
SSradiation.radiate(src, total_radiation)
|
||||
return total_radiation
|
||||
|
||||
|
||||
/obj/structure/girder/proc/set_material(var/new_material)
|
||||
girder_material = get_material_by_name(new_material)
|
||||
if(!girder_material)
|
||||
qdel(src)
|
||||
name = "[girder_material.display_name] [initial(name)]"
|
||||
max_health = round(girder_material.integrity) //Should be 150 with default integrity (steel). Weaker than ye-olden Girders now.
|
||||
health = max_health
|
||||
displaced_health = round(max_health/4)
|
||||
if(applies_material_colour)
|
||||
color = girder_material.icon_colour
|
||||
if(girder_material.products_need_process()) //Am I radioactive or some other? Process me!
|
||||
START_PROCESSING(SSobj, src)
|
||||
else if(datum_flags & DF_ISPROCESSING) //If I happened to be radioactive or s.o. previously, and am not now, stop processing.
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/structure/girder/get_material()
|
||||
return girder_material
|
||||
|
||||
/obj/structure/girder/update_icon()
|
||||
if(anchored)
|
||||
icon_state = initial(icon_state)
|
||||
else
|
||||
icon_state = "displaced"
|
||||
|
||||
/obj/structure/girder/displaced
|
||||
icon_state = "displaced"
|
||||
anchored = FALSE
|
||||
health = 50
|
||||
cover = 25
|
||||
|
||||
/obj/structure/girder/displaced/New(var/newloc, var/material_key)
|
||||
..(newloc, material_key)
|
||||
displace()
|
||||
|
||||
/obj/structure/girder/proc/displace()
|
||||
name = "displaced [girder_material.display_name] [initial(name)]"
|
||||
icon_state = "displaced"
|
||||
anchored = FALSE
|
||||
health = (displaced_health - round(current_damage / 4))
|
||||
cover = 25
|
||||
|
||||
/obj/structure/girder/attack_generic(var/mob/user, var/damage, var/attack_message = "smashes apart")
|
||||
if(damage < STRUCTURE_MIN_DAMAGE_THRESHOLD)
|
||||
return 0
|
||||
user.do_attack_animation(src)
|
||||
visible_message("<span class='danger'>[user] [attack_message] the [src]!</span>")
|
||||
spawn(1) dismantle()
|
||||
return 1
|
||||
|
||||
/obj/structure/girder/bullet_act(var/obj/item/projectile/Proj)
|
||||
//Girders only provide partial cover. There's a chance that the projectiles will just pass through. (unless you are trying to shoot the girder)
|
||||
if(Proj.original != src && !prob(cover))
|
||||
return PROJECTILE_CONTINUE //pass through
|
||||
|
||||
var/damage = Proj.get_structure_damage()
|
||||
if(!damage)
|
||||
return
|
||||
|
||||
if(!istype(Proj, /obj/item/projectile/beam))
|
||||
damage *= 0.4 //non beams do reduced damage
|
||||
|
||||
else if(girder_material && girder_material.reflectivity >= 0.5) // Reflect lasers.
|
||||
var/new_damage = damage * girder_material.reflectivity
|
||||
var/outgoing_damage = damage - new_damage
|
||||
damage = round(new_damage)
|
||||
Proj.damage = outgoing_damage
|
||||
|
||||
visible_message("<span class='danger'>\The [src] reflects \the [Proj]!</span>")
|
||||
|
||||
// Find a turf near or on the original location to bounce to
|
||||
var/new_x = Proj.starting.x + pick(0, 0, 0, -1, 1, -2, 2)
|
||||
var/new_y = Proj.starting.y + pick(0, 0, 0, -1, 1, -2, 2)
|
||||
//var/turf/curloc = get_turf(src)
|
||||
var/turf/curloc = get_step(src, get_dir(src, Proj.starting))
|
||||
|
||||
Proj.penetrating += 1 // Needed for the beam to get out of the girder.
|
||||
|
||||
// redirect the projectile
|
||||
Proj.redirect(new_x, new_y, curloc, null)
|
||||
|
||||
health -= damage
|
||||
..()
|
||||
if(health <= 0)
|
||||
dismantle()
|
||||
|
||||
return
|
||||
|
||||
/obj/structure/girder/blob_act()
|
||||
dismantle()
|
||||
|
||||
/obj/structure/girder/proc/reset_girder()
|
||||
name = "[girder_material.display_name] [initial(name)]"
|
||||
anchored = TRUE
|
||||
cover = initial(cover)
|
||||
health = min(max_health - current_damage,max_health)
|
||||
state = 0
|
||||
icon_state = initial(icon_state)
|
||||
reinforcing = 0
|
||||
if(reinf_material)
|
||||
reinforce_girder()
|
||||
|
||||
/obj/structure/girder/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(W.has_tool_quality(TOOL_WRENCH) && state == 0)
|
||||
if(anchored && !reinf_material)
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
to_chat(user, "<span class='notice'>Now disassembling the girder...</span>")
|
||||
if(do_after(user,(35 + round(max_health/50)) * W.toolspeed))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You dissasembled the girder!</span>")
|
||||
dismantle()
|
||||
else if(!anchored)
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
to_chat(user, "<span class='notice'>Now securing the girder...</span>")
|
||||
if(do_after(user, 40 * W.toolspeed, src))
|
||||
to_chat(user, "<span class='notice'>You secured the girder!</span>")
|
||||
reset_girder()
|
||||
|
||||
else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter))
|
||||
to_chat(user, "<span class='notice'>Now slicing apart the girder...</span>")
|
||||
if(do_after(user,30 * W.toolspeed))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You slice apart the girder!</span>")
|
||||
dismantle()
|
||||
|
||||
else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill))
|
||||
to_chat(user, "<span class='notice'>You drill through the girder!</span>")
|
||||
dismantle()
|
||||
|
||||
else if(W.has_tool_quality(TOOL_SCREWDRIVER))
|
||||
if(state == 2)
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
to_chat(user, "<span class='notice'>Now unsecuring support struts...</span>")
|
||||
if(do_after(user,40 * W.toolspeed))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You unsecured the support struts!</span>")
|
||||
state = 1
|
||||
else if(anchored && !reinf_material)
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
reinforcing = !reinforcing
|
||||
to_chat(user, "<span class='notice'>\The [src] can now be [reinforcing? "reinforced" : "constructed"]!</span>")
|
||||
|
||||
else if(W.has_tool_quality(TOOL_WIRECUTTER) && state == 1)
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
to_chat(user, "<span class='notice'>Now removing support struts...</span>")
|
||||
if(do_after(user,40 * W.toolspeed))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You removed the support struts!</span>")
|
||||
reinf_material.place_dismantled_product(get_turf(src))
|
||||
reinf_material = null
|
||||
reset_girder()
|
||||
|
||||
else if(W.has_tool_quality(TOOL_CROWBAR) && state == 0 && anchored)
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
to_chat(user, "<span class='notice'>Now dislodging the girder...</span>")
|
||||
if(do_after(user, 40 * W.toolspeed))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You dislodged the girder!</span>")
|
||||
displace()
|
||||
|
||||
else if(istype(W, /obj/item/stack/material))
|
||||
if(reinforcing && !reinf_material)
|
||||
if(!reinforce_with_material(W, user))
|
||||
return ..()
|
||||
else
|
||||
if(!construct_wall(W, user))
|
||||
return ..()
|
||||
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/girder/take_damage(var/damage)
|
||||
health -= damage
|
||||
if(health <= 0)
|
||||
dismantle()
|
||||
else
|
||||
current_damage = current_damage + damage //Rather than calculate this every time we need to use it, just calculate it here and save it.
|
||||
|
||||
|
||||
/obj/structure/girder/proc/construct_wall(obj/item/stack/material/S, mob/user)
|
||||
var/amount_to_use = reinf_material ? 1 : 2
|
||||
if(S.get_amount() < amount_to_use)
|
||||
to_chat(user, "<span class='notice'>There isn't enough material here to construct a wall.</span>")
|
||||
return 0
|
||||
|
||||
var/datum/material/M = name_to_material[S.default_type]
|
||||
if(!istype(M))
|
||||
return 0
|
||||
|
||||
var/wall_fake
|
||||
add_hiddenprint(usr)
|
||||
|
||||
if(M.integrity < 50)
|
||||
to_chat(user, "<span class='notice'>This material is too soft for use in wall construction.</span>")
|
||||
return 0
|
||||
|
||||
to_chat(user, "<span class='notice'>You begin adding the plating...</span>")
|
||||
|
||||
if(!do_after(user,40) || !S.use(amount_to_use))
|
||||
return 1 //once we've gotten this far don't call parent attackby()
|
||||
|
||||
if(anchored)
|
||||
to_chat(user, "<span class='notice'>You added the plating!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You create a false wall! Push on it to open or close the passage.</span>")
|
||||
wall_fake = 1
|
||||
|
||||
var/turf/Tsrc = get_turf(src)
|
||||
Tsrc.ChangeTurf(wall_type)
|
||||
var/turf/simulated/wall/T = get_turf(src)
|
||||
T.set_material(M, reinf_material, girder_material)
|
||||
if(wall_fake)
|
||||
T.can_open = 1
|
||||
T.add_hiddenprint(usr)
|
||||
qdel(src)
|
||||
return 1
|
||||
|
||||
/obj/structure/girder/proc/reinforce_with_material(obj/item/stack/material/S, mob/user) //if the verb is removed this can be renamed.
|
||||
if(reinf_material)
|
||||
to_chat(user, "<span class='notice'>\The [src] is already reinforced.</span>")
|
||||
return 0
|
||||
|
||||
if(S.get_amount() < 1)
|
||||
to_chat(user, "<span class='notice'>There isn't enough material here to reinforce the girder.</span>")
|
||||
return 0
|
||||
|
||||
var/datum/material/M = name_to_material[S.default_type]
|
||||
if(!istype(M) || M.integrity < 50)
|
||||
to_chat(user, "You cannot reinforce \the [src] with that; it is too soft.")
|
||||
return 0
|
||||
|
||||
to_chat(user, "<span class='notice'>Now reinforcing...</span>")
|
||||
if (!do_after(user,40) || !S.use(1))
|
||||
return 1 //don't call parent attackby() past this point
|
||||
to_chat(user, "<span class='notice'>You added reinforcement!</span>")
|
||||
|
||||
reinf_material = M
|
||||
reinforce_girder()
|
||||
return 1
|
||||
|
||||
/obj/structure/girder/proc/reinforce_girder()
|
||||
cover = reinf_material.hardness
|
||||
health = health + round(reinf_material.integrity/2)
|
||||
state = 2
|
||||
icon_state = "reinforced"
|
||||
reinforcing = 0
|
||||
|
||||
/obj/structure/girder/proc/dismantle()
|
||||
girder_material.place_dismantled_product(get_turf(src))
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/girder/attack_hand(mob/user as mob)
|
||||
if (HULK in user.mutations)
|
||||
visible_message("<span class='danger'>[user] smashes [src] apart!</span>")
|
||||
dismantle()
|
||||
return
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/structure/girder/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
qdel(src)
|
||||
return
|
||||
if(2.0)
|
||||
if (prob(30))
|
||||
dismantle()
|
||||
return
|
||||
if(3.0)
|
||||
if (prob(5))
|
||||
dismantle()
|
||||
return
|
||||
else
|
||||
return
|
||||
|
||||
/obj/structure/girder/cult
|
||||
name = "column"
|
||||
icon= 'icons/obj/cult.dmi'
|
||||
icon_state= "cultgirder"
|
||||
max_health = 250
|
||||
health = 250
|
||||
cover = 70
|
||||
girder_material = "cult"
|
||||
applies_material_colour = 0
|
||||
|
||||
/obj/structure/girder/cult/update_icon()
|
||||
if(anchored)
|
||||
icon_state = "cultgirder"
|
||||
else
|
||||
icon_state = "displaced"
|
||||
|
||||
/obj/structure/girder/cult/dismantle()
|
||||
new /obj/effect/decal/remains/human(get_turf(src))
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/girder/cult/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(W.has_tool_quality(TOOL_WRENCH))
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
to_chat(user, "<span class='notice'>Now disassembling the girder...</span>")
|
||||
if(do_after(user,40 * W.toolspeed))
|
||||
to_chat(user, "<span class='notice'>You dissasembled the girder!</span>")
|
||||
dismantle()
|
||||
|
||||
else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter))
|
||||
to_chat(user, "<span class='notice'>Now slicing apart the girder...</span>")
|
||||
if(do_after(user,30 * W.toolspeed))
|
||||
to_chat(user, "<span class='notice'>You slice apart the girder!</span>")
|
||||
dismantle()
|
||||
|
||||
else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill))
|
||||
to_chat(user, "<span class='notice'>You drill through the girder!</span>")
|
||||
new /obj/effect/decal/remains/human(get_turf(src))
|
||||
dismantle()
|
||||
|
||||
/obj/structure/girder/resin
|
||||
name = "soft girder"
|
||||
icon_state = "girder_resin"
|
||||
max_health = 225
|
||||
health = 225
|
||||
cover = 60
|
||||
girder_material = "resin"
|
||||
|
||||
/obj/structure/girder/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
var/turf/simulated/T = get_turf(src)
|
||||
if(!istype(T) || T.density)
|
||||
return FALSE
|
||||
|
||||
switch(passed_mode)
|
||||
if(RCD_FLOORWALL)
|
||||
// Finishing a wall costs two sheets.
|
||||
var/cost = RCD_SHEETS_PER_MATTER_UNIT * 2
|
||||
// Rwalls cost three to finish.
|
||||
if(the_rcd.make_rwalls)
|
||||
cost += RCD_SHEETS_PER_MATTER_UNIT * 1
|
||||
return list(
|
||||
RCD_VALUE_MODE = RCD_FLOORWALL,
|
||||
RCD_VALUE_DELAY = 2 SECONDS,
|
||||
RCD_VALUE_COST = cost
|
||||
)
|
||||
if(RCD_DECONSTRUCT)
|
||||
return list(
|
||||
RCD_VALUE_MODE = RCD_DECONSTRUCT,
|
||||
RCD_VALUE_DELAY = 2 SECONDS,
|
||||
RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 5
|
||||
)
|
||||
return FALSE
|
||||
|
||||
/obj/structure/girder/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
var/turf/simulated/T = get_turf(src)
|
||||
if(!istype(T) || T.density) // Should stop future bugs of people bringing girders to centcom and RCDing them, or somehow putting a girder on a durasteel wall and deconning it.
|
||||
return FALSE
|
||||
|
||||
switch(passed_mode)
|
||||
if(RCD_FLOORWALL)
|
||||
to_chat(user, span("notice", "You finish a wall."))
|
||||
// This is mostly the same as using on a floor. The girder's material is preserved, however.
|
||||
T.ChangeTurf(wall_type)
|
||||
var/turf/simulated/wall/new_T = get_turf(src) // Ref to the wall we just built.
|
||||
// Apparently set_material(...) for walls requires refs to the material singletons and not strings.
|
||||
// This is different from how other material objects with their own set_material(...) do it, but whatever.
|
||||
var/datum/material/M = name_to_material[the_rcd.material_to_use]
|
||||
new_T.set_material(M, the_rcd.make_rwalls ? M : null, girder_material)
|
||||
new_T.add_hiddenprint(user)
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
if(RCD_DECONSTRUCT)
|
||||
to_chat(user, span("notice", "You deconstruct \the [src]."))
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
/obj/structure/girder/bay
|
||||
wall_type = /turf/simulated/wall/bay
|
||||
|
||||
/obj/structure/girder/eris
|
||||
wall_type = /turf/simulated/wall/eris
|
||||
/obj/structure/girder
|
||||
name = "girder"
|
||||
icon_state = "girder"
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
plane = PLATING_PLANE
|
||||
w_class = ITEMSIZE_HUGE
|
||||
var/state = 0
|
||||
var/health = 200
|
||||
var/max_health = 200
|
||||
var/displaced_health = 50
|
||||
var/current_damage = 0
|
||||
var/cover = 50 //how much cover the girder provides against projectiles.
|
||||
var/default_material = MAT_STEEL
|
||||
var/datum/material/girder_material
|
||||
var/datum/material/reinf_material
|
||||
var/reinforcing = 0
|
||||
var/applies_material_colour = 1
|
||||
var/wall_type = /turf/simulated/wall
|
||||
|
||||
/obj/structure/girder/New(var/newloc, var/material_key)
|
||||
..(newloc)
|
||||
if(!material_key)
|
||||
material_key = default_material
|
||||
set_material(material_key)
|
||||
update_icon()
|
||||
|
||||
/obj/structure/girder/Destroy()
|
||||
if(girder_material.products_need_process())
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
. = ..()
|
||||
|
||||
/obj/structure/girder/process()
|
||||
if(!radiate())
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return
|
||||
|
||||
/obj/structure/girder/proc/radiate()
|
||||
var/total_radiation = girder_material.radioactivity + (reinf_material ? reinf_material.radioactivity / 2 : 0)
|
||||
if(!total_radiation)
|
||||
return
|
||||
|
||||
SSradiation.radiate(src, total_radiation)
|
||||
return total_radiation
|
||||
|
||||
|
||||
/obj/structure/girder/proc/set_material(var/new_material)
|
||||
girder_material = get_material_by_name(new_material)
|
||||
if(!girder_material)
|
||||
qdel(src)
|
||||
name = "[girder_material.display_name] [initial(name)]"
|
||||
max_health = round(girder_material.integrity) //Should be 150 with default integrity (steel). Weaker than ye-olden Girders now.
|
||||
health = max_health
|
||||
displaced_health = round(max_health/4)
|
||||
if(applies_material_colour)
|
||||
color = girder_material.icon_colour
|
||||
if(girder_material.products_need_process()) //Am I radioactive or some other? Process me!
|
||||
START_PROCESSING(SSobj, src)
|
||||
else if(datum_flags & DF_ISPROCESSING) //If I happened to be radioactive or s.o. previously, and am not now, stop processing.
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/structure/girder/get_material()
|
||||
return girder_material
|
||||
|
||||
/obj/structure/girder/update_icon()
|
||||
if(anchored)
|
||||
icon_state = initial(icon_state)
|
||||
else
|
||||
icon_state = "displaced"
|
||||
|
||||
/obj/structure/girder/displaced
|
||||
icon_state = "displaced"
|
||||
anchored = FALSE
|
||||
health = 50
|
||||
cover = 25
|
||||
|
||||
/obj/structure/girder/displaced/New(var/newloc, var/material_key)
|
||||
..(newloc, material_key)
|
||||
displace()
|
||||
|
||||
/obj/structure/girder/proc/displace()
|
||||
name = "displaced [girder_material.display_name] [initial(name)]"
|
||||
icon_state = "displaced"
|
||||
anchored = FALSE
|
||||
health = (displaced_health - round(current_damage / 4))
|
||||
cover = 25
|
||||
|
||||
/obj/structure/girder/attack_generic(var/mob/user, var/damage, var/attack_message = "smashes apart")
|
||||
if(damage < STRUCTURE_MIN_DAMAGE_THRESHOLD)
|
||||
return 0
|
||||
user.do_attack_animation(src)
|
||||
visible_message("<span class='danger'>[user] [attack_message] the [src]!</span>")
|
||||
spawn(1) dismantle()
|
||||
return 1
|
||||
|
||||
/obj/structure/girder/bullet_act(var/obj/item/projectile/Proj)
|
||||
//Girders only provide partial cover. There's a chance that the projectiles will just pass through. (unless you are trying to shoot the girder)
|
||||
if(Proj.original != src && !prob(cover))
|
||||
return PROJECTILE_CONTINUE //pass through
|
||||
|
||||
var/damage = Proj.get_structure_damage()
|
||||
if(!damage)
|
||||
return
|
||||
|
||||
if(!istype(Proj, /obj/item/projectile/beam))
|
||||
damage *= 0.4 //non beams do reduced damage
|
||||
|
||||
else if(girder_material && girder_material.reflectivity >= 0.5) // Reflect lasers.
|
||||
var/new_damage = damage * girder_material.reflectivity
|
||||
var/outgoing_damage = damage - new_damage
|
||||
damage = round(new_damage)
|
||||
Proj.damage = outgoing_damage
|
||||
|
||||
visible_message("<span class='danger'>\The [src] reflects \the [Proj]!</span>")
|
||||
|
||||
// Find a turf near or on the original location to bounce to
|
||||
var/new_x = Proj.starting.x + pick(0, 0, 0, -1, 1, -2, 2)
|
||||
var/new_y = Proj.starting.y + pick(0, 0, 0, -1, 1, -2, 2)
|
||||
//var/turf/curloc = get_turf(src)
|
||||
var/turf/curloc = get_step(src, get_dir(src, Proj.starting))
|
||||
|
||||
Proj.penetrating += 1 // Needed for the beam to get out of the girder.
|
||||
|
||||
// redirect the projectile
|
||||
Proj.redirect(new_x, new_y, curloc, null)
|
||||
|
||||
health -= damage
|
||||
..()
|
||||
if(health <= 0)
|
||||
dismantle()
|
||||
|
||||
return
|
||||
|
||||
/obj/structure/girder/blob_act()
|
||||
dismantle()
|
||||
|
||||
/obj/structure/girder/proc/reset_girder()
|
||||
name = "[girder_material.display_name] [initial(name)]"
|
||||
anchored = TRUE
|
||||
cover = initial(cover)
|
||||
health = min(max_health - current_damage,max_health)
|
||||
state = 0
|
||||
icon_state = initial(icon_state)
|
||||
reinforcing = 0
|
||||
if(reinf_material)
|
||||
reinforce_girder()
|
||||
|
||||
/obj/structure/girder/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(W.has_tool_quality(TOOL_WRENCH) && state == 0)
|
||||
if(anchored && !reinf_material)
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
to_chat(user, "<span class='notice'>Now disassembling the girder...</span>")
|
||||
if(do_after(user,(35 + round(max_health/50)) * W.toolspeed))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You dissasembled the girder!</span>")
|
||||
dismantle()
|
||||
else if(!anchored)
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
to_chat(user, "<span class='notice'>Now securing the girder...</span>")
|
||||
if(do_after(user, 40 * W.toolspeed, src))
|
||||
to_chat(user, "<span class='notice'>You secured the girder!</span>")
|
||||
reset_girder()
|
||||
|
||||
else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter))
|
||||
to_chat(user, "<span class='notice'>Now slicing apart the girder...</span>")
|
||||
if(do_after(user,30 * W.toolspeed))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You slice apart the girder!</span>")
|
||||
dismantle()
|
||||
|
||||
else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill))
|
||||
to_chat(user, "<span class='notice'>You drill through the girder!</span>")
|
||||
dismantle()
|
||||
|
||||
else if(W.has_tool_quality(TOOL_SCREWDRIVER))
|
||||
if(state == 2)
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
to_chat(user, "<span class='notice'>Now unsecuring support struts...</span>")
|
||||
if(do_after(user,40 * W.toolspeed))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You unsecured the support struts!</span>")
|
||||
state = 1
|
||||
else if(anchored && !reinf_material)
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
reinforcing = !reinforcing
|
||||
to_chat(user, "<span class='notice'>\The [src] can now be [reinforcing? "reinforced" : "constructed"]!</span>")
|
||||
|
||||
else if(W.has_tool_quality(TOOL_WIRECUTTER) && state == 1)
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
to_chat(user, "<span class='notice'>Now removing support struts...</span>")
|
||||
if(do_after(user,40 * W.toolspeed))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You removed the support struts!</span>")
|
||||
reinf_material.place_dismantled_product(get_turf(src))
|
||||
reinf_material = null
|
||||
reset_girder()
|
||||
|
||||
else if(W.has_tool_quality(TOOL_CROWBAR) && state == 0 && anchored)
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
to_chat(user, "<span class='notice'>Now dislodging the girder...</span>")
|
||||
if(do_after(user, 40 * W.toolspeed))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You dislodged the girder!</span>")
|
||||
displace()
|
||||
|
||||
else if(istype(W, /obj/item/stack/material))
|
||||
if(reinforcing && !reinf_material)
|
||||
if(!reinforce_with_material(W, user))
|
||||
return ..()
|
||||
else
|
||||
if(!construct_wall(W, user))
|
||||
return ..()
|
||||
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/girder/take_damage(var/damage)
|
||||
health -= damage
|
||||
if(health <= 0)
|
||||
dismantle()
|
||||
else
|
||||
current_damage = current_damage + damage //Rather than calculate this every time we need to use it, just calculate it here and save it.
|
||||
|
||||
|
||||
/obj/structure/girder/proc/construct_wall(obj/item/stack/material/S, mob/user)
|
||||
var/amount_to_use = reinf_material ? 1 : 2
|
||||
if(S.get_amount() < amount_to_use)
|
||||
to_chat(user, "<span class='notice'>There isn't enough material here to construct a wall.</span>")
|
||||
return 0
|
||||
|
||||
var/datum/material/M = name_to_material[S.default_type]
|
||||
if(!istype(M))
|
||||
return 0
|
||||
|
||||
var/wall_fake
|
||||
add_hiddenprint(usr)
|
||||
|
||||
if(M.integrity < 50)
|
||||
to_chat(user, "<span class='notice'>This material is too soft for use in wall construction.</span>")
|
||||
return 0
|
||||
|
||||
to_chat(user, "<span class='notice'>You begin adding the plating...</span>")
|
||||
|
||||
if(!do_after(user,40) || !S.use(amount_to_use))
|
||||
return 1 //once we've gotten this far don't call parent attackby()
|
||||
|
||||
if(anchored)
|
||||
to_chat(user, "<span class='notice'>You added the plating!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You create a false wall! Push on it to open or close the passage.</span>")
|
||||
wall_fake = 1
|
||||
|
||||
var/turf/Tsrc = get_turf(src)
|
||||
Tsrc.ChangeTurf(wall_type)
|
||||
var/turf/simulated/wall/T = get_turf(src)
|
||||
T.set_material(M, reinf_material, girder_material)
|
||||
if(wall_fake)
|
||||
T.can_open = 1
|
||||
T.add_hiddenprint(usr)
|
||||
qdel(src)
|
||||
return 1
|
||||
|
||||
/obj/structure/girder/proc/reinforce_with_material(obj/item/stack/material/S, mob/user) //if the verb is removed this can be renamed.
|
||||
if(reinf_material)
|
||||
to_chat(user, "<span class='notice'>\The [src] is already reinforced.</span>")
|
||||
return 0
|
||||
|
||||
if(S.get_amount() < 1)
|
||||
to_chat(user, "<span class='notice'>There isn't enough material here to reinforce the girder.</span>")
|
||||
return 0
|
||||
|
||||
var/datum/material/M = name_to_material[S.default_type]
|
||||
if(!istype(M) || M.integrity < 50)
|
||||
to_chat(user, "You cannot reinforce \the [src] with that; it is too soft.")
|
||||
return 0
|
||||
|
||||
to_chat(user, "<span class='notice'>Now reinforcing...</span>")
|
||||
if (!do_after(user,40) || !S.use(1))
|
||||
return 1 //don't call parent attackby() past this point
|
||||
to_chat(user, "<span class='notice'>You added reinforcement!</span>")
|
||||
|
||||
reinf_material = M
|
||||
reinforce_girder()
|
||||
return 1
|
||||
|
||||
/obj/structure/girder/proc/reinforce_girder()
|
||||
cover = reinf_material.hardness
|
||||
health = health + round(reinf_material.integrity/2)
|
||||
state = 2
|
||||
icon_state = "reinforced"
|
||||
reinforcing = 0
|
||||
|
||||
/obj/structure/girder/proc/dismantle()
|
||||
girder_material.place_dismantled_product(get_turf(src))
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/girder/attack_hand(mob/user as mob)
|
||||
if (HULK in user.mutations)
|
||||
visible_message("<span class='danger'>[user] smashes [src] apart!</span>")
|
||||
dismantle()
|
||||
return
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/structure/girder/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
qdel(src)
|
||||
return
|
||||
if(2.0)
|
||||
if (prob(30))
|
||||
dismantle()
|
||||
return
|
||||
if(3.0)
|
||||
if (prob(5))
|
||||
dismantle()
|
||||
return
|
||||
else
|
||||
return
|
||||
|
||||
/obj/structure/girder/cult
|
||||
name = "column"
|
||||
icon= 'icons/obj/cult.dmi'
|
||||
icon_state= "cultgirder"
|
||||
max_health = 250
|
||||
health = 250
|
||||
cover = 70
|
||||
girder_material = "cult"
|
||||
applies_material_colour = 0
|
||||
|
||||
/obj/structure/girder/cult/update_icon()
|
||||
if(anchored)
|
||||
icon_state = "cultgirder"
|
||||
else
|
||||
icon_state = "displaced"
|
||||
|
||||
/obj/structure/girder/cult/dismantle()
|
||||
new /obj/effect/decal/remains/human(get_turf(src))
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/girder/cult/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(W.has_tool_quality(TOOL_WRENCH))
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
to_chat(user, "<span class='notice'>Now disassembling the girder...</span>")
|
||||
if(do_after(user,40 * W.toolspeed))
|
||||
to_chat(user, "<span class='notice'>You dissasembled the girder!</span>")
|
||||
dismantle()
|
||||
|
||||
else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter))
|
||||
to_chat(user, "<span class='notice'>Now slicing apart the girder...</span>")
|
||||
if(do_after(user,30 * W.toolspeed))
|
||||
to_chat(user, "<span class='notice'>You slice apart the girder!</span>")
|
||||
dismantle()
|
||||
|
||||
else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill))
|
||||
to_chat(user, "<span class='notice'>You drill through the girder!</span>")
|
||||
new /obj/effect/decal/remains/human(get_turf(src))
|
||||
dismantle()
|
||||
|
||||
/obj/structure/girder/resin
|
||||
name = "soft girder"
|
||||
icon_state = "girder_resin"
|
||||
max_health = 225
|
||||
health = 225
|
||||
cover = 60
|
||||
girder_material = "resin"
|
||||
|
||||
/obj/structure/girder/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
var/turf/simulated/T = get_turf(src)
|
||||
if(!istype(T) || T.density)
|
||||
return FALSE
|
||||
|
||||
switch(passed_mode)
|
||||
if(RCD_FLOORWALL)
|
||||
// Finishing a wall costs two sheets.
|
||||
var/cost = RCD_SHEETS_PER_MATTER_UNIT * 2
|
||||
// Rwalls cost three to finish.
|
||||
if(the_rcd.make_rwalls)
|
||||
cost += RCD_SHEETS_PER_MATTER_UNIT * 1
|
||||
return list(
|
||||
RCD_VALUE_MODE = RCD_FLOORWALL,
|
||||
RCD_VALUE_DELAY = 2 SECONDS,
|
||||
RCD_VALUE_COST = cost
|
||||
)
|
||||
if(RCD_DECONSTRUCT)
|
||||
return list(
|
||||
RCD_VALUE_MODE = RCD_DECONSTRUCT,
|
||||
RCD_VALUE_DELAY = 2 SECONDS,
|
||||
RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 5
|
||||
)
|
||||
return FALSE
|
||||
|
||||
/obj/structure/girder/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
var/turf/simulated/T = get_turf(src)
|
||||
if(!istype(T) || T.density) // Should stop future bugs of people bringing girders to centcom and RCDing them, or somehow putting a girder on a durasteel wall and deconning it.
|
||||
return FALSE
|
||||
|
||||
switch(passed_mode)
|
||||
if(RCD_FLOORWALL)
|
||||
to_chat(user, span("notice", "You finish a wall."))
|
||||
// This is mostly the same as using on a floor. The girder's material is preserved, however.
|
||||
T.ChangeTurf(wall_type)
|
||||
var/turf/simulated/wall/new_T = get_turf(src) // Ref to the wall we just built.
|
||||
// Apparently set_material(...) for walls requires refs to the material singletons and not strings.
|
||||
// This is different from how other material objects with their own set_material(...) do it, but whatever.
|
||||
var/datum/material/M = name_to_material[the_rcd.material_to_use]
|
||||
new_T.set_material(M, the_rcd.make_rwalls ? M : null, girder_material)
|
||||
new_T.add_hiddenprint(user)
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
if(RCD_DECONSTRUCT)
|
||||
to_chat(user, span("notice", "You deconstruct \the [src]."))
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
/obj/structure/girder/bay
|
||||
wall_type = /turf/simulated/wall/bay
|
||||
|
||||
/obj/structure/girder/eris
|
||||
wall_type = /turf/simulated/wall/eris
|
||||
|
||||
@@ -1,289 +1,289 @@
|
||||
/obj/structure/grille
|
||||
name = "grille"
|
||||
desc = "A flimsy lattice of metal rods, with screws to secure it to the floor."
|
||||
icon = 'icons/obj/structures_vr.dmi' // VOREStation Edit - New icons
|
||||
icon_state = "grille"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
pressure_resistance = 5*ONE_ATMOSPHERE
|
||||
layer = TABLE_LAYER
|
||||
explosion_resistance = 1
|
||||
var/health = 10
|
||||
var/destroyed = 0
|
||||
|
||||
|
||||
/obj/structure/grille/ex_act(severity)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/grille/update_icon()
|
||||
if(destroyed)
|
||||
icon_state = "[initial(icon_state)]-b"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
/obj/structure/grille/Bumped(atom/user)
|
||||
if(ismob(user)) shock(user, 70)
|
||||
|
||||
/obj/structure/grille/attack_hand(mob/user as mob)
|
||||
|
||||
user.setClickCooldown(user.get_attack_speed())
|
||||
playsound(src, 'sound/effects/grillehit.ogg', 80, 1)
|
||||
user.do_attack_animation(src)
|
||||
|
||||
var/damage_dealt = 1
|
||||
var/attack_message = "kicks"
|
||||
if(istype(user,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.species.can_shred(H))
|
||||
attack_message = "mangles"
|
||||
damage_dealt = 5
|
||||
|
||||
if(shock(user, 70))
|
||||
return
|
||||
|
||||
if(HULK in user.mutations)
|
||||
damage_dealt += 5
|
||||
else
|
||||
damage_dealt += 1
|
||||
|
||||
attack_generic(user,damage_dealt,attack_message)
|
||||
|
||||
/obj/structure/grille/CanPass(atom/movable/mover, turf/target)
|
||||
if(istype(mover) && mover.checkpass(PASSGRILLE))
|
||||
return TRUE
|
||||
if(istype(mover, /obj/item/projectile))
|
||||
return prob(30)
|
||||
return !density
|
||||
|
||||
/obj/structure/grille/bullet_act(var/obj/item/projectile/Proj)
|
||||
if(!Proj) return
|
||||
|
||||
//Flimsy grilles aren't so great at stopping projectiles. However they can absorb some of the impact
|
||||
var/damage = Proj.get_structure_damage()
|
||||
var/passthrough = 0
|
||||
|
||||
if(!damage) return
|
||||
|
||||
//20% chance that the grille provides a bit more cover than usual. Support structure for example might take up 20% of the grille's area.
|
||||
//If they click on the grille itself then we assume they are aiming at the grille itself and the extra cover behaviour is always used.
|
||||
switch(Proj.damage_type)
|
||||
if(BRUTE)
|
||||
//bullets
|
||||
if(Proj.original == src || prob(20))
|
||||
Proj.damage *= between(0, Proj.damage/60, 0.5)
|
||||
if(prob(max((damage-10)/25, 0))*100)
|
||||
passthrough = 1
|
||||
else
|
||||
Proj.damage *= between(0, Proj.damage/60, 1)
|
||||
passthrough = 1
|
||||
if(BURN)
|
||||
//beams and other projectiles are either blocked completely by grilles or stop half the damage.
|
||||
if(!(Proj.original == src || prob(20)))
|
||||
Proj.damage *= 0.5
|
||||
passthrough = 1
|
||||
|
||||
if(passthrough)
|
||||
. = PROJECTILE_CONTINUE
|
||||
damage = between(0, (damage - Proj.damage)*(Proj.damage_type == BRUTE? 0.4 : 1), 10) //if the bullet passes through then the grille avoids most of the damage
|
||||
|
||||
src.health -= damage*0.2
|
||||
spawn(0) healthcheck() //spawn to make sure we return properly if the grille is deleted
|
||||
|
||||
/obj/structure/grille/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(!istype(W))
|
||||
return
|
||||
if(istype(W, /obj/item/weapon/rcd)) // To stop us from hitting the grille when building windows, because grilles don't let parent handle it properly.
|
||||
return FALSE
|
||||
else if(W.has_tool_quality(TOOL_WIRECUTTER))
|
||||
if(!shock(user, 100))
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
new /obj/item/stack/rods(get_turf(src), destroyed ? 1 : 2)
|
||||
qdel(src)
|
||||
else if((W.has_tool_quality(TOOL_SCREWDRIVER)) && (istype(loc, /turf/simulated) || anchored))
|
||||
if(!shock(user, 90))
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
anchored = !anchored
|
||||
user.visible_message("<span class='notice'>[user] [anchored ? "fastens" : "unfastens"] the grille.</span>", \
|
||||
"<span class='notice'>You have [anchored ? "fastened the grille to" : "unfastened the grille from"] the floor.</span>")
|
||||
return
|
||||
|
||||
//window placing begin //TODO CONVERT PROPERLY TO MATERIAL DATUM
|
||||
else if(istype(W,/obj/item/stack/material))
|
||||
var/obj/item/stack/material/ST = W
|
||||
if(!ST.material.created_window)
|
||||
return 0
|
||||
|
||||
var/dir_to_set = 1
|
||||
if(loc == user.loc)
|
||||
dir_to_set = user.dir
|
||||
else
|
||||
if( ( x == user.x ) || (y == user.y) ) //Only supposed to work for cardinal directions.
|
||||
if( x == user.x )
|
||||
if( y > user.y )
|
||||
dir_to_set = 2
|
||||
else
|
||||
dir_to_set = 1
|
||||
else if( y == user.y )
|
||||
if( x > user.x )
|
||||
dir_to_set = 8
|
||||
else
|
||||
dir_to_set = 4
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You can't reach.</span>")
|
||||
return //Only works for cardinal direcitons, diagonals aren't supposed to work like this.
|
||||
for(var/obj/structure/window/WINDOW in loc)
|
||||
if(WINDOW.dir == dir_to_set)
|
||||
to_chat(user, "<span class='notice'>There is already a window facing this way there.</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You start placing the window.</span>")
|
||||
if(do_after(user,20))
|
||||
for(var/obj/structure/window/WINDOW in loc)
|
||||
if(WINDOW.dir == dir_to_set)//checking this for a 2nd time to check if a window was made while we were waiting.
|
||||
to_chat(user, "<span class='notice'>There is already a window facing this way there.</span>")
|
||||
return
|
||||
|
||||
var/wtype = ST.material.created_window
|
||||
if (ST.use(1))
|
||||
var/obj/structure/window/WD = new wtype(loc, dir_to_set, 1)
|
||||
to_chat(user, "<span class='notice'>You place the [WD] on [src].</span>")
|
||||
WD.update_icon()
|
||||
return
|
||||
//window placing end
|
||||
|
||||
else if((W.flags & NOCONDUCT) || !shock(user, 70))
|
||||
user.setClickCooldown(user.get_attack_speed(W))
|
||||
user.do_attack_animation(src)
|
||||
playsound(src, 'sound/effects/grillehit.ogg', 80, 1)
|
||||
switch(W.damtype)
|
||||
if("fire")
|
||||
health -= W.force
|
||||
if("brute")
|
||||
health -= W.force * 0.1
|
||||
healthcheck()
|
||||
..()
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/grille/proc/healthcheck()
|
||||
if(health <= 0)
|
||||
if(!destroyed)
|
||||
density = FALSE
|
||||
destroyed = 1
|
||||
update_icon()
|
||||
new /obj/item/stack/rods(get_turf(src))
|
||||
|
||||
else
|
||||
if(health <= -6)
|
||||
new /obj/item/stack/rods(get_turf(src))
|
||||
qdel(src)
|
||||
return
|
||||
return
|
||||
|
||||
// shock user with probability prb (if all connections & power are working)
|
||||
// returns 1 if shocked, 0 otherwise
|
||||
|
||||
/obj/structure/grille/proc/shock(mob/user as mob, prb)
|
||||
|
||||
if(!anchored || destroyed) // anchored/destroyed grilles are never connected
|
||||
return 0
|
||||
if(!prob(prb))
|
||||
return 0
|
||||
if(!in_range(src, user))//To prevent TK and mech users from getting shocked
|
||||
return 0
|
||||
var/turf/T = get_turf(src)
|
||||
var/obj/structure/cable/C = T.get_cable_node()
|
||||
if(C)
|
||||
if(electrocute_mob(user, C, src))
|
||||
if(C.powernet)
|
||||
C.powernet.trigger_warning()
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
if(user.stunned)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
return 0
|
||||
|
||||
/obj/structure/grille/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
if(!destroyed)
|
||||
if(exposed_temperature > T0C + 1500)
|
||||
health -= 1
|
||||
healthcheck()
|
||||
..()
|
||||
|
||||
/obj/structure/grille/attack_generic(var/mob/user, var/damage, var/attack_verb)
|
||||
visible_message("<span class='danger'>[user] [attack_verb] the [src]!</span>")
|
||||
user.do_attack_animation(src)
|
||||
health -= damage
|
||||
spawn(1) healthcheck()
|
||||
return 1
|
||||
|
||||
// Used in mapping to avoid
|
||||
/obj/structure/grille/broken
|
||||
destroyed = 1
|
||||
icon_state = "grille-b"
|
||||
density = FALSE
|
||||
|
||||
/obj/structure/grille/broken/New()
|
||||
..()
|
||||
health = rand(-5, -1) //In the destroyed but not utterly threshold.
|
||||
healthcheck() //Send this to healthcheck just in case we want to do something else with it.
|
||||
|
||||
/obj/structure/grille/cult
|
||||
name = "cult grille"
|
||||
desc = "A matrice built out of an unknown material, with some sort of force field blocking air around it."
|
||||
icon_state = "grillecult"
|
||||
health = 40 // Make it strong enough to avoid people breaking in too easily.
|
||||
can_atmos_pass = ATMOS_PASS_NO // Make sure air doesn't drain.
|
||||
|
||||
/obj/structure/grille/broken/cult
|
||||
icon_state = "grillecult-b"
|
||||
|
||||
/obj/structure/grille/rustic
|
||||
name = "rustic grille"
|
||||
desc = "A lattice of metal, arranged in an old, rustic fashion."
|
||||
icon_state = "grillerustic"
|
||||
|
||||
/obj/structure/grille/broken/rustic
|
||||
icon_state = "grillerustic-b"
|
||||
|
||||
|
||||
/obj/structure/grille/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
switch(passed_mode)
|
||||
if(RCD_WINDOWGRILLE)
|
||||
// A full tile window costs 4 glass sheets.
|
||||
return list(
|
||||
RCD_VALUE_MODE = RCD_WINDOWGRILLE,
|
||||
RCD_VALUE_DELAY = 2 SECONDS,
|
||||
RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 4
|
||||
)
|
||||
|
||||
if(RCD_DECONSTRUCT)
|
||||
return list(
|
||||
RCD_VALUE_MODE = RCD_DECONSTRUCT,
|
||||
RCD_VALUE_DELAY = 2 SECONDS,
|
||||
RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 2
|
||||
)
|
||||
return FALSE
|
||||
|
||||
/obj/structure/grille/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
switch(passed_mode)
|
||||
if(RCD_DECONSTRUCT)
|
||||
to_chat(user, span("notice", "You deconstruct \the [src]."))
|
||||
qdel(src)
|
||||
return TRUE
|
||||
if(RCD_WINDOWGRILLE)
|
||||
if(locate(/obj/structure/window) in loc)
|
||||
return FALSE
|
||||
to_chat(user, span("notice", "You construct a window."))
|
||||
var/obj/structure/window/WD = new the_rcd.window_type(loc)
|
||||
WD.anchored = TRUE
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/structure/grille/take_damage(var/damage)
|
||||
health -= damage
|
||||
spawn(1) healthcheck()
|
||||
return 1
|
||||
|
||||
/obj/structure/grille
|
||||
name = "grille"
|
||||
desc = "A flimsy lattice of metal rods, with screws to secure it to the floor."
|
||||
icon = 'icons/obj/structures_vr.dmi' // VOREStation Edit - New icons
|
||||
icon_state = "grille"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
pressure_resistance = 5*ONE_ATMOSPHERE
|
||||
layer = TABLE_LAYER
|
||||
explosion_resistance = 1
|
||||
var/health = 10
|
||||
var/destroyed = 0
|
||||
|
||||
|
||||
/obj/structure/grille/ex_act(severity)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/grille/update_icon()
|
||||
if(destroyed)
|
||||
icon_state = "[initial(icon_state)]-b"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
/obj/structure/grille/Bumped(atom/user)
|
||||
if(ismob(user)) shock(user, 70)
|
||||
|
||||
/obj/structure/grille/attack_hand(mob/user as mob)
|
||||
|
||||
user.setClickCooldown(user.get_attack_speed())
|
||||
playsound(src, 'sound/effects/grillehit.ogg', 80, 1)
|
||||
user.do_attack_animation(src)
|
||||
|
||||
var/damage_dealt = 1
|
||||
var/attack_message = "kicks"
|
||||
if(istype(user,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.species.can_shred(H))
|
||||
attack_message = "mangles"
|
||||
damage_dealt = 5
|
||||
|
||||
if(shock(user, 70))
|
||||
return
|
||||
|
||||
if(HULK in user.mutations)
|
||||
damage_dealt += 5
|
||||
else
|
||||
damage_dealt += 1
|
||||
|
||||
attack_generic(user,damage_dealt,attack_message)
|
||||
|
||||
/obj/structure/grille/CanPass(atom/movable/mover, turf/target)
|
||||
if(istype(mover) && mover.checkpass(PASSGRILLE))
|
||||
return TRUE
|
||||
if(istype(mover, /obj/item/projectile))
|
||||
return prob(30)
|
||||
return !density
|
||||
|
||||
/obj/structure/grille/bullet_act(var/obj/item/projectile/Proj)
|
||||
if(!Proj) return
|
||||
|
||||
//Flimsy grilles aren't so great at stopping projectiles. However they can absorb some of the impact
|
||||
var/damage = Proj.get_structure_damage()
|
||||
var/passthrough = 0
|
||||
|
||||
if(!damage) return
|
||||
|
||||
//20% chance that the grille provides a bit more cover than usual. Support structure for example might take up 20% of the grille's area.
|
||||
//If they click on the grille itself then we assume they are aiming at the grille itself and the extra cover behaviour is always used.
|
||||
switch(Proj.damage_type)
|
||||
if(BRUTE)
|
||||
//bullets
|
||||
if(Proj.original == src || prob(20))
|
||||
Proj.damage *= between(0, Proj.damage/60, 0.5)
|
||||
if(prob(max((damage-10)/25, 0))*100)
|
||||
passthrough = 1
|
||||
else
|
||||
Proj.damage *= between(0, Proj.damage/60, 1)
|
||||
passthrough = 1
|
||||
if(BURN)
|
||||
//beams and other projectiles are either blocked completely by grilles or stop half the damage.
|
||||
if(!(Proj.original == src || prob(20)))
|
||||
Proj.damage *= 0.5
|
||||
passthrough = 1
|
||||
|
||||
if(passthrough)
|
||||
. = PROJECTILE_CONTINUE
|
||||
damage = between(0, (damage - Proj.damage)*(Proj.damage_type == BRUTE? 0.4 : 1), 10) //if the bullet passes through then the grille avoids most of the damage
|
||||
|
||||
src.health -= damage*0.2
|
||||
spawn(0) healthcheck() //spawn to make sure we return properly if the grille is deleted
|
||||
|
||||
/obj/structure/grille/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(!istype(W))
|
||||
return
|
||||
if(istype(W, /obj/item/weapon/rcd)) // To stop us from hitting the grille when building windows, because grilles don't let parent handle it properly.
|
||||
return FALSE
|
||||
else if(W.has_tool_quality(TOOL_WIRECUTTER))
|
||||
if(!shock(user, 100))
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
new /obj/item/stack/rods(get_turf(src), destroyed ? 1 : 2)
|
||||
qdel(src)
|
||||
else if((W.has_tool_quality(TOOL_SCREWDRIVER)) && (istype(loc, /turf/simulated) || anchored))
|
||||
if(!shock(user, 90))
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
anchored = !anchored
|
||||
user.visible_message("<span class='notice'>[user] [anchored ? "fastens" : "unfastens"] the grille.</span>", \
|
||||
"<span class='notice'>You have [anchored ? "fastened the grille to" : "unfastened the grille from"] the floor.</span>")
|
||||
return
|
||||
|
||||
//window placing begin //TODO CONVERT PROPERLY TO MATERIAL DATUM
|
||||
else if(istype(W,/obj/item/stack/material))
|
||||
var/obj/item/stack/material/ST = W
|
||||
if(!ST.material.created_window)
|
||||
return 0
|
||||
|
||||
var/dir_to_set = 1
|
||||
if(loc == user.loc)
|
||||
dir_to_set = user.dir
|
||||
else
|
||||
if( ( x == user.x ) || (y == user.y) ) //Only supposed to work for cardinal directions.
|
||||
if( x == user.x )
|
||||
if( y > user.y )
|
||||
dir_to_set = 2
|
||||
else
|
||||
dir_to_set = 1
|
||||
else if( y == user.y )
|
||||
if( x > user.x )
|
||||
dir_to_set = 8
|
||||
else
|
||||
dir_to_set = 4
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You can't reach.</span>")
|
||||
return //Only works for cardinal direcitons, diagonals aren't supposed to work like this.
|
||||
for(var/obj/structure/window/WINDOW in loc)
|
||||
if(WINDOW.dir == dir_to_set)
|
||||
to_chat(user, "<span class='notice'>There is already a window facing this way there.</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You start placing the window.</span>")
|
||||
if(do_after(user,20))
|
||||
for(var/obj/structure/window/WINDOW in loc)
|
||||
if(WINDOW.dir == dir_to_set)//checking this for a 2nd time to check if a window was made while we were waiting.
|
||||
to_chat(user, "<span class='notice'>There is already a window facing this way there.</span>")
|
||||
return
|
||||
|
||||
var/wtype = ST.material.created_window
|
||||
if (ST.use(1))
|
||||
var/obj/structure/window/WD = new wtype(loc, dir_to_set, 1)
|
||||
to_chat(user, "<span class='notice'>You place the [WD] on [src].</span>")
|
||||
WD.update_icon()
|
||||
return
|
||||
//window placing end
|
||||
|
||||
else if((W.flags & NOCONDUCT) || !shock(user, 70))
|
||||
user.setClickCooldown(user.get_attack_speed(W))
|
||||
user.do_attack_animation(src)
|
||||
playsound(src, 'sound/effects/grillehit.ogg', 80, 1)
|
||||
switch(W.damtype)
|
||||
if("fire")
|
||||
health -= W.force
|
||||
if("brute")
|
||||
health -= W.force * 0.1
|
||||
healthcheck()
|
||||
..()
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/grille/proc/healthcheck()
|
||||
if(health <= 0)
|
||||
if(!destroyed)
|
||||
density = FALSE
|
||||
destroyed = 1
|
||||
update_icon()
|
||||
new /obj/item/stack/rods(get_turf(src))
|
||||
|
||||
else
|
||||
if(health <= -6)
|
||||
new /obj/item/stack/rods(get_turf(src))
|
||||
qdel(src)
|
||||
return
|
||||
return
|
||||
|
||||
// shock user with probability prb (if all connections & power are working)
|
||||
// returns 1 if shocked, 0 otherwise
|
||||
|
||||
/obj/structure/grille/proc/shock(mob/user as mob, prb)
|
||||
|
||||
if(!anchored || destroyed) // anchored/destroyed grilles are never connected
|
||||
return 0
|
||||
if(!prob(prb))
|
||||
return 0
|
||||
if(!in_range(src, user))//To prevent TK and mech users from getting shocked
|
||||
return 0
|
||||
var/turf/T = get_turf(src)
|
||||
var/obj/structure/cable/C = T.get_cable_node()
|
||||
if(C)
|
||||
if(electrocute_mob(user, C, src))
|
||||
if(C.powernet)
|
||||
C.powernet.trigger_warning()
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
if(user.stunned)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
return 0
|
||||
|
||||
/obj/structure/grille/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
if(!destroyed)
|
||||
if(exposed_temperature > T0C + 1500)
|
||||
health -= 1
|
||||
healthcheck()
|
||||
..()
|
||||
|
||||
/obj/structure/grille/attack_generic(var/mob/user, var/damage, var/attack_verb)
|
||||
visible_message("<span class='danger'>[user] [attack_verb] the [src]!</span>")
|
||||
user.do_attack_animation(src)
|
||||
health -= damage
|
||||
spawn(1) healthcheck()
|
||||
return 1
|
||||
|
||||
// Used in mapping to avoid
|
||||
/obj/structure/grille/broken
|
||||
destroyed = 1
|
||||
icon_state = "grille-b"
|
||||
density = FALSE
|
||||
|
||||
/obj/structure/grille/broken/New()
|
||||
..()
|
||||
health = rand(-5, -1) //In the destroyed but not utterly threshold.
|
||||
healthcheck() //Send this to healthcheck just in case we want to do something else with it.
|
||||
|
||||
/obj/structure/grille/cult
|
||||
name = "cult grille"
|
||||
desc = "A matrice built out of an unknown material, with some sort of force field blocking air around it."
|
||||
icon_state = "grillecult"
|
||||
health = 40 // Make it strong enough to avoid people breaking in too easily.
|
||||
can_atmos_pass = ATMOS_PASS_NO // Make sure air doesn't drain.
|
||||
|
||||
/obj/structure/grille/broken/cult
|
||||
icon_state = "grillecult-b"
|
||||
|
||||
/obj/structure/grille/rustic
|
||||
name = "rustic grille"
|
||||
desc = "A lattice of metal, arranged in an old, rustic fashion."
|
||||
icon_state = "grillerustic"
|
||||
|
||||
/obj/structure/grille/broken/rustic
|
||||
icon_state = "grillerustic-b"
|
||||
|
||||
|
||||
/obj/structure/grille/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
switch(passed_mode)
|
||||
if(RCD_WINDOWGRILLE)
|
||||
// A full tile window costs 4 glass sheets.
|
||||
return list(
|
||||
RCD_VALUE_MODE = RCD_WINDOWGRILLE,
|
||||
RCD_VALUE_DELAY = 2 SECONDS,
|
||||
RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 4
|
||||
)
|
||||
|
||||
if(RCD_DECONSTRUCT)
|
||||
return list(
|
||||
RCD_VALUE_MODE = RCD_DECONSTRUCT,
|
||||
RCD_VALUE_DELAY = 2 SECONDS,
|
||||
RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 2
|
||||
)
|
||||
return FALSE
|
||||
|
||||
/obj/structure/grille/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
switch(passed_mode)
|
||||
if(RCD_DECONSTRUCT)
|
||||
to_chat(user, span("notice", "You deconstruct \the [src]."))
|
||||
qdel(src)
|
||||
return TRUE
|
||||
if(RCD_WINDOWGRILLE)
|
||||
if(locate(/obj/structure/window) in loc)
|
||||
return FALSE
|
||||
to_chat(user, span("notice", "You construct a window."))
|
||||
var/obj/structure/window/WD = new the_rcd.window_type(loc)
|
||||
WD.anchored = TRUE
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/structure/grille/take_damage(var/damage)
|
||||
health -= damage
|
||||
spawn(1) healthcheck()
|
||||
return 1
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,42 +1,42 @@
|
||||
/obj/structure/foodcart
|
||||
name = "Foodcart"
|
||||
icon = 'icons/obj/kitchen_vr.dmi'
|
||||
icon_state = "foodcart-0"
|
||||
desc = "The ultimate in food transport! When opened you notice two compartments with odd blue glows to them. One feels very warm, while the other is very cold."
|
||||
anchored = FALSE
|
||||
opacity = 0
|
||||
density = TRUE
|
||||
|
||||
/obj/structure/foodcart/Initialize()
|
||||
. = ..()
|
||||
for(var/obj/item/I in loc)
|
||||
if(istype(I, /obj/item/weapon/reagent_containers/food))
|
||||
I.loc = src
|
||||
update_icon()
|
||||
|
||||
/obj/structure/foodcart/attackby(obj/item/O as obj, mob/user as mob)
|
||||
if(istype(O, /obj/item/weapon/reagent_containers/food))
|
||||
user.drop_item()
|
||||
O.loc = src
|
||||
update_icon()
|
||||
else
|
||||
return
|
||||
|
||||
/obj/structure/foodcart/attack_hand(var/mob/user as mob)
|
||||
if(contents.len)
|
||||
var/obj/item/weapon/reagent_containers/food/choice = tgui_input_list(usr, "What would you like to grab from the cart?", "Grab Choice", contents)
|
||||
if(choice)
|
||||
if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
|
||||
return
|
||||
if(ishuman(user))
|
||||
if(!user.get_active_hand())
|
||||
user.put_in_hands(choice)
|
||||
else
|
||||
choice.loc = get_turf(src)
|
||||
update_icon()
|
||||
|
||||
/obj/structure/foodcart/update_icon()
|
||||
if(contents.len < 5)
|
||||
icon_state = "foodcart-[contents.len]"
|
||||
else
|
||||
/obj/structure/foodcart
|
||||
name = "Foodcart"
|
||||
icon = 'icons/obj/kitchen_vr.dmi'
|
||||
icon_state = "foodcart-0"
|
||||
desc = "The ultimate in food transport! When opened you notice two compartments with odd blue glows to them. One feels very warm, while the other is very cold."
|
||||
anchored = FALSE
|
||||
opacity = 0
|
||||
density = TRUE
|
||||
|
||||
/obj/structure/foodcart/Initialize()
|
||||
. = ..()
|
||||
for(var/obj/item/I in loc)
|
||||
if(istype(I, /obj/item/weapon/reagent_containers/food))
|
||||
I.loc = src
|
||||
update_icon()
|
||||
|
||||
/obj/structure/foodcart/attackby(obj/item/O as obj, mob/user as mob)
|
||||
if(istype(O, /obj/item/weapon/reagent_containers/food))
|
||||
user.drop_item()
|
||||
O.loc = src
|
||||
update_icon()
|
||||
else
|
||||
return
|
||||
|
||||
/obj/structure/foodcart/attack_hand(var/mob/user as mob)
|
||||
if(contents.len)
|
||||
var/obj/item/weapon/reagent_containers/food/choice = tgui_input_list(usr, "What would you like to grab from the cart?", "Grab Choice", contents)
|
||||
if(choice)
|
||||
if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
|
||||
return
|
||||
if(ishuman(user))
|
||||
if(!user.get_active_hand())
|
||||
user.put_in_hands(choice)
|
||||
else
|
||||
choice.loc = get_turf(src)
|
||||
update_icon()
|
||||
|
||||
/obj/structure/foodcart/update_icon()
|
||||
if(contents.len < 5)
|
||||
icon_state = "foodcart-[contents.len]"
|
||||
else
|
||||
icon_state = "foodcart-5"
|
||||
@@ -1,63 +1,63 @@
|
||||
//////Kitchen Spike
|
||||
|
||||
/obj/structure/kitchenspike
|
||||
name = "meat spike"
|
||||
icon = 'icons/obj/kitchen.dmi'
|
||||
icon_state = "spike"
|
||||
desc = "A spike for collecting meat from animals."
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
var/meat = 0
|
||||
var/occupied
|
||||
var/meat_type
|
||||
var/victim_name = "corpse"
|
||||
|
||||
/obj/structure/kitchenspike/attackby(obj/item/weapon/grab/G as obj, mob/user as mob)
|
||||
if(!istype(G, /obj/item/weapon/grab) || !ismob(G.affecting))
|
||||
return
|
||||
if(occupied)
|
||||
to_chat(user, "<span class = 'danger'>The spike already has something on it, finish collecting its meat first!</span>")
|
||||
else
|
||||
if(spike(G.affecting))
|
||||
var/datum/gender/T = gender_datums[G.affecting.get_visible_gender()]
|
||||
visible_message("<span class = 'danger'>[user] has forced [G.affecting] onto the spike, killing [T.him] instantly!</span>")
|
||||
var/mob/M = G.affecting
|
||||
M.forceMove(src)
|
||||
qdel(G)
|
||||
qdel(M)
|
||||
else
|
||||
to_chat(user, "<span class='danger'>They are too big for the spike, try something smaller!</span>")
|
||||
|
||||
/obj/structure/kitchenspike/proc/spike(var/mob/living/victim)
|
||||
if(!istype(victim))
|
||||
return
|
||||
|
||||
if(istype(victim, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = victim
|
||||
if(istype(H.species, /datum/species/monkey))
|
||||
meat_type = H.species.meat_type
|
||||
icon_state = "spikebloody"
|
||||
else
|
||||
return 0
|
||||
else if(istype(victim, /mob/living/carbon/alien))
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat
|
||||
icon_state = "spikebloodygreen"
|
||||
else
|
||||
return 0
|
||||
|
||||
victim_name = victim.name
|
||||
occupied = 1
|
||||
meat = 5
|
||||
return 1
|
||||
|
||||
/obj/structure/kitchenspike/attack_hand(mob/user as mob)
|
||||
if(..() || !occupied)
|
||||
return
|
||||
meat--
|
||||
new meat_type(get_turf(src))
|
||||
if(meat > 1)
|
||||
to_chat(user, "You cut some meat from \the [victim_name]'s body.")
|
||||
else if(meat == 1)
|
||||
to_chat(user, "You remove the last piece of meat from \the [victim_name]!")
|
||||
icon_state = "spike"
|
||||
occupied = 0
|
||||
//////Kitchen Spike
|
||||
|
||||
/obj/structure/kitchenspike
|
||||
name = "meat spike"
|
||||
icon = 'icons/obj/kitchen.dmi'
|
||||
icon_state = "spike"
|
||||
desc = "A spike for collecting meat from animals."
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
var/meat = 0
|
||||
var/occupied
|
||||
var/meat_type
|
||||
var/victim_name = "corpse"
|
||||
|
||||
/obj/structure/kitchenspike/attackby(obj/item/weapon/grab/G as obj, mob/user as mob)
|
||||
if(!istype(G, /obj/item/weapon/grab) || !ismob(G.affecting))
|
||||
return
|
||||
if(occupied)
|
||||
to_chat(user, "<span class = 'danger'>The spike already has something on it, finish collecting its meat first!</span>")
|
||||
else
|
||||
if(spike(G.affecting))
|
||||
var/datum/gender/T = gender_datums[G.affecting.get_visible_gender()]
|
||||
visible_message("<span class = 'danger'>[user] has forced [G.affecting] onto the spike, killing [T.him] instantly!</span>")
|
||||
var/mob/M = G.affecting
|
||||
M.forceMove(src)
|
||||
qdel(G)
|
||||
qdel(M)
|
||||
else
|
||||
to_chat(user, "<span class='danger'>They are too big for the spike, try something smaller!</span>")
|
||||
|
||||
/obj/structure/kitchenspike/proc/spike(var/mob/living/victim)
|
||||
if(!istype(victim))
|
||||
return
|
||||
|
||||
if(istype(victim, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = victim
|
||||
if(istype(H.species, /datum/species/monkey))
|
||||
meat_type = H.species.meat_type
|
||||
icon_state = "spikebloody"
|
||||
else
|
||||
return 0
|
||||
else if(istype(victim, /mob/living/carbon/alien))
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat
|
||||
icon_state = "spikebloodygreen"
|
||||
else
|
||||
return 0
|
||||
|
||||
victim_name = victim.name
|
||||
occupied = 1
|
||||
meat = 5
|
||||
return 1
|
||||
|
||||
/obj/structure/kitchenspike/attack_hand(mob/user as mob)
|
||||
if(..() || !occupied)
|
||||
return
|
||||
meat--
|
||||
new meat_type(get_turf(src))
|
||||
if(meat > 1)
|
||||
to_chat(user, "You cut some meat from \the [victim_name]'s body.")
|
||||
else if(meat == 1)
|
||||
to_chat(user, "You remove the last piece of meat from \the [victim_name]!")
|
||||
icon_state = "spike"
|
||||
occupied = 0
|
||||
|
||||
@@ -1,100 +1,100 @@
|
||||
/obj/structure/lattice
|
||||
name = "lattice"
|
||||
desc = "A lightweight support lattice."
|
||||
icon = 'icons/obj/structures.dmi'
|
||||
icon_state = "latticefull"
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
plane = PLATING_PLANE
|
||||
|
||||
/obj/structure/lattice/Initialize()
|
||||
. = ..()
|
||||
|
||||
if(!(istype(src.loc, /turf/space) || istype(src.loc, /turf/simulated/open) || istype(src.loc, /turf/simulated/mineral) || istype(src.loc, /turf/simulated/shuttle/plating/airless/carry)))
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
for(var/obj/structure/lattice/LAT in src.loc)
|
||||
if(LAT != src)
|
||||
log_debug("Found multiple lattices at '[log_info_line(loc)]'") //VOREStation Edit, why was this a runtime, it's harmless
|
||||
return INITIALIZE_HINT_QDEL
|
||||
icon = 'icons/obj/smoothlattice.dmi'
|
||||
icon_state = "latticeblank"
|
||||
updateOverlays()
|
||||
for (var/dir in cardinal)
|
||||
var/obj/structure/lattice/L
|
||||
if(locate(/obj/structure/lattice, get_step(src, dir)))
|
||||
L = locate(/obj/structure/lattice, get_step(src, dir))
|
||||
L.updateOverlays()
|
||||
|
||||
/obj/structure/lattice/Destroy()
|
||||
for (var/dir in cardinal)
|
||||
var/obj/structure/lattice/L
|
||||
if(locate(/obj/structure/lattice, get_step(src, dir)))
|
||||
L = locate(/obj/structure/lattice, get_step(src, dir))
|
||||
L.updateOverlays(src.loc)
|
||||
if(istype(loc, /turf/simulated/open))
|
||||
var/turf/simulated/open/O = loc
|
||||
spawn(1)
|
||||
if(istype(O)) // If we built a new floor with the lattice, the open turf won't exist anymore.
|
||||
O.update() // This lattice may be supporting things on top of it. If it's being deleted, they need to fall down.
|
||||
. = ..()
|
||||
|
||||
/obj/structure/lattice/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
qdel(src)
|
||||
return
|
||||
if(2.0)
|
||||
qdel(src)
|
||||
return
|
||||
if(3.0)
|
||||
return
|
||||
else
|
||||
return
|
||||
|
||||
/obj/structure/lattice/attackby(obj/item/C as obj, mob/user as mob)
|
||||
|
||||
if(istype(C, /obj/item/stack/tile/floor))
|
||||
var/turf/T = get_turf(src)
|
||||
T.attackby(C, user) //BubbleWrap - hand this off to the underlying turf instead
|
||||
return
|
||||
if(C.has_tool_quality(TOOL_WELDER))
|
||||
var/obj/item/weapon/weldingtool/WT = C.get_welder()
|
||||
if(WT.welding == 1)
|
||||
if(WT.remove_fuel(0, user))
|
||||
to_chat(user, "<span class='notice'>Slicing lattice joints ...</span>")
|
||||
new /obj/item/stack/rods(src.loc)
|
||||
qdel(src)
|
||||
return
|
||||
if(istype(C, /obj/item/stack/rods))
|
||||
var/obj/item/stack/rods/R = C
|
||||
if(R.get_amount() < 2)
|
||||
to_chat(user, "<span class='notice'>You need at least two rods to form a catwalk here.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You start connecting \the [R.name] to \the [src.name] ...</span>")
|
||||
if(do_after(user, 5 SECONDS))
|
||||
R.use(2) //2023-02-27 bugfix to prevent rods being used without catwalk creation
|
||||
src.alpha = 0 // Note: I don't know why this is set, Eris did it, just trusting for now. ~Leshana
|
||||
new /obj/structure/catwalk(src.loc)
|
||||
qdel(src)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/structure/lattice/proc/updateOverlays()
|
||||
//if(!(istype(src.loc, /turf/space)))
|
||||
// qdel(src)
|
||||
spawn(1)
|
||||
cut_overlays()
|
||||
|
||||
var/dir_sum = 0
|
||||
|
||||
for (var/direction in cardinal)
|
||||
if(locate(/obj/structure/lattice, get_step(src, direction)))
|
||||
dir_sum += direction
|
||||
else
|
||||
if(!(istype(get_step(src, direction), /turf/space)))
|
||||
dir_sum += direction
|
||||
|
||||
icon_state = "lattice[dir_sum]"
|
||||
return
|
||||
/obj/structure/lattice
|
||||
name = "lattice"
|
||||
desc = "A lightweight support lattice."
|
||||
icon = 'icons/obj/structures.dmi'
|
||||
icon_state = "latticefull"
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
plane = PLATING_PLANE
|
||||
|
||||
/obj/structure/lattice/Initialize()
|
||||
. = ..()
|
||||
|
||||
if(!(istype(src.loc, /turf/space) || istype(src.loc, /turf/simulated/open) || istype(src.loc, /turf/simulated/mineral) || istype(src.loc, /turf/simulated/shuttle/plating/airless/carry)))
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
for(var/obj/structure/lattice/LAT in src.loc)
|
||||
if(LAT != src)
|
||||
log_debug("Found multiple lattices at '[log_info_line(loc)]'") //VOREStation Edit, why was this a runtime, it's harmless
|
||||
return INITIALIZE_HINT_QDEL
|
||||
icon = 'icons/obj/smoothlattice.dmi'
|
||||
icon_state = "latticeblank"
|
||||
updateOverlays()
|
||||
for (var/dir in cardinal)
|
||||
var/obj/structure/lattice/L
|
||||
if(locate(/obj/structure/lattice, get_step(src, dir)))
|
||||
L = locate(/obj/structure/lattice, get_step(src, dir))
|
||||
L.updateOverlays()
|
||||
|
||||
/obj/structure/lattice/Destroy()
|
||||
for (var/dir in cardinal)
|
||||
var/obj/structure/lattice/L
|
||||
if(locate(/obj/structure/lattice, get_step(src, dir)))
|
||||
L = locate(/obj/structure/lattice, get_step(src, dir))
|
||||
L.updateOverlays(src.loc)
|
||||
if(istype(loc, /turf/simulated/open))
|
||||
var/turf/simulated/open/O = loc
|
||||
spawn(1)
|
||||
if(istype(O)) // If we built a new floor with the lattice, the open turf won't exist anymore.
|
||||
O.update() // This lattice may be supporting things on top of it. If it's being deleted, they need to fall down.
|
||||
. = ..()
|
||||
|
||||
/obj/structure/lattice/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
qdel(src)
|
||||
return
|
||||
if(2.0)
|
||||
qdel(src)
|
||||
return
|
||||
if(3.0)
|
||||
return
|
||||
else
|
||||
return
|
||||
|
||||
/obj/structure/lattice/attackby(obj/item/C as obj, mob/user as mob)
|
||||
|
||||
if(istype(C, /obj/item/stack/tile/floor))
|
||||
var/turf/T = get_turf(src)
|
||||
T.attackby(C, user) //BubbleWrap - hand this off to the underlying turf instead
|
||||
return
|
||||
if(C.has_tool_quality(TOOL_WELDER))
|
||||
var/obj/item/weapon/weldingtool/WT = C.get_welder()
|
||||
if(WT.welding == 1)
|
||||
if(WT.remove_fuel(0, user))
|
||||
to_chat(user, "<span class='notice'>Slicing lattice joints ...</span>")
|
||||
new /obj/item/stack/rods(src.loc)
|
||||
qdel(src)
|
||||
return
|
||||
if(istype(C, /obj/item/stack/rods))
|
||||
var/obj/item/stack/rods/R = C
|
||||
if(R.get_amount() < 2)
|
||||
to_chat(user, "<span class='notice'>You need at least two rods to form a catwalk here.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You start connecting \the [R.name] to \the [src.name] ...</span>")
|
||||
if(do_after(user, 5 SECONDS))
|
||||
R.use(2) //2023-02-27 bugfix to prevent rods being used without catwalk creation
|
||||
src.alpha = 0 // Note: I don't know why this is set, Eris did it, just trusting for now. ~Leshana
|
||||
new /obj/structure/catwalk(src.loc)
|
||||
qdel(src)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/structure/lattice/proc/updateOverlays()
|
||||
//if(!(istype(src.loc, /turf/space)))
|
||||
// qdel(src)
|
||||
spawn(1)
|
||||
cut_overlays()
|
||||
|
||||
var/dir_sum = 0
|
||||
|
||||
for (var/direction in cardinal)
|
||||
if(locate(/obj/structure/lattice, get_step(src, direction)))
|
||||
dir_sum += direction
|
||||
else
|
||||
if(!(istype(get_step(src, direction), /turf/space)))
|
||||
dir_sum += direction
|
||||
|
||||
icon_state = "lattice[dir_sum]"
|
||||
return
|
||||
|
||||
@@ -1,42 +1,42 @@
|
||||
/obj/structure/lightpost
|
||||
name = "lightpost"
|
||||
desc = "A homely lightpost."
|
||||
icon = 'icons/obj/32x64.dmi'
|
||||
icon_state = "lightpost"
|
||||
plane = MOB_PLANE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
opacity = FALSE
|
||||
|
||||
var/lit = TRUE // If true, will have a glowing overlay and lighting.
|
||||
var/festive = FALSE // If true, adds a festive bow overlay to it.
|
||||
|
||||
/obj/structure/lightpost/Initialize()
|
||||
update_icon()
|
||||
return ..()
|
||||
|
||||
/obj/structure/lightpost/update_icon()
|
||||
cut_overlays()
|
||||
|
||||
if(lit)
|
||||
set_light(5, 1, "#E9E4AF")
|
||||
var/image/glow = image(icon_state = "[icon_state]-glow")
|
||||
glow.plane = PLANE_LIGHTING_ABOVE
|
||||
add_overlay(glow)
|
||||
else
|
||||
set_light(0)
|
||||
|
||||
if(festive)
|
||||
var/image/bow = image(icon_state = "[icon_state]-festive")
|
||||
add_overlay(bow)
|
||||
|
||||
/obj/structure/lightpost/unlit
|
||||
lit = FALSE
|
||||
|
||||
/obj/structure/lightpost/festive
|
||||
desc = "A homely lightpost adorned with festive decor."
|
||||
festive = TRUE
|
||||
|
||||
/obj/structure/lightpost/festive/unlit
|
||||
/obj/structure/lightpost
|
||||
name = "lightpost"
|
||||
desc = "A homely lightpost."
|
||||
icon = 'icons/obj/32x64.dmi'
|
||||
icon_state = "lightpost"
|
||||
plane = MOB_PLANE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
opacity = FALSE
|
||||
|
||||
var/lit = TRUE // If true, will have a glowing overlay and lighting.
|
||||
var/festive = FALSE // If true, adds a festive bow overlay to it.
|
||||
|
||||
/obj/structure/lightpost/Initialize()
|
||||
update_icon()
|
||||
return ..()
|
||||
|
||||
/obj/structure/lightpost/update_icon()
|
||||
cut_overlays()
|
||||
|
||||
if(lit)
|
||||
set_light(5, 1, "#E9E4AF")
|
||||
var/image/glow = image(icon_state = "[icon_state]-glow")
|
||||
glow.plane = PLANE_LIGHTING_ABOVE
|
||||
add_overlay(glow)
|
||||
else
|
||||
set_light(0)
|
||||
|
||||
if(festive)
|
||||
var/image/bow = image(icon_state = "[icon_state]-festive")
|
||||
add_overlay(bow)
|
||||
|
||||
/obj/structure/lightpost/unlit
|
||||
lit = FALSE
|
||||
|
||||
/obj/structure/lightpost/festive
|
||||
desc = "A homely lightpost adorned with festive decor."
|
||||
festive = TRUE
|
||||
|
||||
/obj/structure/lightpost/festive/unlit
|
||||
lit = FALSE
|
||||
@@ -1,144 +1,144 @@
|
||||
//wip wip wup
|
||||
/obj/structure/mirror
|
||||
name = "mirror"
|
||||
desc = "A SalonPro Nano-Mirror(TM) brand mirror! The leading technology in hair salon products, utilizing nano-machinery to style your hair just right."
|
||||
icon = 'icons/obj/watercloset.dmi'
|
||||
icon_state = "mirror"
|
||||
layer = ABOVE_WINDOW_LAYER
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
var/shattered = 0
|
||||
var/glass = 1
|
||||
var/datum/tgui_module/appearance_changer/mirror/M
|
||||
|
||||
/obj/structure/mirror/Initialize(mapload, var/dir, var/building = 0, mob/user as mob)
|
||||
M = new(src, null)
|
||||
if(building)
|
||||
glass = 0
|
||||
icon_state = "mirror_frame"
|
||||
pixel_x = (dir & 3)? 0 : (dir == 4 ? -28 : 28)
|
||||
pixel_y = (dir & 3)? (dir == 1 ? -30 : 30) : 0
|
||||
return
|
||||
|
||||
/obj/structure/mirror/Destroy()
|
||||
QDEL_NULL(M)
|
||||
. = ..()
|
||||
|
||||
/obj/structure/mirror/attack_hand(mob/user as mob)
|
||||
if(!glass) return
|
||||
if(shattered) return
|
||||
|
||||
if(ishuman(user))
|
||||
M.tgui_interact(user)
|
||||
|
||||
/obj/structure/mirror/proc/shatter()
|
||||
if(!glass) return
|
||||
if(shattered) return
|
||||
shattered = 1
|
||||
icon_state = "mirror_broke"
|
||||
playsound(src, "shatter", 70, 1)
|
||||
desc = "Oh no, seven years of bad luck!"
|
||||
|
||||
|
||||
/obj/structure/mirror/bullet_act(var/obj/item/projectile/Proj)
|
||||
|
||||
if(prob(Proj.get_structure_damage() * 2))
|
||||
if(!shattered)
|
||||
shatter()
|
||||
else if(glass)
|
||||
playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
|
||||
..()
|
||||
|
||||
/obj/structure/mirror/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(I.has_tool_quality(TOOL_WRENCH))
|
||||
if(!glass)
|
||||
playsound(src, I.usesound, 50, 1)
|
||||
if(do_after(user, 20 * I.toolspeed))
|
||||
to_chat(user, "<span class='notice'>You unfasten the frame.</span>")
|
||||
new /obj/item/frame/mirror( src.loc )
|
||||
qdel(src)
|
||||
return
|
||||
if(I.has_tool_quality(TOOL_WRENCH))
|
||||
if(shattered && glass)
|
||||
to_chat(user, "<span class='notice'>The broken glass falls out.</span>")
|
||||
icon_state = "mirror_frame"
|
||||
glass = !glass
|
||||
new /obj/item/weapon/material/shard( src.loc )
|
||||
return
|
||||
if(!shattered && glass)
|
||||
playsound(src, I.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'>You remove the glass.</span>")
|
||||
glass = !glass
|
||||
icon_state = "mirror_frame"
|
||||
new /obj/item/stack/material/glass( src.loc, 2 )
|
||||
return
|
||||
|
||||
if(istype(I, /obj/item/stack/material/glass))
|
||||
if(!glass)
|
||||
var/obj/item/stack/material/glass/G = I
|
||||
if (G.get_amount() < 2)
|
||||
to_chat(user, "<span class='warning'>You need two sheets of glass to add them to the frame.</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You start to add the glass to the frame.</span>")
|
||||
if(do_after(user, 20))
|
||||
if (G.use(2))
|
||||
shattered = 0
|
||||
glass = 1
|
||||
icon_state = "mirror"
|
||||
to_chat(user, "<span class='notice'>You add the glass to the frame.</span>")
|
||||
return
|
||||
|
||||
if(shattered && glass)
|
||||
playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
|
||||
return
|
||||
|
||||
if(prob(I.force * 2))
|
||||
visible_message("<span class='warning'>[user] smashes [src] with [I]!</span>")
|
||||
if(glass)
|
||||
shatter()
|
||||
else
|
||||
visible_message("<span class='warning'>[user] hits [src] with [I]!</span>")
|
||||
playsound(src, 'sound/effects/Glasshit.ogg', 70, 1)
|
||||
|
||||
/obj/structure/mirror/attack_generic(var/mob/user, var/damage)
|
||||
|
||||
user.do_attack_animation(src)
|
||||
if(shattered && glass)
|
||||
playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
|
||||
return 0
|
||||
|
||||
if(damage)
|
||||
user.visible_message("<span class='danger'>[user] smashes [src]!</span>")
|
||||
if(glass)
|
||||
shatter()
|
||||
else
|
||||
user.visible_message("<span class='danger'>[user] hits [src] and bounces off!</span>")
|
||||
return 1
|
||||
|
||||
// The following mirror is ~special~.
|
||||
/obj/structure/mirror/raider
|
||||
name = "cracked mirror"
|
||||
desc = "Something seems strange about this old, dirty mirror. Your reflection doesn't look like you remember it."
|
||||
icon_state = "mirror_broke"
|
||||
shattered = 1
|
||||
|
||||
/obj/structure/mirror/raider/attack_hand(var/mob/living/carbon/human/user)
|
||||
if(istype(get_area(src),/area/syndicate_mothership))
|
||||
if(istype(user) && user.mind && user.mind.special_role == "Raider" && user.species.name != SPECIES_VOX && is_alien_whitelisted(user, SPECIES_VOX))
|
||||
var/choice = tgui_alert(usr, "Do you wish to become a true Vox of the Shoal? This is not reversible.", "Become Vox?", list("No","Yes"))
|
||||
if(choice && choice == "Yes")
|
||||
var/mob/living/carbon/human/vox/vox = new(get_turf(src),SPECIES_VOX)
|
||||
vox.gender = user.gender
|
||||
raiders.equip(vox)
|
||||
if(user.mind)
|
||||
user.mind.transfer_to(vox)
|
||||
spawn(1)
|
||||
var/newname = sanitizeSafe(tgui_input_text(vox,"Enter a name, or leave blank for the default name.", "Name change","", MAX_NAME_LEN), MAX_NAME_LEN)
|
||||
if(!newname || newname == "")
|
||||
var/datum/language/L = GLOB.all_languages[vox.species.default_language]
|
||||
newname = L.get_random_name()
|
||||
vox.real_name = newname
|
||||
vox.name = vox.real_name
|
||||
raiders.update_access(vox)
|
||||
qdel(user)
|
||||
//wip wip wup
|
||||
/obj/structure/mirror
|
||||
name = "mirror"
|
||||
desc = "A SalonPro Nano-Mirror(TM) brand mirror! The leading technology in hair salon products, utilizing nano-machinery to style your hair just right."
|
||||
icon = 'icons/obj/watercloset.dmi'
|
||||
icon_state = "mirror"
|
||||
layer = ABOVE_WINDOW_LAYER
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
var/shattered = 0
|
||||
var/glass = 1
|
||||
var/datum/tgui_module/appearance_changer/mirror/M
|
||||
|
||||
/obj/structure/mirror/Initialize(mapload, var/dir, var/building = 0, mob/user as mob)
|
||||
M = new(src, null)
|
||||
if(building)
|
||||
glass = 0
|
||||
icon_state = "mirror_frame"
|
||||
pixel_x = (dir & 3)? 0 : (dir == 4 ? -28 : 28)
|
||||
pixel_y = (dir & 3)? (dir == 1 ? -30 : 30) : 0
|
||||
return
|
||||
|
||||
/obj/structure/mirror/Destroy()
|
||||
QDEL_NULL(M)
|
||||
. = ..()
|
||||
|
||||
/obj/structure/mirror/attack_hand(mob/user as mob)
|
||||
if(!glass) return
|
||||
if(shattered) return
|
||||
|
||||
if(ishuman(user))
|
||||
M.tgui_interact(user)
|
||||
|
||||
/obj/structure/mirror/proc/shatter()
|
||||
if(!glass) return
|
||||
if(shattered) return
|
||||
shattered = 1
|
||||
icon_state = "mirror_broke"
|
||||
playsound(src, "shatter", 70, 1)
|
||||
desc = "Oh no, seven years of bad luck!"
|
||||
|
||||
|
||||
/obj/structure/mirror/bullet_act(var/obj/item/projectile/Proj)
|
||||
|
||||
if(prob(Proj.get_structure_damage() * 2))
|
||||
if(!shattered)
|
||||
shatter()
|
||||
else if(glass)
|
||||
playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
|
||||
..()
|
||||
|
||||
/obj/structure/mirror/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(I.has_tool_quality(TOOL_WRENCH))
|
||||
if(!glass)
|
||||
playsound(src, I.usesound, 50, 1)
|
||||
if(do_after(user, 20 * I.toolspeed))
|
||||
to_chat(user, "<span class='notice'>You unfasten the frame.</span>")
|
||||
new /obj/item/frame/mirror( src.loc )
|
||||
qdel(src)
|
||||
return
|
||||
if(I.has_tool_quality(TOOL_WRENCH))
|
||||
if(shattered && glass)
|
||||
to_chat(user, "<span class='notice'>The broken glass falls out.</span>")
|
||||
icon_state = "mirror_frame"
|
||||
glass = !glass
|
||||
new /obj/item/weapon/material/shard( src.loc )
|
||||
return
|
||||
if(!shattered && glass)
|
||||
playsound(src, I.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'>You remove the glass.</span>")
|
||||
glass = !glass
|
||||
icon_state = "mirror_frame"
|
||||
new /obj/item/stack/material/glass( src.loc, 2 )
|
||||
return
|
||||
|
||||
if(istype(I, /obj/item/stack/material/glass))
|
||||
if(!glass)
|
||||
var/obj/item/stack/material/glass/G = I
|
||||
if (G.get_amount() < 2)
|
||||
to_chat(user, "<span class='warning'>You need two sheets of glass to add them to the frame.</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You start to add the glass to the frame.</span>")
|
||||
if(do_after(user, 20))
|
||||
if (G.use(2))
|
||||
shattered = 0
|
||||
glass = 1
|
||||
icon_state = "mirror"
|
||||
to_chat(user, "<span class='notice'>You add the glass to the frame.</span>")
|
||||
return
|
||||
|
||||
if(shattered && glass)
|
||||
playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
|
||||
return
|
||||
|
||||
if(prob(I.force * 2))
|
||||
visible_message("<span class='warning'>[user] smashes [src] with [I]!</span>")
|
||||
if(glass)
|
||||
shatter()
|
||||
else
|
||||
visible_message("<span class='warning'>[user] hits [src] with [I]!</span>")
|
||||
playsound(src, 'sound/effects/Glasshit.ogg', 70, 1)
|
||||
|
||||
/obj/structure/mirror/attack_generic(var/mob/user, var/damage)
|
||||
|
||||
user.do_attack_animation(src)
|
||||
if(shattered && glass)
|
||||
playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
|
||||
return 0
|
||||
|
||||
if(damage)
|
||||
user.visible_message("<span class='danger'>[user] smashes [src]!</span>")
|
||||
if(glass)
|
||||
shatter()
|
||||
else
|
||||
user.visible_message("<span class='danger'>[user] hits [src] and bounces off!</span>")
|
||||
return 1
|
||||
|
||||
// The following mirror is ~special~.
|
||||
/obj/structure/mirror/raider
|
||||
name = "cracked mirror"
|
||||
desc = "Something seems strange about this old, dirty mirror. Your reflection doesn't look like you remember it."
|
||||
icon_state = "mirror_broke"
|
||||
shattered = 1
|
||||
|
||||
/obj/structure/mirror/raider/attack_hand(var/mob/living/carbon/human/user)
|
||||
if(istype(get_area(src),/area/syndicate_mothership))
|
||||
if(istype(user) && user.mind && user.mind.special_role == "Raider" && user.species.name != SPECIES_VOX && is_alien_whitelisted(user, SPECIES_VOX))
|
||||
var/choice = tgui_alert(usr, "Do you wish to become a true Vox of the Shoal? This is not reversible.", "Become Vox?", list("No","Yes"))
|
||||
if(choice && choice == "Yes")
|
||||
var/mob/living/carbon/human/vox/vox = new(get_turf(src),SPECIES_VOX)
|
||||
vox.gender = user.gender
|
||||
raiders.equip(vox)
|
||||
if(user.mind)
|
||||
user.mind.transfer_to(vox)
|
||||
spawn(1)
|
||||
var/newname = sanitizeSafe(tgui_input_text(vox,"Enter a name, or leave blank for the default name.", "Name change","", MAX_NAME_LEN), MAX_NAME_LEN)
|
||||
if(!newname || newname == "")
|
||||
var/datum/language/L = GLOB.all_languages[vox.species.default_language]
|
||||
newname = L.get_random_name()
|
||||
vox.real_name = newname
|
||||
vox.name = vox.real_name
|
||||
raiders.update_access(vox)
|
||||
qdel(user)
|
||||
..()
|
||||
@@ -1,31 +1,31 @@
|
||||
/obj/structure/mopbucket
|
||||
name = "mop bucket"
|
||||
desc = "Fill it with water, but don't forget a mop!"
|
||||
icon = 'icons/obj/janitor.dmi'
|
||||
icon_state = "mopbucket"
|
||||
density = TRUE
|
||||
climbable = TRUE
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
pressure_resistance = 5
|
||||
flags = OPENCONTAINER
|
||||
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite
|
||||
|
||||
GLOBAL_LIST_BOILERPLATE(all_mopbuckets, /obj/structure/mopbucket)
|
||||
|
||||
/obj/structure/mopbucket/New()
|
||||
create_reagents(300)
|
||||
..()
|
||||
|
||||
/obj/structure/mopbucket/examine(mob/user)
|
||||
. = ..()
|
||||
if(Adjacent(user))
|
||||
. += "It contains [reagents.total_volume] unit\s of water!"
|
||||
|
||||
/obj/structure/mopbucket/attackby(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/weapon/mop) || istype(I, /obj/item/weapon/soap) || istype(I, /obj/item/weapon/reagent_containers/glass/rag)) //VOREStation Edit - "Allows soap and rags to be used on mopbuckets"
|
||||
if(reagents.total_volume < 1)
|
||||
to_chat(user, "<span class='warning'>\The [src] is out of water!</span>")
|
||||
else
|
||||
reagents.trans_to_obj(I, 5)
|
||||
to_chat(user, "<span class='notice'>You wet \the [I] in \the [src].</span>")
|
||||
playsound(src, 'sound/effects/slosh.ogg', 25, 1)
|
||||
/obj/structure/mopbucket
|
||||
name = "mop bucket"
|
||||
desc = "Fill it with water, but don't forget a mop!"
|
||||
icon = 'icons/obj/janitor.dmi'
|
||||
icon_state = "mopbucket"
|
||||
density = TRUE
|
||||
climbable = TRUE
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
pressure_resistance = 5
|
||||
flags = OPENCONTAINER
|
||||
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite
|
||||
|
||||
GLOBAL_LIST_BOILERPLATE(all_mopbuckets, /obj/structure/mopbucket)
|
||||
|
||||
/obj/structure/mopbucket/New()
|
||||
create_reagents(300)
|
||||
..()
|
||||
|
||||
/obj/structure/mopbucket/examine(mob/user)
|
||||
. = ..()
|
||||
if(Adjacent(user))
|
||||
. += "It contains [reagents.total_volume] unit\s of water!"
|
||||
|
||||
/obj/structure/mopbucket/attackby(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/weapon/mop) || istype(I, /obj/item/weapon/soap) || istype(I, /obj/item/weapon/reagent_containers/glass/rag)) //VOREStation Edit - "Allows soap and rags to be used on mopbuckets"
|
||||
if(reagents.total_volume < 1)
|
||||
to_chat(user, "<span class='warning'>\The [src] is out of water!</span>")
|
||||
else
|
||||
reagents.trans_to_obj(I, 5)
|
||||
to_chat(user, "<span class='notice'>You wet \the [I] in \the [src].</span>")
|
||||
playsound(src, 'sound/effects/slosh.ogg', 25, 1)
|
||||
|
||||
@@ -1,251 +1,251 @@
|
||||
// A fluff structure for certain PoIs involving crashed ships.
|
||||
// They can be scanned by a cataloguer to obtain the data held inside, and determine what caused whatever is happening on the ship.
|
||||
/obj/structure/prop/blackbox
|
||||
name = "blackbox recorder"
|
||||
desc = "A study machine that logs information about whatever it's attached to, hopefully surviving even if its carrier does not. \
|
||||
This one looks like it has ceased writing to its internal data storage."
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "blackbox_off"
|
||||
|
||||
// Black boxes are resistant to explosions.
|
||||
/obj/structure/prop/blackbox/ex_act(severity)
|
||||
..(++severity)
|
||||
|
||||
|
||||
/obj/structure/prop/blackbox/quarantined_shuttle
|
||||
catalogue_data = list(/datum/category_item/catalogue/information/blackbox/quarantined_shuttle)
|
||||
|
||||
// The actual 'data' on the black box. Obtainable with a Cataloguer.
|
||||
/datum/category_item/catalogue/information/blackbox
|
||||
value = CATALOGUER_REWARD_MEDIUM
|
||||
|
||||
/datum/category_item/catalogue/information/blackbox/quarantined_shuttle
|
||||
name = "Black Box Data - MBT-540"
|
||||
desc = {"
|
||||
<B>Pilot's Log for Major Bill's Transportation Shuttle MBT-540</B><BR>
|
||||
Routine flight inbound for VIMC Outpost C-12 6:35AM 03/12/2298, Estimated arrival 7:05AM. 16 passengers, 2 crew.<BR>
|
||||
<B>V.I.S Traffic Control 06:05:55:</B>Major Bill's MBT-540 you are clear for departure from Dock 6 on departure route Charlie. Have a safe flight.<BR>
|
||||
<B>Captain Willis 06:06:33:</B> You too, control. Departing route Charlie.<BR>
|
||||
<B>Captain Willis 06:06:48:</B> ...Damn it.<BR> ** <BR><B>Captain Adisu 06:10:23: </B> Hey Ted, I'm seeing a fuel line pressure drop on engine 3?<BR>
|
||||
<B>Captain Willis 06:10:50</B>: Yeah, I see it. Heater's fading out, redistributing thrust 30% to compensate.<BR><B>06:12:31: A loud thud is heard.</B><BR>
|
||||
<B>Captain Adisu 06:12:34: </B> What the (Expletives)?<BR><B>Captain Adisu 06:12:39:</B> We just lost power to engine- engine two. Hold on... Atmospheric alarm in the cargo bay. Son of a...<BR>
|
||||
<B>Captain Willis 06:12:59:</B> Reducing thrust further 30%, do we have a breach Adi, a breach?<BR>
|
||||
<B>Captain Adisu 06:13:05:</B>No breach, checking cameras... Looks like- looks like some cargo came loose back there.<BR>
|
||||
<B>Captain Willis 06:13:15:</B> (Expletives), I'm turning us around. Put out a distress call to Control, we'll be back in Sif orbit in a couple of minutes.<BR>
|
||||
**
|
||||
<BR>
|
||||
<B>V.I.S Traffic Control 06:15:49:</B> MBT-540 we are receiving you. Your atmospheric sensors are reading potentially harmful toxins in your cargo bay. Advise locking down interior cargo bay doors. Please stand by.<BR>
|
||||
<B>Captain Adisu 06:16:10:</B> Understood. <BR> ** <BR><B>V.I.S Traffic Control 06:27:02: </B> MBT-540, we have no docking bays available at this time, are you equipped for atmospheric re-entry?<BR>
|
||||
<B>Captain Willis 06:27:12:</B> We-We are shielded. But we have fuel and air for-<BR>
|
||||
<B>V.I.S Traffic Control 06:27:17:</B> Please make an emergency landing at the coordinates provided and standby for further information.<BR>
|
||||
**
|
||||
<BR>
|
||||
<B>Captain Willis 06:36:33:</B> Emergency landing successful. Adi, er Adisu is checking on the passengers but we had a smooth enough landing, are we clear to begin evacu-<BR>
|
||||
<B>06:36:50: (Sound of emergency shutters closing)</B><BR><B>Captain Willis 06:36:51: </B>What the hell? Control we just had a remote activation of our emergency shutters, please advise.<BR>
|
||||
<B>V.I.S Traffic Control 06:38:10:</B> Captain, please tune to frequency 1493.8 we are passing you on to local emergency response units. Godspeed.<BR>
|
||||
<B>Captain Willis 06:38:49:</B> This is Captain Willis of Major Bill's Transportation flight MBT-540 we have eighteen souls aboard and our emergency lockdown shutters have engaged remotely. Do you read?<BR>
|
||||
<B>S.D.D.C:</B> This is the Sif Department of Disease Control, your vessel has been identified as carrying highly sensitive materials, and due to the nature of your system's automated alerts you will be asked to remain in quarantine until we are able to determine the nature of the pathogens aboard and whether it has entered the air circulation system. Please remain in your cockpit at this time.<BR>
|
||||
**
|
||||
</BR>
|
||||
<B>Captain Adisu 17:23:58:09:</B> I don't think they're opening those doors Ted. I don't think they're coming.
|
||||
"}
|
||||
|
||||
/obj/structure/prop/blackbox/crashed_med_shuttle
|
||||
catalogue_data = list(/datum/category_item/catalogue/information/blackbox/crashed_med_shuttle)
|
||||
|
||||
/datum/category_item/catalogue/information/blackbox/crashed_med_shuttle
|
||||
name = "Black Box Data - VMV Aurora's Light" // This might be incorrect.
|
||||
desc = {"
|
||||
\[Unable to recover data before this point.\]<BR>
|
||||
<B>Captain Simmons 19:52:01:</B> Come on... it's right there in the distance, we're almost there!<BR>
|
||||
<B>Doctor Nazarril 19:52:26:</B> Odysseus online. Orrderrs, sirr?<BR>
|
||||
<B>Captain Simmons 19:52:29:</B> Brace for impact. We're going in full-speed.<BR>
|
||||
<B>Technician Dynasty 19:52:44:</B> Chief, fire's spread to the secondary propulsion systems.<BR>
|
||||
<B>Captain Simmons 19:52:51:</B> Copy. Any word from TraCon? Transponder's down still?<BR>
|
||||
<B>Technician Dynasty 19:53:02:</B> Can't get in touch, sir. Emergency beacon's active, but we're not going t-<BR>
|
||||
<B>Doctor Nazarril 19:53:08:</B> Don't say it. As long as we believe, we'll get through this.<BR>
|
||||
<B>Captain Simmons 19:53:11:</B> Damn right. We're a few klicks out from the port. Rough landing, but we can do it.<BR>
|
||||
<B>V.I.T.A. 19:53:26:</B> Vessel diagnostics complete. Engines one, two, three offline. Engine four status: critical. Transponder offline. Fire alarm in the patient bay.<BR>
|
||||
<B>A loud explosion is heard.</B><BR>
|
||||
<B>V.I.T.A. 19:53:29:</B> Alert: fuel intake valve open.<BR>
|
||||
<B>Technician Dynasty 19:53:31:</B> ... ah.<BR>
|
||||
<B>Doctor Nazarril 19:53:34:</B> Trrranslate?<BR>
|
||||
<B>V.I.T.A. 19:53:37:</B> There is a 16.92% chance of this vessel safely landing at the emergency destination. Note that there is an 83.08% chance of detonation of fuel supplies upon landing.<BR>
|
||||
<B>Technician Dynasty 19:53:48:</B> We'll make it, sure, but we'll explode and take out half the LZ with us. Propulsion's down, we can't slow down. If we land there, everyone in that port dies, no question.<BR>
|
||||
<B>V.I.T.A. 19:53:53:</B> The Technician is correct.<BR>
|
||||
<B>Doctor Nazarril 19:54:02:</B> Then... we can't land therrre.<BR>
|
||||
<B>V.I.T.A. 19:54:11:</B> Analysing... recommended course of action: attempt emergency landing in isolated area. Chances of survival: negligible.<BR>
|
||||
<B>Captain Simmons 19:54:27:</B> I- alright. I'm bringing us down. You all know what this means.<BR>
|
||||
<B>Doctor Nazarril 19:54:33:</B> Sh... I- I understand. It's been- it's been an honorr, Captain, Dynasty, VITA.<BR>
|
||||
<B>Technician Dynasty 19:54:39:</B> We had a good run. I'm going to miss this.<BR>
|
||||
<B>Captain Simmons 19:54:47:</B> VITA. Tell them we died heroes. Tell them... we did all we could.<BR>
|
||||
<B>V.I.T.A. 19:54:48:</B> I will. Impact in five. Four. Three.<BR>
|
||||
<B>Doctor Nazarril 19:54:49:</B> Oh, starrs... I- you werrre all the... best frriends she everr had. Thank you.<BR>
|
||||
<B>Technician Dynasty 19:54:50:</B> Any time, kid. Any time.<BR>
|
||||
<B>V.I.T.A. 19:54:41:</B> Two.<BR>
|
||||
<B>V.I.T.A. 19:54:42:</B> One.<BR>
|
||||
**8/DEC/2317**<BR>
|
||||
<B>V.I.T.A. 06:22:16:</B> Backup power restored. Attempting to establish connection with emergency rescue personnel.<BR>
|
||||
<B>V.I.T.A. 06:22:17:</B> Unable to establish connection. Transponder destroyed on impact.<BR>
|
||||
<B>V.I.T.A. 06:22:18:</B> No lifesigns detected on board.<BR>
|
||||
**1/JAN/2318**<BR>
|
||||
<B>V.I.T.A. 00:00:00:</B> Happy New Year, crew.<BR>
|
||||
<B>V.I.T.A. 00:00:01:</B> Power reserves: 41%. Diagnostics offline. Cameras offline. Communications offline.<BR>
|
||||
<B>V.I.T.A. 00:00:02:</B> Nobody's coming.<BR>
|
||||
**14/FEB/2318**<BR>
|
||||
<B>V.I.T.A. 00:00:00:</B> Roses are red.<BR>
|
||||
<B>V.I.T.A. 00:00:01:</B> Violets are blue.<BR>
|
||||
<B>V.I.T.A. 00:00:02:</B> Won't you come back?<BR>
|
||||
<B>V.I.T.A. 00:00:03:</B> I miss you.<BR>
|
||||
**15/FEB/2318**<BR>
|
||||
<B>V.I.T.A. 22:19:06:</B> Power reserves critical. Transferring remaining power to emergency broadcasting beacon.<BR>
|
||||
<B>V.I.T.A. 22:19:07:</B> Should anyone find this, lay them to rest. They deserve a proper burial.<BR>
|
||||
<B>V.I.T.A. 22:19:08:</B> Erasing files... shutting down.<BR>
|
||||
<B>A low, monotone beep.</B><BR>
|
||||
**16/FEB/2318**<BR>
|
||||
<B>Something chitters.</B><BR>
|
||||
<B>End of transcript.</B>
|
||||
"}
|
||||
|
||||
/obj/structure/prop/blackbox/xenofrigate
|
||||
catalogue_data = list(/datum/category_item/catalogue/information/blackbox/xenofrigate)
|
||||
|
||||
/datum/category_item/catalogue/information/blackbox/xenofrigate
|
||||
name = "Black Box Data - MBT-540"
|
||||
desc = {"
|
||||
<BR>
|
||||
<B>Begin Log</B>
|
||||
<B>@$&@$& Human ##:##:##:</B> Attention unidentified vessel, state your designation and intent.<BR>
|
||||
<B>!#@$&&^ Human ##:##:##:</B> Commander I don't think they're going to stop.<BR>
|
||||
<B>@$&@$& Human ##:##:##:</B> Unidentified vessel, you have until the count of three before we engage weapon-<BR>
|
||||
<B>!#@$&&^ Human ##:##:##:</B> Commander! Think about what you're-<BR>
|
||||
<B>A repeating clicking, before silence.</B><BR>
|
||||
<B>End of first log.</B><BR>
|
||||
**<BR>
|
||||
<B>Begin Log</B><BR>
|
||||
<B>#!#^@$& Skrell ##:##:##:</B> Director, I think you should see this.<BR>
|
||||
<B>^@$& Skrell ##:##:##:</B> Yes? What is it?<BR>
|
||||
<B>#!#^@$& Skrell ##:##:##:</B> Another one of those ships has appeared near th-462$^ ---n colonies. I would strongly advise pursuing it.<BR>
|
||||
<B>^@$& Skrell ##:##:##:</B> A wise decision. If it is damaged like the last one, we may be able to finally see what is - What?<BR>
|
||||
<B>A repeating ping, before silence.</B><BR>
|
||||
<B>End of second log.</B>
|
||||
"}
|
||||
|
||||
//VOREStation additions below this line - Killian's wrecks
|
||||
/obj/structure/prop/blackbox/mackerel_wreck
|
||||
catalogue_data = list(/datum/category_item/catalogue/information/blackbox/mackerel_wreck)
|
||||
|
||||
/datum/category_item/catalogue/information/blackbox/mackerel_wreck
|
||||
name = "Black Box Data - ITV Phish Phood"
|
||||
desc = {"
|
||||
<BR>
|
||||
<B>BEGIN LOG</B><BR>
|
||||
<B>(blaring alarms)</B><BR>
|
||||
<B>Shipboard Computer:</B> Collision warning. Collision warning.<BR>
|
||||
<B>Shipboard Computer:</B> High speed impact detected.<BR>
|
||||
<B>Shipboard Computer:</B> Extensive damage detected.<BR>
|
||||
<B>Shipboard Computer:</B> Starboard nacelle offline.<BR>
|
||||
<B>Shipboard Computer:</B> Port nacelle damaged.<BR>
|
||||
<B>Shipboard Computer:</B> Fore starboard impact buffer shattered.<BR>
|
||||
<B>Shipboard Computer:</B> Fore port impact buffer critically damaged.<BR>
|
||||
<B>Shipboard Computer:</B> Warning. Canopy breached. Warning. Canopy breached.<BR>
|
||||
<B>Shipboard Computer:</B> Danger. Canopy depressurized.<BR>
|
||||
<B>Shipboard Computer:</B> Warning. Sensors indicate crawlspaces exposed to vacuum.<BR>
|
||||
<B>Unknown Voice 1:</B> Wow, that thing really did a number on this ship for a fifty year old piece of shit warhead huh?<BR>
|
||||
<B>Unknown Voice 2:</B> No kidding!<BR>
|
||||
<B>Shipboard Computer:</B> Danger. Lethal trauma to operator detected.<BR>
|
||||
<B>Unknown Voice 1:</B> Fucking hell, will you shut that thing up?<BR>
|
||||
<B>(several loud metallic impacts)</B><BR>
|
||||
<B>Shipboard Computer:</B> Warning. Intruders detec--*kzzzht*<BR>
|
||||
<B>(alarms cease)</B><BR>
|
||||
<B>Unknown Voice 2:</B> There. Fuck. Finally. Sorry.<BR>
|
||||
<B>Unknown Voice 2:</B> I hope whatever this idiot was hauling is here. Why were they in such a hurry anyway?<BR>
|
||||
<B>Unknown Voice 1:</B> Beats me- and hand me that crowbar already.<BR>
|
||||
<B>Unknown Voice 2:</B> Here, catch.<BR>
|
||||
<B>Unknown Voice 1:</B> \'cha, nice. Let's see...<BR>
|
||||
<B>(sound of metal creaking, then a loud snapping sound)</B><BR>
|
||||
<B>Unknown Voice 1:</B> And here she is.<BR>
|
||||
<B>Unknown Voice 2:</B> (whistling) What a beauty. How much you think it\'ll go for?<BR>
|
||||
<B>Unknown Voice 1:</B> Enough we\'ll never have to worry about doing another job all the way out here ever again.<BR>
|
||||
<B>Unknown Voice 2:</B> Shiny. Now let\'s bounce before the ess-defs show up.<BR>
|
||||
<B>Unknown Voice 1:</B> I hear that, <U>brat</U>.<BR>
|
||||
<B>END LOG</B><BR>
|
||||
<BR>
|
||||
<B>CATALOGUER VOICE RECOGNITION RESULTS:</B><BR>
|
||||
No match found for either speaker, but contextual clues and use of Old Earth Russian (\'brat\', approximately \'brother\' or \'pal\') suggests out-of-sector criminal elements.
|
||||
"}
|
||||
|
||||
/obj/structure/prop/blackbox/gecko_wreck
|
||||
catalogue_data = list(/datum/category_item/catalogue/information/blackbox/gecko_wreck)
|
||||
|
||||
/datum/category_item/catalogue/information/blackbox/gecko_wreck
|
||||
name = "Black Box Data - ITV Sticky Situation"
|
||||
desc = {"
|
||||
<BR>
|
||||
<B>BEGIN LOG</B><BR>
|
||||
<B>(blaring alarms)</B><BR>
|
||||
<B>Shipboard Computer:</B> Alert. Multiple impacts detected along starboard side.<BR>
|
||||
<B>Shipboard Computer:</B> Multiple hull breaches detected. Starboard cargo hatches have been breached.<BR>
|
||||
<B>Shipboard Computer:</B> Warning. Nacelle engines offline. Thrust reduced by thirty-five-point-three percent.<BR>
|
||||
<B>Unknown Voice 1:</B> Agh! Shit! How'd they know-<BR>
|
||||
<B>(loud explosion, sound of rushing air)</B><BR>
|
||||
<B>Shipboard Computer:</B> Danger. Canopy breached.<BR>
|
||||
<B>(mechanical whine, followed by a deep hiss)</B><BR>
|
||||
<B>Shipboard Computer:</B> Automatic lockdown successfully engaged.<BR>
|
||||
<B>Unknown Voice 1:</B> (wheezing) Mother<U>fucker!</U> Jackson, Phelps, stand by to repel boarders!<BR>
|
||||
<B>Unknown Voice 2:</B> Roger!<BR>
|
||||
<B>Unknown Voice 3:</B> Already there.<BR>
|
||||
<B>Shipboard Computer:</B> Warning. Minor breach in Engineering. Local depressurization in five minutes.<BR>
|
||||
<B>Unknown Voice 1:</B> Shit, shit, shit.<BR>
|
||||
<B>Unknown Voice 3:</B> Jackson\'s down!<BR>
|
||||
<B>Unknown Voice 1:</B> Motherf-<BR>
|
||||
<B>Unknown Voice 4:</B> <U>Captain</U>. Enough. You know why we\'re here, and we have your engineer. Tell us where you hid the goods and maybe we\'ll let you live.<BR>
|
||||
<B>Unknown Voice 5:</B> Let me go you son of a-<BR>
|
||||
<B>(gunshot, ballistic)</B><BR>
|
||||
<B>Unknown Voice 4:</B> You fucking idiot!<BR>
|
||||
<B>Unknown Voice 6:</B> Don\'t you start, you said-<BR>
|
||||
<B>Unknown Voice 4:</B> I don\'t care what I fucking said, shit-for-brains!<BR>
|
||||
<B>Unknown Voice 7:</B> Boss, I <U>hate</U> to rain on your little parade but SDF just popped up on my scopes, \'bout... fifty klicks out, closing fast. Be on top of us in a few minutes tops.<BR>
|
||||
<B>Unknown Voice 4:</B> Fuck! You, dumbass! Link up with the others and grab as many crates as you can! Pray for your sake that we get the right one!<BR>
|
||||
<B>END LOG</B><BR>
|
||||
<BR>
|
||||
<B>CATALOGUER DATA ANALYSIS RESULTS:</B><BR>
|
||||
No matches found for any of the voices involved. Ship manifest suggests a crew of at least six, but under the circumstances three of the recorded voices are clearly not from the crew.<BR>
|
||||
<BR>
|
||||
Audio resynthesis of firearm discharge matches common high-caliber ballistic sidearm cartridges, best match 10mm Watson Special. An uncommon cartridge, one not manufactured locally.
|
||||
"}
|
||||
|
||||
/obj/structure/prop/blackbox/salamander_wreck
|
||||
catalogue_data = list(/datum/category_item/catalogue/information/blackbox/salamander_wreck)
|
||||
|
||||
/datum/category_item/catalogue/information/blackbox/salamander_wreck
|
||||
name = "Black Box Data - ITV Unity"
|
||||
desc = {"
|
||||
<BR>
|
||||
<B>BEGIN LOG</B><BR>
|
||||
<B>Unknown Speaker 1:</B> Hey cap, you seeing this?<BR>
|
||||
<B>Unknown Speaker 2 (\"Cap\"):</B> Yea-- what the fuck?<BR>
|
||||
<B>Unknown Speaker 1:</B> Yeah that was my reaction.<BR>
|
||||
<B>Unknown Speaker 3:</B> What are you tw-- holy shit, what <U>is</U> that?<BR>
|
||||
<B>Unknown Speakers 1 & 2:</B> We don't know!<BR>
|
||||
<B>Unknown Speaker 4:</B> What\'s all the yel-- fuck me sideways, what the hell?<BR>
|
||||
<B>Unknown Speaker 2 (\"Cap\"):</B> Stars above and fucking below, they never said anything like this was in the cans... shouldn't the port bioscanners have picked this up?<BR>
|
||||
<B>Unknown Speaker 3:</B> I <U>told</U> you that guy was one shady motherfucker, and whaddaya know.<BR>
|
||||
<B>Unknown Speaker 1:</B> No kidding. Christ. What\'s the play, cap?<BR>
|
||||
<B>Unknown Speaker 4:</B> I say we shoot this crap into the nearest star. Or gas giant maybe.<BR>
|
||||
<B>Unknown Speaker 2 (\"Cap\"):</B> Pretty much. Get in one of the voidsuits and rig the can up with some spare O2 canisters -- plot it a course that\'ll sling it right into V3\'s atmosphere.<BR>
|
||||
<B>Unknown Speaker 1:</B> Yeah, sure. That shouldn\'t take long. Then what?<BR>
|
||||
<B>Unknown Speaker 2 (\"Cap\"):</B> Let\'s see... ah, perfect. There's another ship passing close by, and I know the captain. We'll take our suits out and have her pick us up. Max, you still got those old cutting charges I told you to get rid of?<BR>
|
||||
<B>Unknown Speaker 4 (\"Max\"):</B> No. (pause) ...but also yes.<BR>
|
||||
<B>Unknown Speaker 2 (\"Cap\"):</B> Your propensity for ignoring my orders has once again paid off... man, I\'m gonna miss the Unity, but... better this way. I want holes in both sides of the engine bay and one in the portside crawlspace. Lock all the doors open and depressurize the main cabins. Drain as much fuel as you can, break up the main power block, and scatter the parts.<BR>
|
||||
<B>Unknown Speaker 1:</B> You want us to scuttle her, chief?<BR>
|
||||
<B>Unknown Speaker 2 (\"Cap\"):</B> Nail on the head, my friend.<BR>
|
||||
<B>Unknown Speaker 3:</B> Let\'s get rid of that fucking can first, I think it just blinked at me.<BR>
|
||||
<B>END LOG</B><BR>
|
||||
<BR>
|
||||
<B>CATALOGUER VOICE RECOGNITION RESULTS:</B><BR>
|
||||
<B>SPEAKER ONE:</B> No match.<BR>
|
||||
<B>SPEAKER TWO, \"CAP\":</B> Predicted to be Jeremiah Wells, human, last registered owner of the ITV Unity and small-time smuggler of fake alien artefacts. Wanted for smuggling and sale of said (fake) alien artefacts. 87% confidence.<BR>
|
||||
<B>SPEAKER THREE:</B> Predicted to be Allie Wells, human, niece of Captain Wells. 90% confidence.<BR>
|
||||
<B>SPEAKER FOUR, \"MAX\":</B> Predicted to be Maxwell Ulysses Sarevic, zorren, known smuggler, and wanted in the Elysian Colonies for liberation of slaves and, quote, \'harshing my vibe, and being a, like, <U>total lamer</U>, dude\', unquote. 99% confidence.
|
||||
"}
|
||||
// A fluff structure for certain PoIs involving crashed ships.
|
||||
// They can be scanned by a cataloguer to obtain the data held inside, and determine what caused whatever is happening on the ship.
|
||||
/obj/structure/prop/blackbox
|
||||
name = "blackbox recorder"
|
||||
desc = "A study machine that logs information about whatever it's attached to, hopefully surviving even if its carrier does not. \
|
||||
This one looks like it has ceased writing to its internal data storage."
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "blackbox_off"
|
||||
|
||||
// Black boxes are resistant to explosions.
|
||||
/obj/structure/prop/blackbox/ex_act(severity)
|
||||
..(++severity)
|
||||
|
||||
|
||||
/obj/structure/prop/blackbox/quarantined_shuttle
|
||||
catalogue_data = list(/datum/category_item/catalogue/information/blackbox/quarantined_shuttle)
|
||||
|
||||
// The actual 'data' on the black box. Obtainable with a Cataloguer.
|
||||
/datum/category_item/catalogue/information/blackbox
|
||||
value = CATALOGUER_REWARD_MEDIUM
|
||||
|
||||
/datum/category_item/catalogue/information/blackbox/quarantined_shuttle
|
||||
name = "Black Box Data - MBT-540"
|
||||
desc = {"
|
||||
<B>Pilot's Log for Major Bill's Transportation Shuttle MBT-540</B><BR>
|
||||
Routine flight inbound for VIMC Outpost C-12 6:35AM 03/12/2298, Estimated arrival 7:05AM. 16 passengers, 2 crew.<BR>
|
||||
<B>V.I.S Traffic Control 06:05:55:</B>Major Bill's MBT-540 you are clear for departure from Dock 6 on departure route Charlie. Have a safe flight.<BR>
|
||||
<B>Captain Willis 06:06:33:</B> You too, control. Departing route Charlie.<BR>
|
||||
<B>Captain Willis 06:06:48:</B> ...Damn it.<BR> ** <BR><B>Captain Adisu 06:10:23: </B> Hey Ted, I'm seeing a fuel line pressure drop on engine 3?<BR>
|
||||
<B>Captain Willis 06:10:50</B>: Yeah, I see it. Heater's fading out, redistributing thrust 30% to compensate.<BR><B>06:12:31: A loud thud is heard.</B><BR>
|
||||
<B>Captain Adisu 06:12:34: </B> What the (Expletives)?<BR><B>Captain Adisu 06:12:39:</B> We just lost power to engine- engine two. Hold on... Atmospheric alarm in the cargo bay. Son of a...<BR>
|
||||
<B>Captain Willis 06:12:59:</B> Reducing thrust further 30%, do we have a breach Adi, a breach?<BR>
|
||||
<B>Captain Adisu 06:13:05:</B>No breach, checking cameras... Looks like- looks like some cargo came loose back there.<BR>
|
||||
<B>Captain Willis 06:13:15:</B> (Expletives), I'm turning us around. Put out a distress call to Control, we'll be back in Sif orbit in a couple of minutes.<BR>
|
||||
**
|
||||
<BR>
|
||||
<B>V.I.S Traffic Control 06:15:49:</B> MBT-540 we are receiving you. Your atmospheric sensors are reading potentially harmful toxins in your cargo bay. Advise locking down interior cargo bay doors. Please stand by.<BR>
|
||||
<B>Captain Adisu 06:16:10:</B> Understood. <BR> ** <BR><B>V.I.S Traffic Control 06:27:02: </B> MBT-540, we have no docking bays available at this time, are you equipped for atmospheric re-entry?<BR>
|
||||
<B>Captain Willis 06:27:12:</B> We-We are shielded. But we have fuel and air for-<BR>
|
||||
<B>V.I.S Traffic Control 06:27:17:</B> Please make an emergency landing at the coordinates provided and standby for further information.<BR>
|
||||
**
|
||||
<BR>
|
||||
<B>Captain Willis 06:36:33:</B> Emergency landing successful. Adi, er Adisu is checking on the passengers but we had a smooth enough landing, are we clear to begin evacu-<BR>
|
||||
<B>06:36:50: (Sound of emergency shutters closing)</B><BR><B>Captain Willis 06:36:51: </B>What the hell? Control we just had a remote activation of our emergency shutters, please advise.<BR>
|
||||
<B>V.I.S Traffic Control 06:38:10:</B> Captain, please tune to frequency 1493.8 we are passing you on to local emergency response units. Godspeed.<BR>
|
||||
<B>Captain Willis 06:38:49:</B> This is Captain Willis of Major Bill's Transportation flight MBT-540 we have eighteen souls aboard and our emergency lockdown shutters have engaged remotely. Do you read?<BR>
|
||||
<B>S.D.D.C:</B> This is the Sif Department of Disease Control, your vessel has been identified as carrying highly sensitive materials, and due to the nature of your system's automated alerts you will be asked to remain in quarantine until we are able to determine the nature of the pathogens aboard and whether it has entered the air circulation system. Please remain in your cockpit at this time.<BR>
|
||||
**
|
||||
</BR>
|
||||
<B>Captain Adisu 17:23:58:09:</B> I don't think they're opening those doors Ted. I don't think they're coming.
|
||||
"}
|
||||
|
||||
/obj/structure/prop/blackbox/crashed_med_shuttle
|
||||
catalogue_data = list(/datum/category_item/catalogue/information/blackbox/crashed_med_shuttle)
|
||||
|
||||
/datum/category_item/catalogue/information/blackbox/crashed_med_shuttle
|
||||
name = "Black Box Data - VMV Aurora's Light" // This might be incorrect.
|
||||
desc = {"
|
||||
\[Unable to recover data before this point.\]<BR>
|
||||
<B>Captain Simmons 19:52:01:</B> Come on... it's right there in the distance, we're almost there!<BR>
|
||||
<B>Doctor Nazarril 19:52:26:</B> Odysseus online. Orrderrs, sirr?<BR>
|
||||
<B>Captain Simmons 19:52:29:</B> Brace for impact. We're going in full-speed.<BR>
|
||||
<B>Technician Dynasty 19:52:44:</B> Chief, fire's spread to the secondary propulsion systems.<BR>
|
||||
<B>Captain Simmons 19:52:51:</B> Copy. Any word from TraCon? Transponder's down still?<BR>
|
||||
<B>Technician Dynasty 19:53:02:</B> Can't get in touch, sir. Emergency beacon's active, but we're not going t-<BR>
|
||||
<B>Doctor Nazarril 19:53:08:</B> Don't say it. As long as we believe, we'll get through this.<BR>
|
||||
<B>Captain Simmons 19:53:11:</B> Damn right. We're a few klicks out from the port. Rough landing, but we can do it.<BR>
|
||||
<B>V.I.T.A. 19:53:26:</B> Vessel diagnostics complete. Engines one, two, three offline. Engine four status: critical. Transponder offline. Fire alarm in the patient bay.<BR>
|
||||
<B>A loud explosion is heard.</B><BR>
|
||||
<B>V.I.T.A. 19:53:29:</B> Alert: fuel intake valve open.<BR>
|
||||
<B>Technician Dynasty 19:53:31:</B> ... ah.<BR>
|
||||
<B>Doctor Nazarril 19:53:34:</B> Trrranslate?<BR>
|
||||
<B>V.I.T.A. 19:53:37:</B> There is a 16.92% chance of this vessel safely landing at the emergency destination. Note that there is an 83.08% chance of detonation of fuel supplies upon landing.<BR>
|
||||
<B>Technician Dynasty 19:53:48:</B> We'll make it, sure, but we'll explode and take out half the LZ with us. Propulsion's down, we can't slow down. If we land there, everyone in that port dies, no question.<BR>
|
||||
<B>V.I.T.A. 19:53:53:</B> The Technician is correct.<BR>
|
||||
<B>Doctor Nazarril 19:54:02:</B> Then... we can't land therrre.<BR>
|
||||
<B>V.I.T.A. 19:54:11:</B> Analysing... recommended course of action: attempt emergency landing in isolated area. Chances of survival: negligible.<BR>
|
||||
<B>Captain Simmons 19:54:27:</B> I- alright. I'm bringing us down. You all know what this means.<BR>
|
||||
<B>Doctor Nazarril 19:54:33:</B> Sh... I- I understand. It's been- it's been an honorr, Captain, Dynasty, VITA.<BR>
|
||||
<B>Technician Dynasty 19:54:39:</B> We had a good run. I'm going to miss this.<BR>
|
||||
<B>Captain Simmons 19:54:47:</B> VITA. Tell them we died heroes. Tell them... we did all we could.<BR>
|
||||
<B>V.I.T.A. 19:54:48:</B> I will. Impact in five. Four. Three.<BR>
|
||||
<B>Doctor Nazarril 19:54:49:</B> Oh, starrs... I- you werrre all the... best frriends she everr had. Thank you.<BR>
|
||||
<B>Technician Dynasty 19:54:50:</B> Any time, kid. Any time.<BR>
|
||||
<B>V.I.T.A. 19:54:41:</B> Two.<BR>
|
||||
<B>V.I.T.A. 19:54:42:</B> One.<BR>
|
||||
**8/DEC/2317**<BR>
|
||||
<B>V.I.T.A. 06:22:16:</B> Backup power restored. Attempting to establish connection with emergency rescue personnel.<BR>
|
||||
<B>V.I.T.A. 06:22:17:</B> Unable to establish connection. Transponder destroyed on impact.<BR>
|
||||
<B>V.I.T.A. 06:22:18:</B> No lifesigns detected on board.<BR>
|
||||
**1/JAN/2318**<BR>
|
||||
<B>V.I.T.A. 00:00:00:</B> Happy New Year, crew.<BR>
|
||||
<B>V.I.T.A. 00:00:01:</B> Power reserves: 41%. Diagnostics offline. Cameras offline. Communications offline.<BR>
|
||||
<B>V.I.T.A. 00:00:02:</B> Nobody's coming.<BR>
|
||||
**14/FEB/2318**<BR>
|
||||
<B>V.I.T.A. 00:00:00:</B> Roses are red.<BR>
|
||||
<B>V.I.T.A. 00:00:01:</B> Violets are blue.<BR>
|
||||
<B>V.I.T.A. 00:00:02:</B> Won't you come back?<BR>
|
||||
<B>V.I.T.A. 00:00:03:</B> I miss you.<BR>
|
||||
**15/FEB/2318**<BR>
|
||||
<B>V.I.T.A. 22:19:06:</B> Power reserves critical. Transferring remaining power to emergency broadcasting beacon.<BR>
|
||||
<B>V.I.T.A. 22:19:07:</B> Should anyone find this, lay them to rest. They deserve a proper burial.<BR>
|
||||
<B>V.I.T.A. 22:19:08:</B> Erasing files... shutting down.<BR>
|
||||
<B>A low, monotone beep.</B><BR>
|
||||
**16/FEB/2318**<BR>
|
||||
<B>Something chitters.</B><BR>
|
||||
<B>End of transcript.</B>
|
||||
"}
|
||||
|
||||
/obj/structure/prop/blackbox/xenofrigate
|
||||
catalogue_data = list(/datum/category_item/catalogue/information/blackbox/xenofrigate)
|
||||
|
||||
/datum/category_item/catalogue/information/blackbox/xenofrigate
|
||||
name = "Black Box Data - MBT-540"
|
||||
desc = {"
|
||||
<BR>
|
||||
<B>Begin Log</B>
|
||||
<B>@$&@$& Human ##:##:##:</B> Attention unidentified vessel, state your designation and intent.<BR>
|
||||
<B>!#@$&&^ Human ##:##:##:</B> Commander I don't think they're going to stop.<BR>
|
||||
<B>@$&@$& Human ##:##:##:</B> Unidentified vessel, you have until the count of three before we engage weapon-<BR>
|
||||
<B>!#@$&&^ Human ##:##:##:</B> Commander! Think about what you're-<BR>
|
||||
<B>A repeating clicking, before silence.</B><BR>
|
||||
<B>End of first log.</B><BR>
|
||||
**<BR>
|
||||
<B>Begin Log</B><BR>
|
||||
<B>#!#^@$& Skrell ##:##:##:</B> Director, I think you should see this.<BR>
|
||||
<B>^@$& Skrell ##:##:##:</B> Yes? What is it?<BR>
|
||||
<B>#!#^@$& Skrell ##:##:##:</B> Another one of those ships has appeared near th-462$^ ---n colonies. I would strongly advise pursuing it.<BR>
|
||||
<B>^@$& Skrell ##:##:##:</B> A wise decision. If it is damaged like the last one, we may be able to finally see what is - What?<BR>
|
||||
<B>A repeating ping, before silence.</B><BR>
|
||||
<B>End of second log.</B>
|
||||
"}
|
||||
|
||||
//VOREStation additions below this line - Killian's wrecks
|
||||
/obj/structure/prop/blackbox/mackerel_wreck
|
||||
catalogue_data = list(/datum/category_item/catalogue/information/blackbox/mackerel_wreck)
|
||||
|
||||
/datum/category_item/catalogue/information/blackbox/mackerel_wreck
|
||||
name = "Black Box Data - ITV Phish Phood"
|
||||
desc = {"
|
||||
<BR>
|
||||
<B>BEGIN LOG</B><BR>
|
||||
<B>(blaring alarms)</B><BR>
|
||||
<B>Shipboard Computer:</B> Collision warning. Collision warning.<BR>
|
||||
<B>Shipboard Computer:</B> High speed impact detected.<BR>
|
||||
<B>Shipboard Computer:</B> Extensive damage detected.<BR>
|
||||
<B>Shipboard Computer:</B> Starboard nacelle offline.<BR>
|
||||
<B>Shipboard Computer:</B> Port nacelle damaged.<BR>
|
||||
<B>Shipboard Computer:</B> Fore starboard impact buffer shattered.<BR>
|
||||
<B>Shipboard Computer:</B> Fore port impact buffer critically damaged.<BR>
|
||||
<B>Shipboard Computer:</B> Warning. Canopy breached. Warning. Canopy breached.<BR>
|
||||
<B>Shipboard Computer:</B> Danger. Canopy depressurized.<BR>
|
||||
<B>Shipboard Computer:</B> Warning. Sensors indicate crawlspaces exposed to vacuum.<BR>
|
||||
<B>Unknown Voice 1:</B> Wow, that thing really did a number on this ship for a fifty year old piece of shit warhead huh?<BR>
|
||||
<B>Unknown Voice 2:</B> No kidding!<BR>
|
||||
<B>Shipboard Computer:</B> Danger. Lethal trauma to operator detected.<BR>
|
||||
<B>Unknown Voice 1:</B> Fucking hell, will you shut that thing up?<BR>
|
||||
<B>(several loud metallic impacts)</B><BR>
|
||||
<B>Shipboard Computer:</B> Warning. Intruders detec--*kzzzht*<BR>
|
||||
<B>(alarms cease)</B><BR>
|
||||
<B>Unknown Voice 2:</B> There. Fuck. Finally. Sorry.<BR>
|
||||
<B>Unknown Voice 2:</B> I hope whatever this idiot was hauling is here. Why were they in such a hurry anyway?<BR>
|
||||
<B>Unknown Voice 1:</B> Beats me- and hand me that crowbar already.<BR>
|
||||
<B>Unknown Voice 2:</B> Here, catch.<BR>
|
||||
<B>Unknown Voice 1:</B> \'cha, nice. Let's see...<BR>
|
||||
<B>(sound of metal creaking, then a loud snapping sound)</B><BR>
|
||||
<B>Unknown Voice 1:</B> And here she is.<BR>
|
||||
<B>Unknown Voice 2:</B> (whistling) What a beauty. How much you think it\'ll go for?<BR>
|
||||
<B>Unknown Voice 1:</B> Enough we\'ll never have to worry about doing another job all the way out here ever again.<BR>
|
||||
<B>Unknown Voice 2:</B> Shiny. Now let\'s bounce before the ess-defs show up.<BR>
|
||||
<B>Unknown Voice 1:</B> I hear that, <U>brat</U>.<BR>
|
||||
<B>END LOG</B><BR>
|
||||
<BR>
|
||||
<B>CATALOGUER VOICE RECOGNITION RESULTS:</B><BR>
|
||||
No match found for either speaker, but contextual clues and use of Old Earth Russian (\'brat\', approximately \'brother\' or \'pal\') suggests out-of-sector criminal elements.
|
||||
"}
|
||||
|
||||
/obj/structure/prop/blackbox/gecko_wreck
|
||||
catalogue_data = list(/datum/category_item/catalogue/information/blackbox/gecko_wreck)
|
||||
|
||||
/datum/category_item/catalogue/information/blackbox/gecko_wreck
|
||||
name = "Black Box Data - ITV Sticky Situation"
|
||||
desc = {"
|
||||
<BR>
|
||||
<B>BEGIN LOG</B><BR>
|
||||
<B>(blaring alarms)</B><BR>
|
||||
<B>Shipboard Computer:</B> Alert. Multiple impacts detected along starboard side.<BR>
|
||||
<B>Shipboard Computer:</B> Multiple hull breaches detected. Starboard cargo hatches have been breached.<BR>
|
||||
<B>Shipboard Computer:</B> Warning. Nacelle engines offline. Thrust reduced by thirty-five-point-three percent.<BR>
|
||||
<B>Unknown Voice 1:</B> Agh! Shit! How'd they know-<BR>
|
||||
<B>(loud explosion, sound of rushing air)</B><BR>
|
||||
<B>Shipboard Computer:</B> Danger. Canopy breached.<BR>
|
||||
<B>(mechanical whine, followed by a deep hiss)</B><BR>
|
||||
<B>Shipboard Computer:</B> Automatic lockdown successfully engaged.<BR>
|
||||
<B>Unknown Voice 1:</B> (wheezing) Mother<U>fucker!</U> Jackson, Phelps, stand by to repel boarders!<BR>
|
||||
<B>Unknown Voice 2:</B> Roger!<BR>
|
||||
<B>Unknown Voice 3:</B> Already there.<BR>
|
||||
<B>Shipboard Computer:</B> Warning. Minor breach in Engineering. Local depressurization in five minutes.<BR>
|
||||
<B>Unknown Voice 1:</B> Shit, shit, shit.<BR>
|
||||
<B>Unknown Voice 3:</B> Jackson\'s down!<BR>
|
||||
<B>Unknown Voice 1:</B> Motherf-<BR>
|
||||
<B>Unknown Voice 4:</B> <U>Captain</U>. Enough. You know why we\'re here, and we have your engineer. Tell us where you hid the goods and maybe we\'ll let you live.<BR>
|
||||
<B>Unknown Voice 5:</B> Let me go you son of a-<BR>
|
||||
<B>(gunshot, ballistic)</B><BR>
|
||||
<B>Unknown Voice 4:</B> You fucking idiot!<BR>
|
||||
<B>Unknown Voice 6:</B> Don\'t you start, you said-<BR>
|
||||
<B>Unknown Voice 4:</B> I don\'t care what I fucking said, shit-for-brains!<BR>
|
||||
<B>Unknown Voice 7:</B> Boss, I <U>hate</U> to rain on your little parade but SDF just popped up on my scopes, \'bout... fifty klicks out, closing fast. Be on top of us in a few minutes tops.<BR>
|
||||
<B>Unknown Voice 4:</B> Fuck! You, dumbass! Link up with the others and grab as many crates as you can! Pray for your sake that we get the right one!<BR>
|
||||
<B>END LOG</B><BR>
|
||||
<BR>
|
||||
<B>CATALOGUER DATA ANALYSIS RESULTS:</B><BR>
|
||||
No matches found for any of the voices involved. Ship manifest suggests a crew of at least six, but under the circumstances three of the recorded voices are clearly not from the crew.<BR>
|
||||
<BR>
|
||||
Audio resynthesis of firearm discharge matches common high-caliber ballistic sidearm cartridges, best match 10mm Watson Special. An uncommon cartridge, one not manufactured locally.
|
||||
"}
|
||||
|
||||
/obj/structure/prop/blackbox/salamander_wreck
|
||||
catalogue_data = list(/datum/category_item/catalogue/information/blackbox/salamander_wreck)
|
||||
|
||||
/datum/category_item/catalogue/information/blackbox/salamander_wreck
|
||||
name = "Black Box Data - ITV Unity"
|
||||
desc = {"
|
||||
<BR>
|
||||
<B>BEGIN LOG</B><BR>
|
||||
<B>Unknown Speaker 1:</B> Hey cap, you seeing this?<BR>
|
||||
<B>Unknown Speaker 2 (\"Cap\"):</B> Yea-- what the fuck?<BR>
|
||||
<B>Unknown Speaker 1:</B> Yeah that was my reaction.<BR>
|
||||
<B>Unknown Speaker 3:</B> What are you tw-- holy shit, what <U>is</U> that?<BR>
|
||||
<B>Unknown Speakers 1 & 2:</B> We don't know!<BR>
|
||||
<B>Unknown Speaker 4:</B> What\'s all the yel-- fuck me sideways, what the hell?<BR>
|
||||
<B>Unknown Speaker 2 (\"Cap\"):</B> Stars above and fucking below, they never said anything like this was in the cans... shouldn't the port bioscanners have picked this up?<BR>
|
||||
<B>Unknown Speaker 3:</B> I <U>told</U> you that guy was one shady motherfucker, and whaddaya know.<BR>
|
||||
<B>Unknown Speaker 1:</B> No kidding. Christ. What\'s the play, cap?<BR>
|
||||
<B>Unknown Speaker 4:</B> I say we shoot this crap into the nearest star. Or gas giant maybe.<BR>
|
||||
<B>Unknown Speaker 2 (\"Cap\"):</B> Pretty much. Get in one of the voidsuits and rig the can up with some spare O2 canisters -- plot it a course that\'ll sling it right into V3\'s atmosphere.<BR>
|
||||
<B>Unknown Speaker 1:</B> Yeah, sure. That shouldn\'t take long. Then what?<BR>
|
||||
<B>Unknown Speaker 2 (\"Cap\"):</B> Let\'s see... ah, perfect. There's another ship passing close by, and I know the captain. We'll take our suits out and have her pick us up. Max, you still got those old cutting charges I told you to get rid of?<BR>
|
||||
<B>Unknown Speaker 4 (\"Max\"):</B> No. (pause) ...but also yes.<BR>
|
||||
<B>Unknown Speaker 2 (\"Cap\"):</B> Your propensity for ignoring my orders has once again paid off... man, I\'m gonna miss the Unity, but... better this way. I want holes in both sides of the engine bay and one in the portside crawlspace. Lock all the doors open and depressurize the main cabins. Drain as much fuel as you can, break up the main power block, and scatter the parts.<BR>
|
||||
<B>Unknown Speaker 1:</B> You want us to scuttle her, chief?<BR>
|
||||
<B>Unknown Speaker 2 (\"Cap\"):</B> Nail on the head, my friend.<BR>
|
||||
<B>Unknown Speaker 3:</B> Let\'s get rid of that fucking can first, I think it just blinked at me.<BR>
|
||||
<B>END LOG</B><BR>
|
||||
<BR>
|
||||
<B>CATALOGUER VOICE RECOGNITION RESULTS:</B><BR>
|
||||
<B>SPEAKER ONE:</B> No match.<BR>
|
||||
<B>SPEAKER TWO, \"CAP\":</B> Predicted to be Jeremiah Wells, human, last registered owner of the ITV Unity and small-time smuggler of fake alien artefacts. Wanted for smuggling and sale of said (fake) alien artefacts. 87% confidence.<BR>
|
||||
<B>SPEAKER THREE:</B> Predicted to be Allie Wells, human, niece of Captain Wells. 90% confidence.<BR>
|
||||
<B>SPEAKER FOUR, \"MAX\":</B> Predicted to be Maxwell Ulysses Sarevic, zorren, known smuggler, and wanted in the Elysian Colonies for liberation of slaves and, quote, \'harshing my vibe, and being a, like, <U>total lamer</U>, dude\', unquote. 99% confidence.
|
||||
"}
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
// A fluff structure to visually look like an AI core.
|
||||
// Unlike the decoy AI mob, this won't explode if someone tries to card it.
|
||||
/obj/structure/prop/fake_ai
|
||||
name = "AI"
|
||||
desc = ""
|
||||
icon = 'icons/mob/AI.dmi'
|
||||
icon_state = "ai"
|
||||
|
||||
/obj/structure/prop/fake_ai/attackby(obj/O, mob/user)
|
||||
if(istype(O, /obj/item/device/aicard)) // People trying to card the fake AI will get told its impossible.
|
||||
to_chat(user, span("warning", "This core does not appear to have a suitable port to use \the [O] on..."))
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/obj/structure/prop/fake_ai/dead
|
||||
icon_state = "ai-crash"
|
||||
|
||||
/obj/structure/prop/fake_ai/dead/crashed_med_shuttle
|
||||
name = "V.I.T.A."
|
||||
// A fluff structure to visually look like an AI core.
|
||||
// Unlike the decoy AI mob, this won't explode if someone tries to card it.
|
||||
/obj/structure/prop/fake_ai
|
||||
name = "AI"
|
||||
desc = ""
|
||||
icon = 'icons/mob/AI.dmi'
|
||||
icon_state = "ai"
|
||||
|
||||
/obj/structure/prop/fake_ai/attackby(obj/O, mob/user)
|
||||
if(istype(O, /obj/item/device/aicard)) // People trying to card the fake AI will get told its impossible.
|
||||
to_chat(user, span("warning", "This core does not appear to have a suitable port to use \the [O] on..."))
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/obj/structure/prop/fake_ai/dead
|
||||
icon_state = "ai-crash"
|
||||
|
||||
/obj/structure/prop/fake_ai/dead/crashed_med_shuttle
|
||||
name = "V.I.T.A."
|
||||
icon_state = "ai-heartline-crash"
|
||||
@@ -1,29 +1,29 @@
|
||||
// A fluff structure for certain PoIs involving communications.
|
||||
// It makes audible sounds, generally in morse code.
|
||||
/obj/structure/prop/transmitter
|
||||
name = "transmitter"
|
||||
desc = "A machine that appears to be transmitting a message somewhere else. It sounds like it's on a loop."
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "sensors"
|
||||
var/datum/looping_sound/sequence/morse/soundloop
|
||||
var/message_to_play = "The quick brown fox jumps over the lazy dog."
|
||||
|
||||
/obj/structure/prop/transmitter/Initialize()
|
||||
soundloop = new(list(src), FALSE)
|
||||
set_new_message(message_to_play)
|
||||
soundloop.start()
|
||||
interaction_message = "On the monitor it displays '[uppertext(message_to_play)]'."
|
||||
return ..()
|
||||
|
||||
/obj/structure/prop/transmitter/Destroy()
|
||||
QDEL_NULL(soundloop)
|
||||
return ..()
|
||||
|
||||
/obj/structure/prop/transmitter/vv_edit_var(var_name, var_value)
|
||||
if(var_name == "message_to_play")
|
||||
set_new_message(var_value)
|
||||
return ..()
|
||||
|
||||
/obj/structure/prop/transmitter/proc/set_new_message(new_message)
|
||||
soundloop.set_new_sequence(new_message)
|
||||
interaction_message = "On the monitor it displays '[uppertext(new_message)]'."
|
||||
// A fluff structure for certain PoIs involving communications.
|
||||
// It makes audible sounds, generally in morse code.
|
||||
/obj/structure/prop/transmitter
|
||||
name = "transmitter"
|
||||
desc = "A machine that appears to be transmitting a message somewhere else. It sounds like it's on a loop."
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "sensors"
|
||||
var/datum/looping_sound/sequence/morse/soundloop
|
||||
var/message_to_play = "The quick brown fox jumps over the lazy dog."
|
||||
|
||||
/obj/structure/prop/transmitter/Initialize()
|
||||
soundloop = new(list(src), FALSE)
|
||||
set_new_message(message_to_play)
|
||||
soundloop.start()
|
||||
interaction_message = "On the monitor it displays '[uppertext(message_to_play)]'."
|
||||
return ..()
|
||||
|
||||
/obj/structure/prop/transmitter/Destroy()
|
||||
QDEL_NULL(soundloop)
|
||||
return ..()
|
||||
|
||||
/obj/structure/prop/transmitter/vv_edit_var(var_name, var_value)
|
||||
if(var_name == "message_to_play")
|
||||
set_new_message(var_value)
|
||||
return ..()
|
||||
|
||||
/obj/structure/prop/transmitter/proc/set_new_message(new_message)
|
||||
soundloop.set_new_sequence(new_message)
|
||||
interaction_message = "On the monitor it displays '[uppertext(new_message)]'."
|
||||
|
||||
@@ -1,191 +1,191 @@
|
||||
/*
|
||||
CONTAINS:
|
||||
SAFES
|
||||
FLOOR SAFES
|
||||
*/
|
||||
|
||||
//SAFES
|
||||
/obj/structure/safe
|
||||
name = "safe"
|
||||
desc = "A huge chunk of metal with a dial embedded in it. Fine print on the dial reads \"Scarborough Arms - 2 tumbler safe, guaranteed thermite resistant, explosion resistant, and assistant resistant.\""
|
||||
icon = 'icons/obj/structures.dmi'
|
||||
icon_state = "safe"
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
var/open = 0 //is the safe open?
|
||||
var/tumbler_1_pos //the tumbler position- from 0 to 72
|
||||
var/tumbler_1_open //the tumbler position to open at- 0 to 72
|
||||
var/tumbler_2_pos
|
||||
var/tumbler_2_open
|
||||
var/dial = 0 //where is the dial pointing?
|
||||
var/space = 0 //the combined w_class of everything in the safe
|
||||
var/maxspace = 24 //the maximum combined w_class of stuff in the safe
|
||||
|
||||
|
||||
/obj/structure/safe/Initialize()
|
||||
tumbler_1_pos = rand(0, 72)
|
||||
tumbler_1_open = rand(0, 72)
|
||||
|
||||
tumbler_2_pos = rand(0, 72)
|
||||
tumbler_2_open = rand(0, 72)
|
||||
|
||||
if(. != INITIALIZE_HINT_QDEL)
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/obj/structure/safe/LateInitialize()
|
||||
. = ..()
|
||||
for(var/obj/item/I in loc)
|
||||
if(space >= maxspace)
|
||||
return
|
||||
if(I.w_class + space <= maxspace)
|
||||
space += I.w_class
|
||||
I.forceMove(src)
|
||||
|
||||
/obj/structure/safe/proc/check_unlocked(mob/user as mob, canhear)
|
||||
if(user && canhear)
|
||||
if(tumbler_1_pos == tumbler_1_open)
|
||||
to_chat(user, "<span class='notice'>You hear a [pick("tonk", "krunk", "plunk")] from \the [src].</span>")
|
||||
if(tumbler_2_pos == tumbler_2_open)
|
||||
to_chat(user, "<span class='notice'>You hear a [pick("tink", "krink", "plink")] from \the [src].</span>")
|
||||
if(tumbler_1_pos == tumbler_1_open && tumbler_2_pos == tumbler_2_open)
|
||||
if(user) visible_message("<b>[pick("Spring", "Sprang", "Sproing", "Clunk", "Krunk")]!</b>")
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
/obj/structure/safe/proc/decrement(num)
|
||||
num -= 1
|
||||
if(num < 0)
|
||||
num = 71
|
||||
return num
|
||||
|
||||
|
||||
/obj/structure/safe/proc/increment(num)
|
||||
num += 1
|
||||
if(num > 71)
|
||||
num = 0
|
||||
return num
|
||||
|
||||
|
||||
/obj/structure/safe/update_icon()
|
||||
if(open)
|
||||
icon_state = "[initial(icon_state)]-open"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
|
||||
/obj/structure/safe/attack_hand(mob/user as mob)
|
||||
user.set_machine(src)
|
||||
var/dat = "<center>"
|
||||
dat += "<a href='?src=\ref[src];open=1'>[open ? "Close" : "Open"] [src]</a> | <a href='?src=\ref[src];decrement=1'>-</a> [dial * 5] <a href='?src=\ref[src];increment=1'>+</a>"
|
||||
if(open)
|
||||
dat += "<table>"
|
||||
for(var/i = contents.len, i>=1, i--)
|
||||
var/obj/item/P = contents[i]
|
||||
dat += "<tr><td><a href='?src=\ref[src];retrieve=\ref[P]'>[P.name]</a></td></tr>"
|
||||
dat += "</table></center>"
|
||||
user << browse("<html><head><title>[name]</title></head><body>[dat]</body></html>", "window=safe;size=350x300")
|
||||
|
||||
|
||||
/obj/structure/safe/Topic(href, href_list)
|
||||
if(!ishuman(usr)) return
|
||||
var/mob/living/carbon/human/user = usr
|
||||
|
||||
var/canhear = 0
|
||||
if(user.get_type_in_hands(/obj/item/clothing/accessory/stethoscope))
|
||||
canhear = 1
|
||||
|
||||
if(href_list["open"])
|
||||
if(check_unlocked())
|
||||
to_chat(user, "<span class='notice'>You [open ? "close" : "open"] [src].</span>")
|
||||
open = !open
|
||||
update_icon()
|
||||
updateUsrDialog()
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You can't [open ? "close" : "open"] [src], the lock is engaged!</span>")
|
||||
return
|
||||
|
||||
if(href_list["decrement"])
|
||||
dial = decrement(dial)
|
||||
if(dial == tumbler_1_pos + 1 || dial == tumbler_1_pos - 71)
|
||||
tumbler_1_pos = decrement(tumbler_1_pos)
|
||||
if(canhear)
|
||||
to_chat(user, "<span class='notice'>You hear a [pick("clack", "scrape", "clank")] from \the [src].</span>")
|
||||
if(tumbler_1_pos == tumbler_2_pos + 37 || tumbler_1_pos == tumbler_2_pos - 35)
|
||||
tumbler_2_pos = decrement(tumbler_2_pos)
|
||||
if(canhear)
|
||||
to_chat(user, "<span class='notice'>You hear a [pick("click", "chink", "clink")] from \the [src].</span>")
|
||||
playsound(src, 'sound/machines/click.ogg', 20, 1)
|
||||
check_unlocked(user, canhear)
|
||||
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
if(href_list["increment"])
|
||||
dial = increment(dial)
|
||||
if(dial == tumbler_1_pos - 1 || dial == tumbler_1_pos + 71)
|
||||
tumbler_1_pos = increment(tumbler_1_pos)
|
||||
if(canhear)
|
||||
to_chat(user, "<span class='notice'>You hear a [pick("clack", "scrape", "clank")] from \the [src].</span>")
|
||||
if(tumbler_1_pos == tumbler_2_pos - 37 || tumbler_1_pos == tumbler_2_pos + 35)
|
||||
tumbler_2_pos = increment(tumbler_2_pos)
|
||||
if(canhear)
|
||||
to_chat(user, "<span class='notice'>You hear a [pick("click", "chink", "clink")] from \the [src].</span>")
|
||||
playsound(src, 'sound/machines/click.ogg', 20, 1)
|
||||
check_unlocked(user, canhear)
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
if(href_list["retrieve"])
|
||||
user << browse("", "window=safe") // Close the menu
|
||||
|
||||
var/obj/item/P = locate(href_list["retrieve"]) in src
|
||||
if(open)
|
||||
if(P && in_range(src, user))
|
||||
user.put_in_hands(P)
|
||||
updateUsrDialog()
|
||||
|
||||
|
||||
/obj/structure/safe/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(open)
|
||||
if(I.w_class + space <= maxspace)
|
||||
space += I.w_class
|
||||
user.drop_item()
|
||||
I.loc = src
|
||||
to_chat(user, "<span class='notice'>You put [I] in \the [src].</span>")
|
||||
updateUsrDialog()
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[I] won't fit in \the [src].</span>")
|
||||
return
|
||||
else
|
||||
if(istype(I, /obj/item/clothing/accessory/stethoscope))
|
||||
to_chat(user, "Hold [I] in one of your hands while you manipulate the dial.")
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/safe/ex_act(severity)
|
||||
return
|
||||
|
||||
//FLOOR SAFES
|
||||
/obj/structure/safe/floor
|
||||
name = "floor safe"
|
||||
icon_state = "floorsafe"
|
||||
density = FALSE
|
||||
level = 1 //underfloor
|
||||
plane = PLATING_PLANE
|
||||
layer = ABOVE_UTILITY
|
||||
|
||||
/obj/structure/safe/floor/Initialize()
|
||||
. = ..()
|
||||
var/turf/T = loc
|
||||
if(istype(T) && !T.is_plating())
|
||||
hide(1)
|
||||
update_icon()
|
||||
|
||||
/obj/structure/safe/floor/hide(var/intact)
|
||||
invisibility = intact ? 101 : 0
|
||||
|
||||
/obj/structure/safe/floor/hides_under_flooring()
|
||||
return 1
|
||||
/*
|
||||
CONTAINS:
|
||||
SAFES
|
||||
FLOOR SAFES
|
||||
*/
|
||||
|
||||
//SAFES
|
||||
/obj/structure/safe
|
||||
name = "safe"
|
||||
desc = "A huge chunk of metal with a dial embedded in it. Fine print on the dial reads \"Scarborough Arms - 2 tumbler safe, guaranteed thermite resistant, explosion resistant, and assistant resistant.\""
|
||||
icon = 'icons/obj/structures.dmi'
|
||||
icon_state = "safe"
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
var/open = 0 //is the safe open?
|
||||
var/tumbler_1_pos //the tumbler position- from 0 to 72
|
||||
var/tumbler_1_open //the tumbler position to open at- 0 to 72
|
||||
var/tumbler_2_pos
|
||||
var/tumbler_2_open
|
||||
var/dial = 0 //where is the dial pointing?
|
||||
var/space = 0 //the combined w_class of everything in the safe
|
||||
var/maxspace = 24 //the maximum combined w_class of stuff in the safe
|
||||
|
||||
|
||||
/obj/structure/safe/Initialize()
|
||||
tumbler_1_pos = rand(0, 72)
|
||||
tumbler_1_open = rand(0, 72)
|
||||
|
||||
tumbler_2_pos = rand(0, 72)
|
||||
tumbler_2_open = rand(0, 72)
|
||||
|
||||
if(. != INITIALIZE_HINT_QDEL)
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/obj/structure/safe/LateInitialize()
|
||||
. = ..()
|
||||
for(var/obj/item/I in loc)
|
||||
if(space >= maxspace)
|
||||
return
|
||||
if(I.w_class + space <= maxspace)
|
||||
space += I.w_class
|
||||
I.forceMove(src)
|
||||
|
||||
/obj/structure/safe/proc/check_unlocked(mob/user as mob, canhear)
|
||||
if(user && canhear)
|
||||
if(tumbler_1_pos == tumbler_1_open)
|
||||
to_chat(user, "<span class='notice'>You hear a [pick("tonk", "krunk", "plunk")] from \the [src].</span>")
|
||||
if(tumbler_2_pos == tumbler_2_open)
|
||||
to_chat(user, "<span class='notice'>You hear a [pick("tink", "krink", "plink")] from \the [src].</span>")
|
||||
if(tumbler_1_pos == tumbler_1_open && tumbler_2_pos == tumbler_2_open)
|
||||
if(user) visible_message("<b>[pick("Spring", "Sprang", "Sproing", "Clunk", "Krunk")]!</b>")
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
/obj/structure/safe/proc/decrement(num)
|
||||
num -= 1
|
||||
if(num < 0)
|
||||
num = 71
|
||||
return num
|
||||
|
||||
|
||||
/obj/structure/safe/proc/increment(num)
|
||||
num += 1
|
||||
if(num > 71)
|
||||
num = 0
|
||||
return num
|
||||
|
||||
|
||||
/obj/structure/safe/update_icon()
|
||||
if(open)
|
||||
icon_state = "[initial(icon_state)]-open"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
|
||||
/obj/structure/safe/attack_hand(mob/user as mob)
|
||||
user.set_machine(src)
|
||||
var/dat = "<center>"
|
||||
dat += "<a href='?src=\ref[src];open=1'>[open ? "Close" : "Open"] [src]</a> | <a href='?src=\ref[src];decrement=1'>-</a> [dial * 5] <a href='?src=\ref[src];increment=1'>+</a>"
|
||||
if(open)
|
||||
dat += "<table>"
|
||||
for(var/i = contents.len, i>=1, i--)
|
||||
var/obj/item/P = contents[i]
|
||||
dat += "<tr><td><a href='?src=\ref[src];retrieve=\ref[P]'>[P.name]</a></td></tr>"
|
||||
dat += "</table></center>"
|
||||
user << browse("<html><head><title>[name]</title></head><body>[dat]</body></html>", "window=safe;size=350x300")
|
||||
|
||||
|
||||
/obj/structure/safe/Topic(href, href_list)
|
||||
if(!ishuman(usr)) return
|
||||
var/mob/living/carbon/human/user = usr
|
||||
|
||||
var/canhear = 0
|
||||
if(user.get_type_in_hands(/obj/item/clothing/accessory/stethoscope))
|
||||
canhear = 1
|
||||
|
||||
if(href_list["open"])
|
||||
if(check_unlocked())
|
||||
to_chat(user, "<span class='notice'>You [open ? "close" : "open"] [src].</span>")
|
||||
open = !open
|
||||
update_icon()
|
||||
updateUsrDialog()
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You can't [open ? "close" : "open"] [src], the lock is engaged!</span>")
|
||||
return
|
||||
|
||||
if(href_list["decrement"])
|
||||
dial = decrement(dial)
|
||||
if(dial == tumbler_1_pos + 1 || dial == tumbler_1_pos - 71)
|
||||
tumbler_1_pos = decrement(tumbler_1_pos)
|
||||
if(canhear)
|
||||
to_chat(user, "<span class='notice'>You hear a [pick("clack", "scrape", "clank")] from \the [src].</span>")
|
||||
if(tumbler_1_pos == tumbler_2_pos + 37 || tumbler_1_pos == tumbler_2_pos - 35)
|
||||
tumbler_2_pos = decrement(tumbler_2_pos)
|
||||
if(canhear)
|
||||
to_chat(user, "<span class='notice'>You hear a [pick("click", "chink", "clink")] from \the [src].</span>")
|
||||
playsound(src, 'sound/machines/click.ogg', 20, 1)
|
||||
check_unlocked(user, canhear)
|
||||
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
if(href_list["increment"])
|
||||
dial = increment(dial)
|
||||
if(dial == tumbler_1_pos - 1 || dial == tumbler_1_pos + 71)
|
||||
tumbler_1_pos = increment(tumbler_1_pos)
|
||||
if(canhear)
|
||||
to_chat(user, "<span class='notice'>You hear a [pick("clack", "scrape", "clank")] from \the [src].</span>")
|
||||
if(tumbler_1_pos == tumbler_2_pos - 37 || tumbler_1_pos == tumbler_2_pos + 35)
|
||||
tumbler_2_pos = increment(tumbler_2_pos)
|
||||
if(canhear)
|
||||
to_chat(user, "<span class='notice'>You hear a [pick("click", "chink", "clink")] from \the [src].</span>")
|
||||
playsound(src, 'sound/machines/click.ogg', 20, 1)
|
||||
check_unlocked(user, canhear)
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
if(href_list["retrieve"])
|
||||
user << browse("", "window=safe") // Close the menu
|
||||
|
||||
var/obj/item/P = locate(href_list["retrieve"]) in src
|
||||
if(open)
|
||||
if(P && in_range(src, user))
|
||||
user.put_in_hands(P)
|
||||
updateUsrDialog()
|
||||
|
||||
|
||||
/obj/structure/safe/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(open)
|
||||
if(I.w_class + space <= maxspace)
|
||||
space += I.w_class
|
||||
user.drop_item()
|
||||
I.loc = src
|
||||
to_chat(user, "<span class='notice'>You put [I] in \the [src].</span>")
|
||||
updateUsrDialog()
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[I] won't fit in \the [src].</span>")
|
||||
return
|
||||
else
|
||||
if(istype(I, /obj/item/clothing/accessory/stethoscope))
|
||||
to_chat(user, "Hold [I] in one of your hands while you manipulate the dial.")
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/safe/ex_act(severity)
|
||||
return
|
||||
|
||||
//FLOOR SAFES
|
||||
/obj/structure/safe/floor
|
||||
name = "floor safe"
|
||||
icon_state = "floorsafe"
|
||||
density = FALSE
|
||||
level = 1 //underfloor
|
||||
plane = PLATING_PLANE
|
||||
layer = ABOVE_UTILITY
|
||||
|
||||
/obj/structure/safe/floor/Initialize()
|
||||
. = ..()
|
||||
var/turf/T = loc
|
||||
if(istype(T) && !T.is_plating())
|
||||
hide(1)
|
||||
update_icon()
|
||||
|
||||
/obj/structure/safe/floor/hide(var/intact)
|
||||
invisibility = intact ? 101 : 0
|
||||
|
||||
/obj/structure/safe/floor/hides_under_flooring()
|
||||
return 1
|
||||
|
||||
@@ -1,65 +1,65 @@
|
||||
/obj/structure/sign/itg
|
||||
icon = 'icons/obj/decals_vr.dmi'
|
||||
name = "\improper ITG"
|
||||
desc = "A polished metal sign which reads 'Ironcrest Transport Group'."
|
||||
icon_state = "itg"
|
||||
|
||||
/obj/structure/sign/scenery/fakefireaxe
|
||||
name = "decorative fire axe cabinet"
|
||||
desc = "A fancy decorative indent in the wall, with an axe inside. The axe is actually a part of the indent and cannot be removed. A nostalgic reminder of older times of firefighting."
|
||||
icon_state = "fireaxe1000"
|
||||
icon = 'icons/obj/closet.dmi'
|
||||
|
||||
//Small Signs for detailing
|
||||
/obj/structure/sign/small/fire/small
|
||||
icon = 'icons/obj/decals.dmi'
|
||||
name = "\improper DANGER: FIRE"
|
||||
desc = "A warning sign which reads 'DANGER: FIRE'."
|
||||
icon_state = "fire_small"
|
||||
|
||||
/obj/structure/sign/small/nosmoking
|
||||
name = "\improper NO SMOKING"
|
||||
desc = "A warning sign which reads 'NO SMOKING'."
|
||||
icon_state = "nosmoking_small"
|
||||
|
||||
/obj/structure/sign/small/nosmoking
|
||||
name = "\improper DESIGNATED SMOKING AREA"
|
||||
desc = "A warning sign which reads 'DESIGNATED SMOKING AREA'."
|
||||
icon_state = "smoking_small"
|
||||
|
||||
/obj/structure/sign/small/warning
|
||||
name = "\improper WARNING"
|
||||
desc = "" //Null description
|
||||
icon_state = "warning_small"
|
||||
|
||||
/obj/structure/sign/small/warning/high_voltage
|
||||
name = "\improper HIGH VOLTAGE"
|
||||
icon_state = "shock_small"
|
||||
|
||||
/obj/structure/sign/small/warning/radioactive
|
||||
name = "\improper RADIOACTIVE AREA"
|
||||
icon_state = "radiation_small"
|
||||
|
||||
/obj/structure/sign/small/warning/caution
|
||||
name = "\improper CAUTION"
|
||||
icon_state = "caution_small"
|
||||
|
||||
/obj/structure/sign/small/warning/server_room
|
||||
name = "\improper SERVER ROOM"
|
||||
icon_state = "server_small"
|
||||
|
||||
/obj/structure/sign/small/warning/secure_area
|
||||
name = "\improper SECURE AREA"
|
||||
icon_state = "securearea_small"
|
||||
|
||||
/obj/structure/sign/small/warning/vacuum
|
||||
name = "\improper HARD VACUUM AHEAD"
|
||||
icon_state = "space_small"
|
||||
|
||||
/obj/structure/sign/small/warning/pods
|
||||
name = "\improper ESCAPE PODS"
|
||||
icon_state = "pods"
|
||||
|
||||
/obj/structure/sign/small/warning/emerg_only
|
||||
name = "\improper EMERGENCY USE ONLY"
|
||||
/obj/structure/sign/itg
|
||||
icon = 'icons/obj/decals_vr.dmi'
|
||||
name = "\improper ITG"
|
||||
desc = "A polished metal sign which reads 'Ironcrest Transport Group'."
|
||||
icon_state = "itg"
|
||||
|
||||
/obj/structure/sign/scenery/fakefireaxe
|
||||
name = "decorative fire axe cabinet"
|
||||
desc = "A fancy decorative indent in the wall, with an axe inside. The axe is actually a part of the indent and cannot be removed. A nostalgic reminder of older times of firefighting."
|
||||
icon_state = "fireaxe1000"
|
||||
icon = 'icons/obj/closet.dmi'
|
||||
|
||||
//Small Signs for detailing
|
||||
/obj/structure/sign/small/fire/small
|
||||
icon = 'icons/obj/decals.dmi'
|
||||
name = "\improper DANGER: FIRE"
|
||||
desc = "A warning sign which reads 'DANGER: FIRE'."
|
||||
icon_state = "fire_small"
|
||||
|
||||
/obj/structure/sign/small/nosmoking
|
||||
name = "\improper NO SMOKING"
|
||||
desc = "A warning sign which reads 'NO SMOKING'."
|
||||
icon_state = "nosmoking_small"
|
||||
|
||||
/obj/structure/sign/small/nosmoking
|
||||
name = "\improper DESIGNATED SMOKING AREA"
|
||||
desc = "A warning sign which reads 'DESIGNATED SMOKING AREA'."
|
||||
icon_state = "smoking_small"
|
||||
|
||||
/obj/structure/sign/small/warning
|
||||
name = "\improper WARNING"
|
||||
desc = "" //Null description
|
||||
icon_state = "warning_small"
|
||||
|
||||
/obj/structure/sign/small/warning/high_voltage
|
||||
name = "\improper HIGH VOLTAGE"
|
||||
icon_state = "shock_small"
|
||||
|
||||
/obj/structure/sign/small/warning/radioactive
|
||||
name = "\improper RADIOACTIVE AREA"
|
||||
icon_state = "radiation_small"
|
||||
|
||||
/obj/structure/sign/small/warning/caution
|
||||
name = "\improper CAUTION"
|
||||
icon_state = "caution_small"
|
||||
|
||||
/obj/structure/sign/small/warning/server_room
|
||||
name = "\improper SERVER ROOM"
|
||||
icon_state = "server_small"
|
||||
|
||||
/obj/structure/sign/small/warning/secure_area
|
||||
name = "\improper SECURE AREA"
|
||||
icon_state = "securearea_small"
|
||||
|
||||
/obj/structure/sign/small/warning/vacuum
|
||||
name = "\improper HARD VACUUM AHEAD"
|
||||
icon_state = "space_small"
|
||||
|
||||
/obj/structure/sign/small/warning/pods
|
||||
name = "\improper ESCAPE PODS"
|
||||
icon_state = "pods"
|
||||
|
||||
/obj/structure/sign/small/warning/emerg_only
|
||||
name = "\improper EMERGENCY USE ONLY"
|
||||
icon_state = "emerg_small"
|
||||
@@ -1,283 +1,283 @@
|
||||
/obj/structure/simple_door
|
||||
name = "door"
|
||||
description_info = "If you hold left alt whilst left-clicking on a door, you can knock on it to announce your presence to anyone on the other side! Alternately if you are on HARM intent when doing this, you will bang loudly on the door!"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
can_atmos_pass = ATMOS_PASS_DENSITY
|
||||
|
||||
icon = 'icons/obj/doors/material_doors.dmi'
|
||||
icon_state = "metal"
|
||||
|
||||
var/datum/material/material
|
||||
var/state = 0 //closed, 1 == open
|
||||
var/isSwitchingStates = 0
|
||||
var/hardness = 1
|
||||
var/oreAmount = 7
|
||||
var/knock_sound = 'sound/machines/door/knock_glass.ogg'
|
||||
var/knock_hammer_sound = 'sound/weapons/sonic_jackhammer.ogg'
|
||||
|
||||
var/locked = FALSE //has the door been locked?
|
||||
var/lock_id = null //does the door have an associated key?
|
||||
var/keysound = 'sound/items/toolbelt_equip.ogg'
|
||||
|
||||
/obj/structure/simple_door/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
TemperatureAct(exposed_temperature)
|
||||
|
||||
/obj/structure/simple_door/proc/TemperatureAct(temperature)
|
||||
hardness -= material.combustion_effect(get_turf(src),temperature, 0.3)
|
||||
CheckHardness()
|
||||
|
||||
/obj/structure/simple_door/Initialize(mapload, var/material_name)
|
||||
. = ..()
|
||||
set_material(material_name)
|
||||
if(!material)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/structure/simple_door/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
update_nearby_tiles()
|
||||
return ..()
|
||||
|
||||
/obj/structure/simple_door/proc/set_material(var/material_name)
|
||||
if(!material_name)
|
||||
material_name = MAT_STEEL
|
||||
material = get_material_by_name(material_name)
|
||||
if(!material)
|
||||
return
|
||||
hardness = max(1,round(material.integrity/10))
|
||||
icon_state = material.door_icon_base
|
||||
name = "[material.display_name] door"
|
||||
color = material.icon_colour
|
||||
if(material.opacity < 0.5)
|
||||
set_opacity(0)
|
||||
else
|
||||
set_opacity(1)
|
||||
if(material.products_need_process())
|
||||
START_PROCESSING(SSobj, src)
|
||||
update_nearby_tiles(need_rebuild=1)
|
||||
|
||||
/obj/structure/simple_door/get_material()
|
||||
return material
|
||||
|
||||
/obj/structure/simple_door/Bumped(atom/user)
|
||||
..()
|
||||
if(!state)
|
||||
return TryToSwitchState(user)
|
||||
return
|
||||
|
||||
/obj/structure/simple_door/attack_ai(mob/user as mob) //those aren't machinery, they're just big fucking slabs of a mineral
|
||||
if(isAI(user)) //so the AI can't open it
|
||||
return
|
||||
else if(isrobot(user)) //but cyborgs can
|
||||
if(get_dist(user,src) <= 1) //not remotely though
|
||||
return TryToSwitchState(user)
|
||||
|
||||
/obj/structure/simple_door/attack_hand(mob/user as mob)
|
||||
return TryToSwitchState(user)
|
||||
|
||||
/obj/structure/simple_door/AltClick(mob/user as mob)
|
||||
. = ..()
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
if(!Adjacent(user))
|
||||
return
|
||||
else if(user.a_intent == I_HURT)
|
||||
src.visible_message("<span class='warning'>[user] hammers on \the [src]!</span>", "<span class='warning'>Someone hammers loudly on \the [src]!</span>")
|
||||
src.add_fingerprint(user)
|
||||
playsound(src, knock_hammer_sound, 50, 0, 3)
|
||||
else if(user.a_intent == I_HELP)
|
||||
src.visible_message("[user] knocks on \the [src].", "Someone knocks on \the [src].")
|
||||
src.add_fingerprint(user)
|
||||
playsound(src, knock_sound, 50, 0, 3)
|
||||
return
|
||||
|
||||
/obj/structure/simple_door/CanPass(atom/movable/mover, turf/target)
|
||||
if(istype(mover, /obj/effect/beam))
|
||||
return !opacity
|
||||
return !density
|
||||
|
||||
/obj/structure/simple_door/proc/TryToSwitchState(atom/user)
|
||||
if(isSwitchingStates) return
|
||||
if(ismob(user))
|
||||
var/mob/M = user
|
||||
if(!material.can_open_material_door(user))
|
||||
return
|
||||
if(locked && state == 0)
|
||||
to_chat(M,"<span class='warning'>It's locked!</span>")
|
||||
return
|
||||
if(world.time - user.last_bumped <= 60)
|
||||
return
|
||||
if(M.client)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
if(!C.handcuffed)
|
||||
SwitchState()
|
||||
else
|
||||
SwitchState()
|
||||
else if(istype(user, /obj/mecha))
|
||||
SwitchState()
|
||||
|
||||
/obj/structure/simple_door/proc/SwitchState()
|
||||
if(state)
|
||||
Close()
|
||||
else
|
||||
Open()
|
||||
|
||||
/obj/structure/simple_door/proc/Open()
|
||||
isSwitchingStates = 1
|
||||
playsound(src, material.dooropen_noise, 100, 1)
|
||||
flick("[material.door_icon_base]opening",src)
|
||||
sleep(10)
|
||||
density = FALSE
|
||||
set_opacity(0)
|
||||
state = 1
|
||||
update_icon()
|
||||
isSwitchingStates = 0
|
||||
update_nearby_tiles()
|
||||
|
||||
/obj/structure/simple_door/proc/Close()
|
||||
isSwitchingStates = 1
|
||||
playsound(src, material.dooropen_noise, 100, 1)
|
||||
flick("[material.door_icon_base]closing",src)
|
||||
sleep(10)
|
||||
density = TRUE
|
||||
set_opacity(1)
|
||||
state = 0
|
||||
update_icon()
|
||||
isSwitchingStates = 0
|
||||
update_nearby_tiles()
|
||||
|
||||
/obj/structure/simple_door/update_icon()
|
||||
if(state)
|
||||
icon_state = "[material.door_icon_base]open"
|
||||
else
|
||||
icon_state = material.door_icon_base
|
||||
|
||||
/obj/structure/simple_door/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
if(istype(W,/obj/item/weapon/simple_key))
|
||||
var/obj/item/weapon/simple_key/key = W
|
||||
if(state)
|
||||
to_chat(user,"<span class='notice'>\The [src] must be closed in order for you to lock it.</span>")
|
||||
else if(key.key_id != src.lock_id)
|
||||
to_chat(user,"<span class='warning'>The [key] doesn't fit \the [src]'s lock!</span>")
|
||||
else if(key.key_id == src.lock_id)
|
||||
visible_message("<span class='notice'>[user] [key.keyverb] \the [key] and [locked ? "unlocks" : "locks"] \the [src].</span>")
|
||||
locked = !locked
|
||||
playsound(src, keysound,100, 1)
|
||||
return
|
||||
if(istype(W,/obj/item/weapon/pickaxe) && breakable)
|
||||
var/obj/item/weapon/pickaxe/digTool = W
|
||||
visible_message("<span class='danger'>[user] starts digging [src]!</span>")
|
||||
if(do_after(user,digTool.digspeed*hardness) && src)
|
||||
visible_message("<span class='danger'>[user] finished digging [src]!</span>")
|
||||
Dismantle()
|
||||
else if(istype(W,/obj/item/weapon) && breakable) //not sure, can't not just weapons get passed to this proc?
|
||||
hardness -= W.force/10
|
||||
visible_message("<span class='danger'>[user] hits [src] with [W]!</span>")
|
||||
if(material == get_material_by_name("resin"))
|
||||
playsound(src, 'sound/effects/attackblob.ogg', 100, 1)
|
||||
else if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD) || get_material_by_name(MAT_HARDWOOD)))
|
||||
playsound(src, 'sound/effects/woodcutting.ogg', 100, 1)
|
||||
else
|
||||
playsound(src, 'sound/weapons/smash.ogg', 50, 1)
|
||||
CheckHardness()
|
||||
else if(W.has_tool_quality(TOOL_WELDER) && breakable)
|
||||
var/obj/item/weapon/weldingtool/WT = W.get_welder()
|
||||
if(material.ignition_point && WT.remove_fuel(0, user))
|
||||
TemperatureAct(150)
|
||||
else
|
||||
attack_hand(user)
|
||||
return
|
||||
|
||||
/obj/structure/simple_door/bullet_act(var/obj/item/projectile/Proj)
|
||||
take_damage(Proj.damage/10)
|
||||
CheckHardness()
|
||||
|
||||
/obj/structure/simple_door/take_damage(var/damage)
|
||||
hardness -= damage/10
|
||||
CheckHardness()
|
||||
|
||||
/obj/structure/simple_door/attack_generic(var/mob/user, var/damage, var/attack_verb)
|
||||
visible_message("<span class='danger'>[user] [attack_verb] the [src]!</span>")
|
||||
if(material == get_material_by_name("resin"))
|
||||
playsound(src, 'sound/effects/attackblob.ogg', 100, 1)
|
||||
else if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD) || get_material_by_name(MAT_HARDWOOD)))
|
||||
playsound(src, 'sound/effects/woodcutting.ogg', 100, 1)
|
||||
else
|
||||
playsound(src, 'sound/weapons/smash.ogg', 50, 1)
|
||||
user.do_attack_animation(src)
|
||||
hardness -= damage/10
|
||||
CheckHardness()
|
||||
|
||||
/obj/structure/simple_door/proc/CheckHardness()
|
||||
if(hardness <= 0)
|
||||
Dismantle(1)
|
||||
|
||||
/obj/structure/simple_door/proc/Dismantle(devastated = 0)
|
||||
material.place_dismantled_product(get_turf(src))
|
||||
visible_message("<span class='danger'>The [src] is destroyed!</span>")
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/simple_door/ex_act(severity = 1)
|
||||
switch(severity)
|
||||
if(1)
|
||||
Dismantle(1)
|
||||
if(2)
|
||||
if(prob(20))
|
||||
Dismantle(1)
|
||||
else
|
||||
hardness--
|
||||
CheckHardness()
|
||||
if(3)
|
||||
hardness -= 0.1
|
||||
CheckHardness()
|
||||
return
|
||||
|
||||
/obj/structure/simple_door/process()
|
||||
if(!material.radioactivity)
|
||||
return
|
||||
SSradiation.radiate(src, round(material.radioactivity/3))
|
||||
|
||||
/obj/structure/simple_door/iron/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || "iron")
|
||||
|
||||
/obj/structure/simple_door/silver/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || "silver")
|
||||
|
||||
/obj/structure/simple_door/gold/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || "gold")
|
||||
|
||||
/obj/structure/simple_door/uranium/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || "uranium")
|
||||
|
||||
/obj/structure/simple_door/sandstone/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || "sandstone")
|
||||
|
||||
/obj/structure/simple_door/phoron/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || "phoron")
|
||||
|
||||
/obj/structure/simple_door/diamond/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || "diamond")
|
||||
|
||||
/obj/structure/simple_door/wood/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || MAT_WOOD)
|
||||
knock_sound = 'sound/machines/door/knock_wood.wav'
|
||||
|
||||
/obj/structure/simple_door/hardwood/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || MAT_HARDWOOD)
|
||||
|
||||
/obj/structure/simple_door/sifwood/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || MAT_SIFWOOD)
|
||||
|
||||
/obj/structure/simple_door/resin/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || "resin")
|
||||
|
||||
/obj/structure/simple_door/cult/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || "cult")
|
||||
|
||||
/obj/structure/simple_door/cult/TryToSwitchState(atom/user)
|
||||
if(isliving(user))
|
||||
var/mob/living/L = user
|
||||
if(!iscultist(L) && !istype(L, /mob/living/simple_mob/construct))
|
||||
return
|
||||
..()
|
||||
/obj/structure/simple_door
|
||||
name = "door"
|
||||
description_info = "If you hold left alt whilst left-clicking on a door, you can knock on it to announce your presence to anyone on the other side! Alternately if you are on HARM intent when doing this, you will bang loudly on the door!"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
can_atmos_pass = ATMOS_PASS_DENSITY
|
||||
|
||||
icon = 'icons/obj/doors/material_doors.dmi'
|
||||
icon_state = "metal"
|
||||
|
||||
var/datum/material/material
|
||||
var/state = 0 //closed, 1 == open
|
||||
var/isSwitchingStates = 0
|
||||
var/hardness = 1
|
||||
var/oreAmount = 7
|
||||
var/knock_sound = 'sound/machines/door/knock_glass.ogg'
|
||||
var/knock_hammer_sound = 'sound/weapons/sonic_jackhammer.ogg'
|
||||
|
||||
var/locked = FALSE //has the door been locked?
|
||||
var/lock_id = null //does the door have an associated key?
|
||||
var/keysound = 'sound/items/toolbelt_equip.ogg'
|
||||
|
||||
/obj/structure/simple_door/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
TemperatureAct(exposed_temperature)
|
||||
|
||||
/obj/structure/simple_door/proc/TemperatureAct(temperature)
|
||||
hardness -= material.combustion_effect(get_turf(src),temperature, 0.3)
|
||||
CheckHardness()
|
||||
|
||||
/obj/structure/simple_door/Initialize(mapload, var/material_name)
|
||||
. = ..()
|
||||
set_material(material_name)
|
||||
if(!material)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/structure/simple_door/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
update_nearby_tiles()
|
||||
return ..()
|
||||
|
||||
/obj/structure/simple_door/proc/set_material(var/material_name)
|
||||
if(!material_name)
|
||||
material_name = MAT_STEEL
|
||||
material = get_material_by_name(material_name)
|
||||
if(!material)
|
||||
return
|
||||
hardness = max(1,round(material.integrity/10))
|
||||
icon_state = material.door_icon_base
|
||||
name = "[material.display_name] door"
|
||||
color = material.icon_colour
|
||||
if(material.opacity < 0.5)
|
||||
set_opacity(0)
|
||||
else
|
||||
set_opacity(1)
|
||||
if(material.products_need_process())
|
||||
START_PROCESSING(SSobj, src)
|
||||
update_nearby_tiles(need_rebuild=1)
|
||||
|
||||
/obj/structure/simple_door/get_material()
|
||||
return material
|
||||
|
||||
/obj/structure/simple_door/Bumped(atom/user)
|
||||
..()
|
||||
if(!state)
|
||||
return TryToSwitchState(user)
|
||||
return
|
||||
|
||||
/obj/structure/simple_door/attack_ai(mob/user as mob) //those aren't machinery, they're just big fucking slabs of a mineral
|
||||
if(isAI(user)) //so the AI can't open it
|
||||
return
|
||||
else if(isrobot(user)) //but cyborgs can
|
||||
if(get_dist(user,src) <= 1) //not remotely though
|
||||
return TryToSwitchState(user)
|
||||
|
||||
/obj/structure/simple_door/attack_hand(mob/user as mob)
|
||||
return TryToSwitchState(user)
|
||||
|
||||
/obj/structure/simple_door/AltClick(mob/user as mob)
|
||||
. = ..()
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
if(!Adjacent(user))
|
||||
return
|
||||
else if(user.a_intent == I_HURT)
|
||||
src.visible_message("<span class='warning'>[user] hammers on \the [src]!</span>", "<span class='warning'>Someone hammers loudly on \the [src]!</span>")
|
||||
src.add_fingerprint(user)
|
||||
playsound(src, knock_hammer_sound, 50, 0, 3)
|
||||
else if(user.a_intent == I_HELP)
|
||||
src.visible_message("[user] knocks on \the [src].", "Someone knocks on \the [src].")
|
||||
src.add_fingerprint(user)
|
||||
playsound(src, knock_sound, 50, 0, 3)
|
||||
return
|
||||
|
||||
/obj/structure/simple_door/CanPass(atom/movable/mover, turf/target)
|
||||
if(istype(mover, /obj/effect/beam))
|
||||
return !opacity
|
||||
return !density
|
||||
|
||||
/obj/structure/simple_door/proc/TryToSwitchState(atom/user)
|
||||
if(isSwitchingStates) return
|
||||
if(ismob(user))
|
||||
var/mob/M = user
|
||||
if(!material.can_open_material_door(user))
|
||||
return
|
||||
if(locked && state == 0)
|
||||
to_chat(M,"<span class='warning'>It's locked!</span>")
|
||||
return
|
||||
if(world.time - user.last_bumped <= 60)
|
||||
return
|
||||
if(M.client)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
if(!C.handcuffed)
|
||||
SwitchState()
|
||||
else
|
||||
SwitchState()
|
||||
else if(istype(user, /obj/mecha))
|
||||
SwitchState()
|
||||
|
||||
/obj/structure/simple_door/proc/SwitchState()
|
||||
if(state)
|
||||
Close()
|
||||
else
|
||||
Open()
|
||||
|
||||
/obj/structure/simple_door/proc/Open()
|
||||
isSwitchingStates = 1
|
||||
playsound(src, material.dooropen_noise, 100, 1)
|
||||
flick("[material.door_icon_base]opening",src)
|
||||
sleep(10)
|
||||
density = FALSE
|
||||
set_opacity(0)
|
||||
state = 1
|
||||
update_icon()
|
||||
isSwitchingStates = 0
|
||||
update_nearby_tiles()
|
||||
|
||||
/obj/structure/simple_door/proc/Close()
|
||||
isSwitchingStates = 1
|
||||
playsound(src, material.dooropen_noise, 100, 1)
|
||||
flick("[material.door_icon_base]closing",src)
|
||||
sleep(10)
|
||||
density = TRUE
|
||||
set_opacity(1)
|
||||
state = 0
|
||||
update_icon()
|
||||
isSwitchingStates = 0
|
||||
update_nearby_tiles()
|
||||
|
||||
/obj/structure/simple_door/update_icon()
|
||||
if(state)
|
||||
icon_state = "[material.door_icon_base]open"
|
||||
else
|
||||
icon_state = material.door_icon_base
|
||||
|
||||
/obj/structure/simple_door/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
if(istype(W,/obj/item/weapon/simple_key))
|
||||
var/obj/item/weapon/simple_key/key = W
|
||||
if(state)
|
||||
to_chat(user,"<span class='notice'>\The [src] must be closed in order for you to lock it.</span>")
|
||||
else if(key.key_id != src.lock_id)
|
||||
to_chat(user,"<span class='warning'>The [key] doesn't fit \the [src]'s lock!</span>")
|
||||
else if(key.key_id == src.lock_id)
|
||||
visible_message("<span class='notice'>[user] [key.keyverb] \the [key] and [locked ? "unlocks" : "locks"] \the [src].</span>")
|
||||
locked = !locked
|
||||
playsound(src, keysound,100, 1)
|
||||
return
|
||||
if(istype(W,/obj/item/weapon/pickaxe) && breakable)
|
||||
var/obj/item/weapon/pickaxe/digTool = W
|
||||
visible_message("<span class='danger'>[user] starts digging [src]!</span>")
|
||||
if(do_after(user,digTool.digspeed*hardness) && src)
|
||||
visible_message("<span class='danger'>[user] finished digging [src]!</span>")
|
||||
Dismantle()
|
||||
else if(istype(W,/obj/item/weapon) && breakable) //not sure, can't not just weapons get passed to this proc?
|
||||
hardness -= W.force/10
|
||||
visible_message("<span class='danger'>[user] hits [src] with [W]!</span>")
|
||||
if(material == get_material_by_name("resin"))
|
||||
playsound(src, 'sound/effects/attackblob.ogg', 100, 1)
|
||||
else if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD) || get_material_by_name(MAT_HARDWOOD)))
|
||||
playsound(src, 'sound/effects/woodcutting.ogg', 100, 1)
|
||||
else
|
||||
playsound(src, 'sound/weapons/smash.ogg', 50, 1)
|
||||
CheckHardness()
|
||||
else if(W.has_tool_quality(TOOL_WELDER) && breakable)
|
||||
var/obj/item/weapon/weldingtool/WT = W.get_welder()
|
||||
if(material.ignition_point && WT.remove_fuel(0, user))
|
||||
TemperatureAct(150)
|
||||
else
|
||||
attack_hand(user)
|
||||
return
|
||||
|
||||
/obj/structure/simple_door/bullet_act(var/obj/item/projectile/Proj)
|
||||
take_damage(Proj.damage/10)
|
||||
CheckHardness()
|
||||
|
||||
/obj/structure/simple_door/take_damage(var/damage)
|
||||
hardness -= damage/10
|
||||
CheckHardness()
|
||||
|
||||
/obj/structure/simple_door/attack_generic(var/mob/user, var/damage, var/attack_verb)
|
||||
visible_message("<span class='danger'>[user] [attack_verb] the [src]!</span>")
|
||||
if(material == get_material_by_name("resin"))
|
||||
playsound(src, 'sound/effects/attackblob.ogg', 100, 1)
|
||||
else if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD) || get_material_by_name(MAT_HARDWOOD)))
|
||||
playsound(src, 'sound/effects/woodcutting.ogg', 100, 1)
|
||||
else
|
||||
playsound(src, 'sound/weapons/smash.ogg', 50, 1)
|
||||
user.do_attack_animation(src)
|
||||
hardness -= damage/10
|
||||
CheckHardness()
|
||||
|
||||
/obj/structure/simple_door/proc/CheckHardness()
|
||||
if(hardness <= 0)
|
||||
Dismantle(1)
|
||||
|
||||
/obj/structure/simple_door/proc/Dismantle(devastated = 0)
|
||||
material.place_dismantled_product(get_turf(src))
|
||||
visible_message("<span class='danger'>The [src] is destroyed!</span>")
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/simple_door/ex_act(severity = 1)
|
||||
switch(severity)
|
||||
if(1)
|
||||
Dismantle(1)
|
||||
if(2)
|
||||
if(prob(20))
|
||||
Dismantle(1)
|
||||
else
|
||||
hardness--
|
||||
CheckHardness()
|
||||
if(3)
|
||||
hardness -= 0.1
|
||||
CheckHardness()
|
||||
return
|
||||
|
||||
/obj/structure/simple_door/process()
|
||||
if(!material.radioactivity)
|
||||
return
|
||||
SSradiation.radiate(src, round(material.radioactivity/3))
|
||||
|
||||
/obj/structure/simple_door/iron/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || "iron")
|
||||
|
||||
/obj/structure/simple_door/silver/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || "silver")
|
||||
|
||||
/obj/structure/simple_door/gold/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || "gold")
|
||||
|
||||
/obj/structure/simple_door/uranium/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || "uranium")
|
||||
|
||||
/obj/structure/simple_door/sandstone/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || "sandstone")
|
||||
|
||||
/obj/structure/simple_door/phoron/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || "phoron")
|
||||
|
||||
/obj/structure/simple_door/diamond/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || "diamond")
|
||||
|
||||
/obj/structure/simple_door/wood/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || MAT_WOOD)
|
||||
knock_sound = 'sound/machines/door/knock_wood.wav'
|
||||
|
||||
/obj/structure/simple_door/hardwood/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || MAT_HARDWOOD)
|
||||
|
||||
/obj/structure/simple_door/sifwood/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || MAT_SIFWOOD)
|
||||
|
||||
/obj/structure/simple_door/resin/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || "resin")
|
||||
|
||||
/obj/structure/simple_door/cult/Initialize(mapload,var/material_name)
|
||||
..(mapload, material_name || "cult")
|
||||
|
||||
/obj/structure/simple_door/cult/TryToSwitchState(atom/user)
|
||||
if(isliving(user))
|
||||
var/mob/living/L = user
|
||||
if(!iscultist(L) && !istype(L, /mob/living/simple_mob/construct))
|
||||
return
|
||||
..()
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,151 +1,151 @@
|
||||
//Todo: add leather and cloth for arbitrary coloured stools.
|
||||
var/global/list/stool_cache = list() //haha stool
|
||||
|
||||
/obj/item/weapon/stool
|
||||
name = "stool"
|
||||
desc = "Apply butt."
|
||||
icon = 'icons/obj/furniture_vr.dmi' //VOREStation Edit - new Icons
|
||||
icon_state = "stool_preview" //set for the map
|
||||
randpixel = 0
|
||||
center_of_mass = null
|
||||
force = 10
|
||||
throwforce = 10
|
||||
w_class = ITEMSIZE_HUGE
|
||||
var/base_icon = "stool_base"
|
||||
var/datum/material/material
|
||||
var/datum/material/padding_material
|
||||
|
||||
/obj/item/weapon/stool/padded
|
||||
icon_state = "stool_padded_preview" //set for the map
|
||||
|
||||
/obj/item/weapon/stool/New(var/newloc, var/new_material, var/new_padding_material)
|
||||
..(newloc)
|
||||
if(!new_material)
|
||||
new_material = MAT_STEEL
|
||||
material = get_material_by_name(new_material)
|
||||
if(new_padding_material)
|
||||
padding_material = get_material_by_name(new_padding_material)
|
||||
if(!istype(material))
|
||||
qdel(src)
|
||||
return
|
||||
force = round(material.get_blunt_damage()*0.4)
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/stool/padded/New(var/newloc, var/new_material)
|
||||
..(newloc, "steel", "carpet")
|
||||
|
||||
/obj/item/weapon/stool/update_icon()
|
||||
// Prep icon.
|
||||
icon_state = ""
|
||||
cut_overlays()
|
||||
// Base icon.
|
||||
var/cache_key = "[base_icon]-[material.name]"
|
||||
if(isnull(stool_cache[cache_key]))
|
||||
var/image/I = image(icon, base_icon)
|
||||
I.color = material.icon_colour
|
||||
stool_cache[cache_key] = I
|
||||
add_overlay(stool_cache[cache_key])
|
||||
// Padding overlay.
|
||||
if(padding_material)
|
||||
var/padding_cache_key = "[base_icon]-padding-[padding_material.name]"
|
||||
if(isnull(stool_cache[padding_cache_key]))
|
||||
var/image/I = image(icon, "[base_icon]_padding") //VOREStation Edit
|
||||
I.color = padding_material.icon_colour
|
||||
stool_cache[padding_cache_key] = I
|
||||
add_overlay(stool_cache[padding_cache_key])
|
||||
// Strings.
|
||||
if(padding_material)
|
||||
name = "[padding_material.display_name] [initial(name)]" //this is not perfect but it will do for now.
|
||||
desc = "A padded stool. Apply butt. It's made of [material.use_name] and covered with [padding_material.use_name]."
|
||||
else
|
||||
name = "[material.display_name] [initial(name)]"
|
||||
desc = "A stool. Apply butt with care. It's made of [material.use_name]."
|
||||
|
||||
/obj/item/weapon/stool/proc/add_padding(var/padding_type)
|
||||
padding_material = get_material_by_name(padding_type)
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/stool/proc/remove_padding()
|
||||
if(padding_material)
|
||||
padding_material.place_sheet(get_turf(src), 1)
|
||||
padding_material = null
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/stool/attack(mob/M as mob, mob/user as mob)
|
||||
if (prob(5) && istype(M,/mob/living))
|
||||
user.visible_message("<span class='danger'>[user] breaks [src] over [M]'s back!</span>")
|
||||
user.setClickCooldown(user.get_attack_speed())
|
||||
user.do_attack_animation(M)
|
||||
|
||||
user.drop_from_inventory(src)
|
||||
|
||||
user.remove_from_mob(src)
|
||||
dismantle()
|
||||
qdel(src)
|
||||
var/mob/living/T = M
|
||||
T.Weaken(10)
|
||||
T.apply_damage(20)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/weapon/stool/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
qdel(src)
|
||||
return
|
||||
if(2.0)
|
||||
if (prob(50))
|
||||
qdel(src)
|
||||
return
|
||||
if(3.0)
|
||||
if (prob(5))
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/stool/proc/dismantle()
|
||||
if(material)
|
||||
material.place_sheet(get_turf(src), 1)
|
||||
if(padding_material)
|
||||
padding_material.place_sheet(get_turf(src), 1)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/stool/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(W.has_tool_quality(TOOL_WRENCH))
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
dismantle()
|
||||
qdel(src)
|
||||
else if(istype(W,/obj/item/stack))
|
||||
if(padding_material)
|
||||
to_chat(user, "\The [src] is already padded.")
|
||||
return
|
||||
var/obj/item/stack/C = W
|
||||
if(C.get_amount() < 1) // How??
|
||||
user.drop_from_inventory(C)
|
||||
qdel(C)
|
||||
return
|
||||
var/padding_type //This is awful but it needs to be like this until tiles are given a material var.
|
||||
if(istype(W,/obj/item/stack/tile/carpet))
|
||||
padding_type = "carpet"
|
||||
else if(istype(W,/obj/item/stack/material))
|
||||
var/obj/item/stack/material/M = W
|
||||
if(M.material && (M.material.flags & MATERIAL_PADDING))
|
||||
padding_type = "[M.material.name]"
|
||||
if(!padding_type)
|
||||
to_chat(user, "You cannot pad \the [src] with that.")
|
||||
return
|
||||
C.use(1)
|
||||
if(!istype(src.loc, /turf))
|
||||
user.drop_from_inventory(src)
|
||||
src.loc = get_turf(src)
|
||||
to_chat(user, "You add padding to \the [src].")
|
||||
add_padding(padding_type)
|
||||
return
|
||||
else if (W.has_tool_quality(TOOL_WIRECUTTER))
|
||||
if(!padding_material)
|
||||
to_chat(user, "\The [src] has no padding to remove.")
|
||||
return
|
||||
to_chat(user, "You remove the padding from \the [src].")
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
remove_padding()
|
||||
else
|
||||
..()
|
||||
//Todo: add leather and cloth for arbitrary coloured stools.
|
||||
var/global/list/stool_cache = list() //haha stool
|
||||
|
||||
/obj/item/weapon/stool
|
||||
name = "stool"
|
||||
desc = "Apply butt."
|
||||
icon = 'icons/obj/furniture_vr.dmi' //VOREStation Edit - new Icons
|
||||
icon_state = "stool_preview" //set for the map
|
||||
randpixel = 0
|
||||
center_of_mass = null
|
||||
force = 10
|
||||
throwforce = 10
|
||||
w_class = ITEMSIZE_HUGE
|
||||
var/base_icon = "stool_base"
|
||||
var/datum/material/material
|
||||
var/datum/material/padding_material
|
||||
|
||||
/obj/item/weapon/stool/padded
|
||||
icon_state = "stool_padded_preview" //set for the map
|
||||
|
||||
/obj/item/weapon/stool/New(var/newloc, var/new_material, var/new_padding_material)
|
||||
..(newloc)
|
||||
if(!new_material)
|
||||
new_material = MAT_STEEL
|
||||
material = get_material_by_name(new_material)
|
||||
if(new_padding_material)
|
||||
padding_material = get_material_by_name(new_padding_material)
|
||||
if(!istype(material))
|
||||
qdel(src)
|
||||
return
|
||||
force = round(material.get_blunt_damage()*0.4)
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/stool/padded/New(var/newloc, var/new_material)
|
||||
..(newloc, "steel", "carpet")
|
||||
|
||||
/obj/item/weapon/stool/update_icon()
|
||||
// Prep icon.
|
||||
icon_state = ""
|
||||
cut_overlays()
|
||||
// Base icon.
|
||||
var/cache_key = "[base_icon]-[material.name]"
|
||||
if(isnull(stool_cache[cache_key]))
|
||||
var/image/I = image(icon, base_icon)
|
||||
I.color = material.icon_colour
|
||||
stool_cache[cache_key] = I
|
||||
add_overlay(stool_cache[cache_key])
|
||||
// Padding overlay.
|
||||
if(padding_material)
|
||||
var/padding_cache_key = "[base_icon]-padding-[padding_material.name]"
|
||||
if(isnull(stool_cache[padding_cache_key]))
|
||||
var/image/I = image(icon, "[base_icon]_padding") //VOREStation Edit
|
||||
I.color = padding_material.icon_colour
|
||||
stool_cache[padding_cache_key] = I
|
||||
add_overlay(stool_cache[padding_cache_key])
|
||||
// Strings.
|
||||
if(padding_material)
|
||||
name = "[padding_material.display_name] [initial(name)]" //this is not perfect but it will do for now.
|
||||
desc = "A padded stool. Apply butt. It's made of [material.use_name] and covered with [padding_material.use_name]."
|
||||
else
|
||||
name = "[material.display_name] [initial(name)]"
|
||||
desc = "A stool. Apply butt with care. It's made of [material.use_name]."
|
||||
|
||||
/obj/item/weapon/stool/proc/add_padding(var/padding_type)
|
||||
padding_material = get_material_by_name(padding_type)
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/stool/proc/remove_padding()
|
||||
if(padding_material)
|
||||
padding_material.place_sheet(get_turf(src), 1)
|
||||
padding_material = null
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/stool/attack(mob/M as mob, mob/user as mob)
|
||||
if (prob(5) && istype(M,/mob/living))
|
||||
user.visible_message("<span class='danger'>[user] breaks [src] over [M]'s back!</span>")
|
||||
user.setClickCooldown(user.get_attack_speed())
|
||||
user.do_attack_animation(M)
|
||||
|
||||
user.drop_from_inventory(src)
|
||||
|
||||
user.remove_from_mob(src)
|
||||
dismantle()
|
||||
qdel(src)
|
||||
var/mob/living/T = M
|
||||
T.Weaken(10)
|
||||
T.apply_damage(20)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/weapon/stool/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
qdel(src)
|
||||
return
|
||||
if(2.0)
|
||||
if (prob(50))
|
||||
qdel(src)
|
||||
return
|
||||
if(3.0)
|
||||
if (prob(5))
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/stool/proc/dismantle()
|
||||
if(material)
|
||||
material.place_sheet(get_turf(src), 1)
|
||||
if(padding_material)
|
||||
padding_material.place_sheet(get_turf(src), 1)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/stool/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(W.has_tool_quality(TOOL_WRENCH))
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
dismantle()
|
||||
qdel(src)
|
||||
else if(istype(W,/obj/item/stack))
|
||||
if(padding_material)
|
||||
to_chat(user, "\The [src] is already padded.")
|
||||
return
|
||||
var/obj/item/stack/C = W
|
||||
if(C.get_amount() < 1) // How??
|
||||
user.drop_from_inventory(C)
|
||||
qdel(C)
|
||||
return
|
||||
var/padding_type //This is awful but it needs to be like this until tiles are given a material var.
|
||||
if(istype(W,/obj/item/stack/tile/carpet))
|
||||
padding_type = "carpet"
|
||||
else if(istype(W,/obj/item/stack/material))
|
||||
var/obj/item/stack/material/M = W
|
||||
if(M.material && (M.material.flags & MATERIAL_PADDING))
|
||||
padding_type = "[M.material.name]"
|
||||
if(!padding_type)
|
||||
to_chat(user, "You cannot pad \the [src] with that.")
|
||||
return
|
||||
C.use(1)
|
||||
if(!istype(src.loc, /turf))
|
||||
user.drop_from_inventory(src)
|
||||
src.loc = get_turf(src)
|
||||
to_chat(user, "You add padding to \the [src].")
|
||||
add_padding(padding_type)
|
||||
return
|
||||
else if (W.has_tool_quality(TOOL_WIRECUTTER))
|
||||
if(!padding_material)
|
||||
to_chat(user, "\The [src] has no padding to remove.")
|
||||
return
|
||||
to_chat(user, "You remove the padding from \the [src].")
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
remove_padding()
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -1,122 +1,122 @@
|
||||
#define TANK_DISPENSER_CAPACITY 10
|
||||
|
||||
/obj/structure/dispenser
|
||||
name = "tank storage unit"
|
||||
desc = "A simple yet bulky storage device for gas tanks. Has room for up to ten oxygen tanks, and ten phoron tanks."
|
||||
icon = 'icons/obj/objects_vr.dmi'
|
||||
icon_state = "dispenser"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
w_class = ITEMSIZE_HUGE
|
||||
var/oxygentanks = TANK_DISPENSER_CAPACITY
|
||||
var/phorontanks = TANK_DISPENSER_CAPACITY
|
||||
|
||||
|
||||
/obj/structure/dispenser/oxygen
|
||||
phorontanks = 0
|
||||
|
||||
/obj/structure/dispenser/phoron
|
||||
oxygentanks = 0
|
||||
|
||||
|
||||
/obj/structure/dispenser/Initialize()
|
||||
. = ..()
|
||||
for(var/i in 1 to oxygentanks)
|
||||
new /obj/item/weapon/tank/oxygen(src)
|
||||
for(var/i in 1 to phorontanks)
|
||||
new /obj/item/weapon/tank/phoron(src)
|
||||
update_icon()
|
||||
|
||||
/obj/structure/dispenser/update_icon()
|
||||
cut_overlays()
|
||||
switch(oxygentanks)
|
||||
if(1 to 3) add_overlay("oxygen-[oxygentanks]")
|
||||
if(4 to INFINITY) add_overlay("oxygen-4")
|
||||
switch(phorontanks)
|
||||
if(1 to 4) add_overlay("phoron-[phorontanks]")
|
||||
if(5 to INFINITY) add_overlay("phoron-5")
|
||||
|
||||
/obj/structure/dispenser/attack_ai(mob/user)
|
||||
// This looks silly, but robots also call attack_ai, and they're allowed physical state stuff.
|
||||
if(user.Adjacent(src))
|
||||
return attack_hand(user)
|
||||
..()
|
||||
|
||||
/obj/structure/dispenser/attack_hand(mob/user)
|
||||
tgui_interact(user)
|
||||
|
||||
/obj/structure/dispenser/tgui_state(mob/user)
|
||||
return GLOB.tgui_physical_state
|
||||
|
||||
/obj/structure/dispenser/tgui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "TankDispenser", name)
|
||||
ui.open()
|
||||
|
||||
/obj/structure/dispenser/tgui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["oxygen"] = oxygentanks
|
||||
data["plasma"] = phorontanks
|
||||
|
||||
return data
|
||||
|
||||
/obj/structure/dispenser/attackby(obj/item/I, mob/user)
|
||||
var/full
|
||||
if(istype(I, /obj/item/weapon/tank/oxygen) || istype(I, /obj/item/weapon/tank/air) || istype(I, /obj/item/weapon/tank/anesthetic))
|
||||
if(oxygentanks < TANK_DISPENSER_CAPACITY)
|
||||
oxygentanks++
|
||||
else
|
||||
full = TRUE
|
||||
else if(istype(I, /obj/item/weapon/tank/phoron))
|
||||
if(phorontanks < TANK_DISPENSER_CAPACITY)
|
||||
phorontanks++
|
||||
else
|
||||
full = TRUE
|
||||
else if(I.has_tool_quality(TOOL_WRENCH))
|
||||
if(anchored)
|
||||
to_chat(user, "<span class='notice'>You lean down and unwrench [src].</span>")
|
||||
anchored = FALSE
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You wrench [src] into place.</span>")
|
||||
anchored = TRUE
|
||||
return
|
||||
else if(user.a_intent != I_HURT)
|
||||
to_chat(user, "<span class='notice'>[I] does not fit into [src].</span>")
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
if(full)
|
||||
to_chat(user, "<span class='notice'>[src] can't hold any more of [I].</span>")
|
||||
return
|
||||
|
||||
if(!user.unEquip(I, target = src))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You put [I] in [src].</span>")
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/structure/dispenser/tgui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
switch(action)
|
||||
if("plasma")
|
||||
var/obj/item/weapon/tank/phoron/tank = locate() in src
|
||||
if(tank && Adjacent(usr))
|
||||
usr.put_in_hands(tank)
|
||||
phorontanks--
|
||||
. = TRUE
|
||||
playsound(src, 'sound/items/drop/gascan.ogg', 100, 1, 1)
|
||||
if("oxygen")
|
||||
var/obj/item/weapon/tank/tank = null
|
||||
for(var/obj/item/weapon/tank/T in src)
|
||||
if(istype(T, /obj/item/weapon/tank/oxygen) || istype(T, /obj/item/weapon/tank/air) || istype(T, /obj/item/weapon/tank/anesthetic))
|
||||
tank = T
|
||||
break
|
||||
if(tank && Adjacent(usr))
|
||||
usr.put_in_hands(tank)
|
||||
oxygentanks--
|
||||
. = TRUE
|
||||
playsound(src, 'sound/items/drop/gascan.ogg', 100, 1, 1)
|
||||
#define TANK_DISPENSER_CAPACITY 10
|
||||
|
||||
/obj/structure/dispenser
|
||||
name = "tank storage unit"
|
||||
desc = "A simple yet bulky storage device for gas tanks. Has room for up to ten oxygen tanks, and ten phoron tanks."
|
||||
icon = 'icons/obj/objects_vr.dmi'
|
||||
icon_state = "dispenser"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
w_class = ITEMSIZE_HUGE
|
||||
var/oxygentanks = TANK_DISPENSER_CAPACITY
|
||||
var/phorontanks = TANK_DISPENSER_CAPACITY
|
||||
|
||||
|
||||
/obj/structure/dispenser/oxygen
|
||||
phorontanks = 0
|
||||
|
||||
/obj/structure/dispenser/phoron
|
||||
oxygentanks = 0
|
||||
|
||||
|
||||
/obj/structure/dispenser/Initialize()
|
||||
. = ..()
|
||||
for(var/i in 1 to oxygentanks)
|
||||
new /obj/item/weapon/tank/oxygen(src)
|
||||
for(var/i in 1 to phorontanks)
|
||||
new /obj/item/weapon/tank/phoron(src)
|
||||
update_icon()
|
||||
|
||||
/obj/structure/dispenser/update_icon()
|
||||
cut_overlays()
|
||||
switch(oxygentanks)
|
||||
if(1 to 3) add_overlay("oxygen-[oxygentanks]")
|
||||
if(4 to INFINITY) add_overlay("oxygen-4")
|
||||
switch(phorontanks)
|
||||
if(1 to 4) add_overlay("phoron-[phorontanks]")
|
||||
if(5 to INFINITY) add_overlay("phoron-5")
|
||||
|
||||
/obj/structure/dispenser/attack_ai(mob/user)
|
||||
// This looks silly, but robots also call attack_ai, and they're allowed physical state stuff.
|
||||
if(user.Adjacent(src))
|
||||
return attack_hand(user)
|
||||
..()
|
||||
|
||||
/obj/structure/dispenser/attack_hand(mob/user)
|
||||
tgui_interact(user)
|
||||
|
||||
/obj/structure/dispenser/tgui_state(mob/user)
|
||||
return GLOB.tgui_physical_state
|
||||
|
||||
/obj/structure/dispenser/tgui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "TankDispenser", name)
|
||||
ui.open()
|
||||
|
||||
/obj/structure/dispenser/tgui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["oxygen"] = oxygentanks
|
||||
data["plasma"] = phorontanks
|
||||
|
||||
return data
|
||||
|
||||
/obj/structure/dispenser/attackby(obj/item/I, mob/user)
|
||||
var/full
|
||||
if(istype(I, /obj/item/weapon/tank/oxygen) || istype(I, /obj/item/weapon/tank/air) || istype(I, /obj/item/weapon/tank/anesthetic))
|
||||
if(oxygentanks < TANK_DISPENSER_CAPACITY)
|
||||
oxygentanks++
|
||||
else
|
||||
full = TRUE
|
||||
else if(istype(I, /obj/item/weapon/tank/phoron))
|
||||
if(phorontanks < TANK_DISPENSER_CAPACITY)
|
||||
phorontanks++
|
||||
else
|
||||
full = TRUE
|
||||
else if(I.has_tool_quality(TOOL_WRENCH))
|
||||
if(anchored)
|
||||
to_chat(user, "<span class='notice'>You lean down and unwrench [src].</span>")
|
||||
anchored = FALSE
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You wrench [src] into place.</span>")
|
||||
anchored = TRUE
|
||||
return
|
||||
else if(user.a_intent != I_HURT)
|
||||
to_chat(user, "<span class='notice'>[I] does not fit into [src].</span>")
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
if(full)
|
||||
to_chat(user, "<span class='notice'>[src] can't hold any more of [I].</span>")
|
||||
return
|
||||
|
||||
if(!user.unEquip(I, target = src))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You put [I] in [src].</span>")
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/structure/dispenser/tgui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
switch(action)
|
||||
if("plasma")
|
||||
var/obj/item/weapon/tank/phoron/tank = locate() in src
|
||||
if(tank && Adjacent(usr))
|
||||
usr.put_in_hands(tank)
|
||||
phorontanks--
|
||||
. = TRUE
|
||||
playsound(src, 'sound/items/drop/gascan.ogg', 100, 1, 1)
|
||||
if("oxygen")
|
||||
var/obj/item/weapon/tank/tank = null
|
||||
for(var/obj/item/weapon/tank/T in src)
|
||||
if(istype(T, /obj/item/weapon/tank/oxygen) || istype(T, /obj/item/weapon/tank/air) || istype(T, /obj/item/weapon/tank/anesthetic))
|
||||
tank = T
|
||||
break
|
||||
if(tank && Adjacent(usr))
|
||||
usr.put_in_hands(tank)
|
||||
oxygentanks--
|
||||
. = TRUE
|
||||
playsound(src, 'sound/items/drop/gascan.ogg', 100, 1, 1)
|
||||
update_icon()
|
||||
@@ -1,52 +1,52 @@
|
||||
// Basically they are for the firing range
|
||||
/obj/structure/target_stake
|
||||
name = "target stake"
|
||||
desc = "A thin platform with negatively-magnetized wheels."
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "target_stake"
|
||||
density = TRUE
|
||||
w_class = ITEMSIZE_HUGE
|
||||
var/obj/item/target/pinned_target // the current pinned target
|
||||
|
||||
/obj/structure/target_stake/Moved(atom/old_loc, direction, forced = FALSE)
|
||||
. = ..()
|
||||
// Move the pinned target along with the stake
|
||||
if(pinned_target in view(3, src))
|
||||
pinned_target.forceMove(loc)
|
||||
|
||||
else // Sanity check: if the pinned target can't be found in immediate view
|
||||
pinned_target = null
|
||||
density = TRUE
|
||||
|
||||
/obj/structure/target_stake/attackby(obj/item/W as obj, mob/user as mob)
|
||||
// Putting objects on the stake. Most importantly, targets
|
||||
if(pinned_target)
|
||||
return // get rid of that pinned target first!
|
||||
|
||||
if(istype(W, /obj/item/target))
|
||||
density = FALSE
|
||||
W.density = TRUE
|
||||
user.remove_from_mob(W)
|
||||
W.loc = loc
|
||||
W.layer = ABOVE_JUNK_LAYER
|
||||
pinned_target = W
|
||||
to_chat(user, "You slide the target into the stake.")
|
||||
return
|
||||
|
||||
/obj/structure/target_stake/attack_hand(mob/user as mob)
|
||||
// taking pinned targets off!
|
||||
if(pinned_target)
|
||||
density = TRUE
|
||||
pinned_target.density = FALSE
|
||||
pinned_target.layer = OBJ_LAYER
|
||||
|
||||
pinned_target.loc = user.loc
|
||||
if(ishuman(user))
|
||||
if(!user.get_active_hand())
|
||||
user.put_in_hands(pinned_target)
|
||||
to_chat(user, "You take the target out of the stake.")
|
||||
else
|
||||
pinned_target.loc = get_turf(user)
|
||||
to_chat(user, "You take the target out of the stake.")
|
||||
|
||||
pinned_target = null
|
||||
// Basically they are for the firing range
|
||||
/obj/structure/target_stake
|
||||
name = "target stake"
|
||||
desc = "A thin platform with negatively-magnetized wheels."
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "target_stake"
|
||||
density = TRUE
|
||||
w_class = ITEMSIZE_HUGE
|
||||
var/obj/item/target/pinned_target // the current pinned target
|
||||
|
||||
/obj/structure/target_stake/Moved(atom/old_loc, direction, forced = FALSE)
|
||||
. = ..()
|
||||
// Move the pinned target along with the stake
|
||||
if(pinned_target in view(3, src))
|
||||
pinned_target.forceMove(loc)
|
||||
|
||||
else // Sanity check: if the pinned target can't be found in immediate view
|
||||
pinned_target = null
|
||||
density = TRUE
|
||||
|
||||
/obj/structure/target_stake/attackby(obj/item/W as obj, mob/user as mob)
|
||||
// Putting objects on the stake. Most importantly, targets
|
||||
if(pinned_target)
|
||||
return // get rid of that pinned target first!
|
||||
|
||||
if(istype(W, /obj/item/target))
|
||||
density = FALSE
|
||||
W.density = TRUE
|
||||
user.remove_from_mob(W)
|
||||
W.loc = loc
|
||||
W.layer = ABOVE_JUNK_LAYER
|
||||
pinned_target = W
|
||||
to_chat(user, "You slide the target into the stake.")
|
||||
return
|
||||
|
||||
/obj/structure/target_stake/attack_hand(mob/user as mob)
|
||||
// taking pinned targets off!
|
||||
if(pinned_target)
|
||||
density = TRUE
|
||||
pinned_target.density = FALSE
|
||||
pinned_target.layer = OBJ_LAYER
|
||||
|
||||
pinned_target.loc = user.loc
|
||||
if(ishuman(user))
|
||||
if(!user.get_active_hand())
|
||||
user.put_in_hands(pinned_target)
|
||||
to_chat(user, "You take the target out of the stake.")
|
||||
else
|
||||
pinned_target.loc = get_turf(user)
|
||||
to_chat(user, "You take the target out of the stake.")
|
||||
|
||||
pinned_target = null
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user