mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-11 18:22:14 +00:00
* Closets now initialize their contents on demand (more than 1.6 seconds of init time saved) * conflicts Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com> Co-authored-by: Tom <8881105+tf-4@users.noreply.github.com>
308 lines
9.4 KiB
Plaintext
308 lines
9.4 KiB
Plaintext
/obj/structure/closet/crate
|
|
name = "crate"
|
|
desc = "A rectangular steel crate."
|
|
icon = 'icons/obj/storage/crates.dmi' //ICON OVERRIDEN IN SKYRAT AESTHETICS - SEE MODULE
|
|
icon_state = "crate"
|
|
req_access = null
|
|
can_weld_shut = FALSE
|
|
horizontal = TRUE
|
|
allow_objects = TRUE
|
|
allow_dense = TRUE
|
|
dense_when_open = TRUE
|
|
delivery_icon = "deliverycrate"
|
|
open_sound = 'sound/machines/crate_open.ogg'
|
|
close_sound = 'sound/machines/crate_close.ogg'
|
|
open_sound_volume = 35
|
|
close_sound_volume = 50
|
|
drag_slowdown = 0
|
|
door_anim_time = 0 // no animation
|
|
pass_flags_self = PASSSTRUCTURE | LETPASSTHROW
|
|
var/crate_climb_time = 20
|
|
var/obj/item/paper/fluff/jobs/cargo/manifest/manifest
|
|
|
|
/obj/structure/closet/crate/Initialize(mapload)
|
|
. = ..()
|
|
if(icon_state == "[initial(icon_state)]open")
|
|
opened = TRUE
|
|
AddElement(/datum/element/climbable, climb_time = crate_climb_time * 0.5, climb_stun = 0)
|
|
else
|
|
AddElement(/datum/element/climbable, climb_time = crate_climb_time, climb_stun = 0)
|
|
update_appearance()
|
|
|
|
/obj/structure/closet/crate/Destroy()
|
|
QDEL_NULL(manifest)
|
|
return ..()
|
|
|
|
/obj/structure/closet/crate/CanAllowThrough(atom/movable/mover, border_dir)
|
|
. = ..()
|
|
if(!istype(mover, /obj/structure/closet))
|
|
var/obj/structure/closet/crate/locatedcrate = locate(/obj/structure/closet/crate) in get_turf(mover)
|
|
if(locatedcrate) //you can walk on it like tables, if you're not in an open crate trying to move to a closed crate
|
|
if(opened) //if we're open, allow entering regardless of located crate openness
|
|
return TRUE
|
|
if(!locatedcrate.opened) //otherwise, if the located crate is closed, allow entering
|
|
return TRUE
|
|
|
|
/obj/structure/closet/crate/update_icon_state()
|
|
icon_state = "[initial(icon_state)][opened ? "open" : ""]"
|
|
return ..()
|
|
|
|
/obj/structure/closet/crate/closet_update_overlays(list/new_overlays)
|
|
. = new_overlays
|
|
if(manifest)
|
|
. += "manifest"
|
|
if(broken)
|
|
. += "securecrateemag"
|
|
else if(locked)
|
|
. += "securecrater"
|
|
else if(secure)
|
|
. += "securecrateg"
|
|
|
|
/obj/structure/closet/crate/attack_hand(mob/user, list/modifiers)
|
|
. = ..()
|
|
if(.)
|
|
return
|
|
if(manifest)
|
|
tear_manifest(user)
|
|
|
|
/obj/structure/closet/crate/after_open(mob/living/user, force)
|
|
. = ..()
|
|
RemoveElement(/datum/element/climbable, climb_time = crate_climb_time, climb_stun = 0)
|
|
AddElement(/datum/element/climbable, climb_time = crate_climb_time * 0.5, climb_stun = 0)
|
|
|
|
/obj/structure/closet/crate/after_close(mob/living/user, force)
|
|
. = ..()
|
|
RemoveElement(/datum/element/climbable, climb_time = crate_climb_time * 0.5, climb_stun = 0)
|
|
AddElement(/datum/element/climbable, climb_time = crate_climb_time, climb_stun = 0)
|
|
|
|
|
|
/obj/structure/closet/crate/open(mob/living/user, force = FALSE)
|
|
. = ..()
|
|
if(. && !QDELETED(manifest))
|
|
to_chat(user, span_notice("The manifest is torn off [src]."))
|
|
playsound(src, 'sound/items/poster_ripped.ogg', 75, TRUE)
|
|
manifest.forceMove(get_turf(src))
|
|
manifest = null
|
|
update_appearance()
|
|
|
|
/obj/structure/closet/crate/proc/tear_manifest(mob/user)
|
|
to_chat(user, span_notice("You tear the manifest off of [src]."))
|
|
playsound(src, 'sound/items/poster_ripped.ogg', 75, TRUE)
|
|
|
|
manifest.forceMove(loc)
|
|
if(ishuman(user))
|
|
user.put_in_hands(manifest)
|
|
manifest = null
|
|
update_appearance()
|
|
|
|
/obj/structure/closet/crate/coffin
|
|
name = "coffin"
|
|
desc = "It's a burial receptacle for the dearly departed."
|
|
icon_state = "coffin"
|
|
resistance_flags = FLAMMABLE
|
|
max_integrity = 70
|
|
material_drop = /obj/item/stack/sheet/mineral/wood
|
|
material_drop_amount = 5
|
|
open_sound = 'sound/machines/wooden_closet_open.ogg'
|
|
close_sound = 'sound/machines/wooden_closet_close.ogg'
|
|
open_sound_volume = 25
|
|
close_sound_volume = 50
|
|
can_install_electronics = FALSE
|
|
|
|
/obj/structure/closet/crate/maint
|
|
|
|
/obj/structure/closet/crate/maint/Initialize(mapload)
|
|
..()
|
|
|
|
var/static/list/possible_crates = RANDOM_CRATE_LOOT
|
|
|
|
var/crate_path = pick_weight(possible_crates)
|
|
|
|
var/obj/structure/closet/crate = new crate_path(loc)
|
|
crate.RegisterSignal(crate, COMSIG_CLOSET_POPULATE_CONTENTS, /obj/structure/closet/.proc/populate_with_random_maint_loot)
|
|
if (prob(50))
|
|
crate.opened = TRUE
|
|
crate.update_appearance()
|
|
|
|
return INITIALIZE_HINT_QDEL
|
|
|
|
/obj/structure/closet/proc/populate_with_random_maint_loot()
|
|
SIGNAL_HANDLER
|
|
|
|
for (var/i in 1 to rand(2,6))
|
|
new /obj/effect/spawner/random/maintenance(src)
|
|
|
|
/obj/structure/closet/crate/trashcart/Initialize(mapload)
|
|
. = ..()
|
|
AddElement(/datum/element/swabable, CELL_LINE_TABLE_SLUDGE, CELL_VIRUS_TABLE_GENERIC, rand(2,3), 15)
|
|
|
|
/obj/structure/closet/crate/trashcart/filled
|
|
|
|
/obj/structure/closet/crate/trashcart/filled/PopulateContents()
|
|
. = ..()
|
|
for(var/i in 1 to rand(7,15))
|
|
new /obj/effect/spawner/random/trash/garbage(src)
|
|
if(prob(12))
|
|
new /obj/item/storage/bag/trash/filled(src)
|
|
new /obj/effect/spawner/random/trash/grime(loc)
|
|
|
|
/obj/structure/closet/crate/internals
|
|
desc = "An internals crate."
|
|
name = "internals crate"
|
|
icon_state = "o2crate"
|
|
|
|
/obj/structure/closet/crate/trashcart //please make this a generic cart path later after things calm down a little
|
|
desc = "A heavy, metal trashcart with wheels."
|
|
name = "trash cart"
|
|
icon_state = "trashcart"
|
|
can_install_electronics = FALSE
|
|
|
|
/obj/structure/closet/crate/trashcart/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE)
|
|
. = ..()
|
|
if(has_gravity())
|
|
playsound(src, 'sound/effects/roll.ogg', 100, TRUE)
|
|
|
|
/obj/structure/closet/crate/trashcart/laundry
|
|
name = "laundry cart"
|
|
desc = "A large cart for hauling around large amounts of laundry."
|
|
icon_state = "laundry"
|
|
|
|
/obj/structure/closet/crate/medical
|
|
desc = "A medical crate."
|
|
name = "medical crate"
|
|
icon_state = "medicalcrate"
|
|
|
|
/obj/structure/closet/crate/freezer
|
|
desc = "A freezer."
|
|
name = "freezer"
|
|
icon_state = "freezer"
|
|
|
|
//Snowflake organ freezer code
|
|
//Order is important, since we check source, we need to do the check whenever we have all the organs in the crate
|
|
|
|
/obj/structure/closet/crate/freezer/open(mob/living/user, force = FALSE)
|
|
recursive_organ_check(src)
|
|
..()
|
|
|
|
/obj/structure/closet/crate/freezer/close()
|
|
..()
|
|
recursive_organ_check(src)
|
|
|
|
/obj/structure/closet/crate/freezer/Destroy()
|
|
recursive_organ_check(src)
|
|
return ..()
|
|
|
|
/obj/structure/closet/crate/freezer/Initialize(mapload)
|
|
. = ..()
|
|
recursive_organ_check(src)
|
|
|
|
|
|
|
|
/obj/structure/closet/crate/freezer/blood
|
|
name = "blood freezer"
|
|
desc = "A freezer containing packs of blood."
|
|
|
|
/obj/structure/closet/crate/freezer/blood/PopulateContents()
|
|
. = ..()
|
|
new /obj/item/reagent_containers/blood(src)
|
|
new /obj/item/reagent_containers/blood(src)
|
|
new /obj/item/reagent_containers/blood/a_minus(src)
|
|
new /obj/item/reagent_containers/blood/b_minus(src)
|
|
new /obj/item/reagent_containers/blood/b_plus(src)
|
|
new /obj/item/reagent_containers/blood/o_minus(src)
|
|
new /obj/item/reagent_containers/blood/o_plus(src)
|
|
new /obj/item/reagent_containers/blood/lizard(src)
|
|
new /obj/item/reagent_containers/blood/ethereal(src)
|
|
for(var/i in 1 to 3)
|
|
new /obj/item/reagent_containers/blood/random(src)
|
|
|
|
/obj/structure/closet/crate/freezer/surplus_limbs
|
|
name = "surplus prosthetic limbs"
|
|
desc = "A crate containing an assortment of cheap prosthetic limbs."
|
|
|
|
/obj/structure/closet/crate/freezer/surplus_limbs/PopulateContents()
|
|
. = ..()
|
|
new /obj/item/bodypart/l_arm/robot/surplus(src)
|
|
new /obj/item/bodypart/l_arm/robot/surplus(src)
|
|
new /obj/item/bodypart/r_arm/robot/surplus(src)
|
|
new /obj/item/bodypart/r_arm/robot/surplus(src)
|
|
new /obj/item/bodypart/l_leg/robot/surplus(src)
|
|
new /obj/item/bodypart/l_leg/robot/surplus(src)
|
|
new /obj/item/bodypart/r_leg/robot/surplus(src)
|
|
new /obj/item/bodypart/r_leg/robot/surplus(src)
|
|
|
|
/obj/structure/closet/crate/radiation
|
|
desc = "A crate with a radiation sign on it."
|
|
name = "radiation crate"
|
|
icon_state = "radiation"
|
|
|
|
/obj/structure/closet/crate/hydroponics
|
|
name = "hydroponics crate"
|
|
desc = "All you need to destroy those pesky weeds and pests."
|
|
icon_state = "hydrocrate"
|
|
|
|
/obj/structure/closet/crate/engineering
|
|
name = "engineering crate"
|
|
icon_state = "engi_crate"
|
|
|
|
/obj/structure/closet/crate/engineering/electrical
|
|
icon_state = "engi_e_crate"
|
|
|
|
/obj/structure/closet/crate/rcd
|
|
desc = "A crate for the storage of an RCD."
|
|
name = "\improper RCD crate"
|
|
icon_state = "engi_crate"
|
|
|
|
/obj/structure/closet/crate/rcd/PopulateContents()
|
|
..()
|
|
for(var/i in 1 to 4)
|
|
new /obj/item/rcd_ammo(src)
|
|
new /obj/item/construction/rcd(src)
|
|
|
|
/obj/structure/closet/crate/science
|
|
name = "science crate"
|
|
desc = "A science crate."
|
|
icon_state = "scicrate"
|
|
|
|
/obj/structure/closet/crate/solarpanel_small
|
|
name = "budget solar panel crate"
|
|
icon_state = "engi_e_crate"
|
|
|
|
/obj/structure/closet/crate/solarpanel_small/PopulateContents()
|
|
..()
|
|
for(var/i in 1 to 13)
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/circuitboard/computer/solar_control(src)
|
|
new /obj/item/paper/guides/jobs/engi/solars(src)
|
|
new /obj/item/electronics/tracker(src)
|
|
|
|
/obj/structure/closet/crate/goldcrate
|
|
name = "gold crate"
|
|
|
|
/obj/structure/closet/crate/goldcrate/PopulateContents()
|
|
..()
|
|
new /obj/item/storage/belt/champion(src)
|
|
|
|
/obj/structure/closet/crate/goldcrate/populate_contents_immediate()
|
|
. = ..()
|
|
|
|
// /datum/objective_item/stack/gold
|
|
for(var/i in 1 to 3)
|
|
new /obj/item/stack/sheet/mineral/gold(src, 1, FALSE)
|
|
|
|
/obj/structure/closet/crate/silvercrate
|
|
name = "silver crate"
|
|
|
|
/obj/structure/closet/crate/silvercrate/PopulateContents()
|
|
..()
|
|
for(var/i in 1 to 5)
|
|
new /obj/item/coin/silver(src)
|
|
|
|
/obj/structure/closet/crate/decorations
|
|
icon_state = "engi_crate"
|
|
|
|
/obj/structure/closet/crate/decorations/PopulateContents()
|
|
. = ..()
|
|
for(var/i in 1 to 4)
|
|
new /obj/effect/spawner/random/decoration/generic(src)
|