Merge branch 'release' of https://github.com/VOREStation/VOREStation into upstream-update

This commit is contained in:
izac112
2024-02-26 03:37:23 +01:00
1157 changed files with 778221 additions and 777841 deletions
+248 -248
View File
@@ -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)
+272 -272
View File
@@ -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)
+81 -81
View File
@@ -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
+329 -329
View File
@@ -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 ..()
+73 -73
View File
@@ -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)
+421 -421
View File
@@ -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
+289 -289
View File
@@ -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"
+63 -63
View File
@@ -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
+100 -100
View File
@@ -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
+41 -41
View File
@@ -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
+143 -143
View File
@@ -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)
..()
+31 -31
View File
@@ -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)
+251 -251
View File
@@ -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.
"}
+19 -19
View File
@@ -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)]'."
+191 -191
View File
@@ -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
+64 -64
View File
@@ -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"
+283 -283
View File
@@ -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
..()
+121 -121
View File
@@ -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()
+52 -52
View File
@@ -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