mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-07-22 13:27:36 +01:00
d6653ee3aa
Adds two tajaran teas to the game, Messa's Tear and ras'nif. These can be found in the loadout and the bar, as well as random warehouse spawns. Adds solar salve, a legal herbal substance from Adhomai, found in the loadout and warehouse spawns. Also performs some tweaks to the Konyang teas in order to make brewing teas with them easier. --------- Signed-off-by: Greenjoe12345 <33647525+Greenjoe12345@users.noreply.github.com>
794 lines
26 KiB
Plaintext
794 lines
26 KiB
Plaintext
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
|
|
|
|
#define ABOVE_TABLE 1
|
|
#define UNDER_TABLE -1
|
|
/obj/structure/closet/crate
|
|
name = "crate"
|
|
desc = "A rectangular steel crate."
|
|
icon = 'icons/obj/containers/crate.dmi'
|
|
icon_state = "crate"
|
|
climbable = TRUE
|
|
build_amt = 10
|
|
slowdown = 0
|
|
open_sound = 'sound/machines/crate_open.ogg'
|
|
close_sound = 'sound/machines/crate_close.ogg'
|
|
open_sound_volume = 35
|
|
close_sound_volume = 50
|
|
store_structure = TRUE
|
|
dense_when_open = TRUE
|
|
door_anim_squish = 0.30
|
|
door_anim_time = 3
|
|
door_anim_angle = 140
|
|
door_hinge_x = 3.5
|
|
pass_flags_self = PASSSTRUCTURE | LETPASSTHROW
|
|
|
|
var/tablestatus = 0
|
|
|
|
var/azimuth_angle_2 = 180 //in this context the azimuth angle for over 90 degree
|
|
var/radius_2 = 1.35
|
|
var/static/list/animation_math //assoc list with pre calculated values
|
|
|
|
/obj/structure/closet/crate/mechanics_hints(mob/user, distance, is_adjacent)
|
|
. += ..()
|
|
. += "Crates can be placed on top of tables by clicking and dragging the crate onto the target table."
|
|
|
|
/obj/structure/closet/crate/antagonist_hints(mob/user, distance, is_adjacent)
|
|
. = list()
|
|
|
|
/obj/structure/closet/crate/can_open()
|
|
if(tablestatus == UNDER_TABLE)//Can't be opened while under a table
|
|
return 0
|
|
. = ..()
|
|
|
|
/obj/structure/closet/crate/can_close()
|
|
return 1
|
|
|
|
/obj/structure/closet/crate/animate_door(var/closing = FALSE)
|
|
if(!door_anim_time)
|
|
return
|
|
if(!door_obj) door_obj = new
|
|
if(animation_math == null) //checks if there is already a list for animation_math if not creates one to avoid runtimes
|
|
animation_math = new/list()
|
|
if(!door_anim_time == 0 && !animation_math["[door_anim_time]-[door_anim_angle]-[azimuth_angle_2]-[radius_2]-[door_hinge_x]"])
|
|
animation_list()
|
|
vis_contents |= door_obj
|
|
door_obj.icon = icon
|
|
door_obj.icon_state = "[icon_door || icon_state]_door"
|
|
is_animating_door = TRUE
|
|
var/num_steps = round(door_anim_time / world.tick_lag)
|
|
var/list/animation_math_list = animation_math["[door_anim_time]-[door_anim_angle]-[azimuth_angle_2]-[radius_2]-[door_hinge_x]"]
|
|
for(var/I in 0 to num_steps)
|
|
var/door_state = I == (closing ? num_steps : 0) ? "[icon_door || icon_state]_door" : animation_math_list[closing ? 2 * num_steps - I : num_steps + I] <= 0 ? "[icon_door_override ? icon_door : icon_state]_back" : "[icon_door || icon_state]_door"
|
|
var/door_layer = I == (closing ? num_steps : 0) ? ABOVE_HUMAN_LAYER : animation_math_list[closing ? 2 * num_steps - I : num_steps + I] <= 0 ? FLOAT_LAYER : ABOVE_HUMAN_LAYER
|
|
var/crateanim_1 = 0
|
|
var/crateanim_2 = 1
|
|
|
|
if(!(I == (closing ? num_steps : 0)))
|
|
crateanim_1 = animation_math_list[closing ? num_steps - I : I]
|
|
crateanim_2 = animation_math_list[closing ? 2 * num_steps - I : num_steps + I]
|
|
|
|
var/matrix/M = get_door_transform(crateanim_1, crateanim_2)
|
|
if(I == 0)
|
|
door_obj.transform = M
|
|
door_obj.icon_state = door_state
|
|
door_obj.layer = door_layer
|
|
else if(I == 1)
|
|
animate(door_obj, transform = M, icon_state = door_state, layer = door_layer, time = world.tick_lag, flags = ANIMATION_END_NOW)
|
|
else
|
|
animate(transform = M, icon_state = door_state, layer = door_layer, time = world.tick_lag)
|
|
|
|
addtimer(CALLBACK(src, PROC_REF(end_door_animation)), door_anim_time, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_CLIENT_TIME)
|
|
|
|
/obj/structure/closet/crate/get_door_transform(crateanim_1, crateanim_2)
|
|
var/matrix/M = matrix()
|
|
M.Translate(0, -door_hinge_x)
|
|
M.Multiply(matrix(1, crateanim_1, 0, 0, crateanim_2, 0))
|
|
M.Translate(0, door_hinge_x)
|
|
return M
|
|
|
|
/obj/structure/closet/crate/proc/animation_list() //pre calculates a list of values for the crate animation cause byond not like math
|
|
var/num_steps_1 = door_anim_time / world.tick_lag
|
|
var/list/new_animation_math_sublist[num_steps_1 * 2]
|
|
for(var/I in 1 to num_steps_1) //loop to save the animation values into the lists
|
|
var/angle_1 = door_anim_angle * (I / num_steps_1)
|
|
var/polar_angle = abs(arcsin(cos(angle_1)))
|
|
var/azimuth_angle = angle_1 >= 90 ? azimuth_angle_2 : 0
|
|
var/radius_cr = angle_1 >= 90 ? radius_2 : 1
|
|
new_animation_math_sublist[I] = -sin(polar_angle) * sin(azimuth_angle) * radius_cr
|
|
new_animation_math_sublist[num_steps_1 + I] = cos(azimuth_angle) * sin(polar_angle) * radius_cr
|
|
animation_math["[door_anim_time]-[door_anim_angle]-[azimuth_angle_2]-[radius_2]-[door_hinge_x]"] = new_animation_math_sublist
|
|
|
|
/*
|
|
==========================
|
|
Table interactions
|
|
==========================
|
|
*/
|
|
/obj/structure/closet/crate/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
|
if(mover?.movement_type & PHASING)
|
|
return TRUE
|
|
if (istype(mover, /obj/structure/closet/crate))//Handle interaction with other crates
|
|
var/obj/structure/closet/crate/C = mover
|
|
if (tablestatus && tablestatus != C.tablestatus) // Crates can go under tables with crates on top of them, and vice versa
|
|
return TRUE
|
|
else
|
|
return FALSE
|
|
if (istype(mover,/obj/projectile))
|
|
// Crates on a table always block shots, otherwise they only occasionally do so.
|
|
return tablestatus == ABOVE_TABLE ? FALSE : (prob(15) ? FALSE : TRUE)
|
|
else if((istype(mover) && (mover.pass_flags & PASSTABLE)) && tablestatus == ABOVE_TABLE)
|
|
return TRUE
|
|
return ..()
|
|
|
|
/obj/structure/closet/crate/Move(var/turf/destination, dir)
|
|
. = ..()
|
|
if(.)
|
|
if (locate(/obj/structure/table) in destination)
|
|
if(locate(/obj/structure/table/rack) in destination)
|
|
set_tablestatus(ABOVE_TABLE)
|
|
else if(tablestatus != ABOVE_TABLE)
|
|
set_tablestatus(UNDER_TABLE)//Slide under the table
|
|
else
|
|
set_tablestatus(FALSE)
|
|
|
|
/obj/structure/closet/crate/toggle(var/mob/user)
|
|
if(!opened && tablestatus == UNDER_TABLE)
|
|
to_chat(user, SPAN_WARNING("You can't open \the [src] while the lid is obstructed!"))
|
|
return FALSE
|
|
if(istype(loc, /obj/structure/crate_shelf))
|
|
to_chat(user, SPAN_WARNING("You can't open \the [src] while it is on a shelf!"))
|
|
return FALSE
|
|
else
|
|
return ..()
|
|
|
|
/obj/structure/closet/crate/proc/set_tablestatus(var/target)
|
|
if (tablestatus != target)
|
|
tablestatus = target
|
|
|
|
spawn(3)//Short spawn prevents things popping up where they shouldnt
|
|
switch (target)
|
|
if (ABOVE_TABLE)
|
|
layer = ABOVE_TABLE_LAYER
|
|
pixel_y = 8
|
|
if (FALSE)
|
|
layer = initial(layer)
|
|
pixel_y = 0
|
|
if (UNDER_TABLE)
|
|
layer = BELOW_TABLE_LAYER
|
|
pixel_y = -4
|
|
|
|
//For putting on tables
|
|
/obj/structure/closet/crate/mouse_drop_dragged(atom/over, mob/user, src_location, over_location, params)
|
|
if (istype(over, /obj/structure/table) && !istype(loc, /obj/structure/crate_shelf))
|
|
put_on_table(over, user)
|
|
return TRUE
|
|
else if(istype(over, /obj/structure/crate_shelf) && !istype(loc, /obj/structure/crate_shelf))
|
|
put_on_shelf(over, user)
|
|
return TRUE
|
|
if(istype(loc, /obj/structure/crate_shelf) && isturf(over) && !is_blocked_turf(over))
|
|
take_off_shelf(loc, user, over)
|
|
return TRUE
|
|
else
|
|
return ..()
|
|
|
|
/obj/structure/closet/crate/proc/put_on_shelf(var/obj/structure/crate_shelf/shelf, var/mob/user)
|
|
shelf.load(src, user)
|
|
|
|
/obj/structure/closet/crate/proc/take_off_shelf(var/obj/structure/crate_shelf/shelf, var/mob/user, turf/unload_turf)
|
|
shelf.unload(src, user, unload_turf)
|
|
|
|
/obj/structure/closet/crate/Adjacent(atom/neighbor, atom/target, atom/movable/mover)
|
|
. = ..()
|
|
if(istype(loc, /obj/structure/crate_shelf))
|
|
var/obj/structure/crate_shelf/S = loc
|
|
return S.Adjacent(neighbor, target, mover)
|
|
|
|
/obj/structure/closet/crate/proc/put_on_table(var/obj/structure/table/table, var/mob/user)
|
|
if (!table || !user || (tablestatus == UNDER_TABLE))
|
|
return
|
|
|
|
//User must be in reach of the crate
|
|
if (!user.Adjacent(src))
|
|
to_chat(user, SPAN_WARNING("You need to be closer to the crate!"))
|
|
return
|
|
|
|
//One of us has to be near the table
|
|
if (!user.Adjacent(table) && !Adjacent(table))
|
|
to_chat(user, SPAN_WARNING("Take the crate closer to the table!"))
|
|
return
|
|
|
|
for (var/obj/structure/closet/crate/C in get_turf(table))
|
|
if (C.tablestatus != UNDER_TABLE)
|
|
to_chat(user, SPAN_WARNING("There's already a crate on this table!"))
|
|
return
|
|
|
|
//Crates are heavy, hauling them onto tables is hard.
|
|
//The more stuff thats in it, the longer it takes
|
|
//Good place to factor in Strength in future
|
|
var/timeneeded = 2 SECONDS
|
|
|
|
if (tablestatus == ABOVE_TABLE && Adjacent(table))
|
|
//Sliding along a tabletop we're already on. Instant and silent
|
|
timeneeded = 0
|
|
return TRUE
|
|
else
|
|
//Add time based on mass of contents
|
|
for (var/obj/O in contents)
|
|
timeneeded += 1.5* O.w_class
|
|
for (var/mob/M in contents)
|
|
timeneeded += 1.5* M.mob_size
|
|
|
|
if (timeneeded > 0)
|
|
user.visible_message("[user] starts hoisting \the [src] onto \the [table].", "You start hoisting \the [src] onto \the [table]. This will take about [timeneeded * 0.1] seconds.")
|
|
user.face_atom(src)
|
|
if (!do_after(user, timeneeded, src))
|
|
return FALSE
|
|
else
|
|
forceMove(get_turf(table))
|
|
set_tablestatus(ABOVE_TABLE)
|
|
var/loudness = "thunk."
|
|
if(timeneeded * 0.1 > 10)
|
|
loudness = "loud THUNK!"
|
|
visible_message("[user] puts \the [src] onto \the [table] with a [loudness]", "[user] puts \the [src] onto \the [table].", intent_message = THUNK_SOUND)
|
|
return TRUE
|
|
|
|
/*
|
|
=====================
|
|
Secure Crates
|
|
=====================
|
|
*/
|
|
|
|
/obj/structure/closet/crate/secure
|
|
name = "secure crate"
|
|
desc = "A secure crate."
|
|
locked = TRUE
|
|
secure = TRUE
|
|
secure_lights = TRUE
|
|
health = 200
|
|
|
|
/obj/structure/closet/crate/plastic
|
|
name = "plastic crate"
|
|
desc = "A rectangular plastic crate."
|
|
icon_state = "plastic_crate"
|
|
|
|
/obj/structure/closet/crate/coffin
|
|
name = "coffin"
|
|
desc = "It's a burial receptacle for the dearly departed."
|
|
icon_state = "coffin"
|
|
build_amt = 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
|
|
door_anim_angle = 140
|
|
azimuth_angle_2 = 180
|
|
door_anim_time = 5
|
|
door_hinge_x = 5
|
|
|
|
/obj/structure/closet/crate/internals
|
|
name = "internals crate"
|
|
desc = "A internals crate."
|
|
icon_state = "o2_crate"
|
|
|
|
/obj/structure/closet/crate/trashcart
|
|
name = "trash cart"
|
|
desc = "A heavy, metal trashcart with wheels."
|
|
icon_state = "trashcart"
|
|
door_hinge_x = 2.5
|
|
|
|
/obj/structure/closet/crate/miningcart
|
|
desc = "A mining cart. This one doesn't work on rails, but has to be dragged."
|
|
name = "mining cart"
|
|
icon_state = "miningcart"
|
|
door_hinge_x = 2.5
|
|
|
|
/obj/structure/closet/crate/miningcart/ore/fill()
|
|
var/i_max = rand(3, 6)
|
|
for(var/i in 1 to i_max)
|
|
var/o = pickweight(
|
|
list(
|
|
/obj/item/ore = 2,
|
|
/obj/item/ore/coal = 3,
|
|
/obj/item/ore/diamond = 1,
|
|
/obj/item/ore/glass = 3,
|
|
/obj/item/ore/aluminium = 3,
|
|
/obj/item/ore/gold = 2,
|
|
/obj/item/ore/iron = 3,
|
|
/obj/item/ore/osmium = 1,
|
|
/obj/item/ore/lead = 2,
|
|
/obj/item/ore/silver = 2,
|
|
/obj/item/ore/slag = 1,
|
|
/obj/item/ore/uranium = 1
|
|
)
|
|
)
|
|
var/j_max = rand(4, 10)
|
|
for(var/j in 1 to j_max)
|
|
new o(src)
|
|
|
|
/*these aren't needed anymore
|
|
/obj/structure/closet/crate/hat
|
|
desc = "A crate filled with Valuable Collector's Hats!."
|
|
name = "Hat Crate"
|
|
icon_state = "crate"
|
|
icon_opened = "crateopen"
|
|
icon_closed = "crate"
|
|
*/
|
|
|
|
/obj/structure/closet/crate/medical
|
|
name = "medical crate"
|
|
desc = "A medical crate."
|
|
icon_state = "medical_crate"
|
|
|
|
/obj/structure/closet/crate/rfd
|
|
name = "\improper RFD C-Class crate"
|
|
desc = "A crate with a Rapid-Fabrication-Device C-Class."
|
|
icon_state = "eng_tool"
|
|
icon_door_override = TRUE
|
|
icon_door = "eng"
|
|
|
|
/obj/structure/closet/crate/rfd/fill()
|
|
new /obj/item/rfd_ammo(src)
|
|
new /obj/item/rfd_ammo(src)
|
|
new /obj/item/rfd_ammo(src)
|
|
new /obj/item/rfd/construction(src)
|
|
|
|
/obj/structure/closet/crate/solar
|
|
name = "solar pack crate"
|
|
icon_state = "eng_elec"
|
|
icon_door_override = TRUE
|
|
icon_door = "eng"
|
|
|
|
/obj/structure/closet/crate/solar/fill()
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/solar_assembly(src)
|
|
new /obj/item/circuitboard/solar_control(src)
|
|
new /obj/item/tracker_electronics(src)
|
|
new /obj/item/paper/solar(src)
|
|
|
|
/obj/structure/closet/crate/freezer
|
|
name = "freezer"
|
|
desc = "A freezer."
|
|
icon_state = "freezer"
|
|
door_hinge_x = 4.5
|
|
var/target_temp = T0C - 40
|
|
var/cooling_power = 40
|
|
|
|
/obj/structure/closet/crate/freezer/return_air()
|
|
var/datum/gas_mixture/gas = (..())
|
|
if(!gas) return null
|
|
var/datum/gas_mixture/newgas = new/datum/gas_mixture()
|
|
newgas.copy_from(gas)
|
|
if(newgas.temperature <= target_temp) return
|
|
|
|
if((newgas.temperature - cooling_power) > target_temp)
|
|
newgas.temperature -= cooling_power
|
|
else
|
|
newgas.temperature = target_temp
|
|
return newgas
|
|
|
|
/obj/structure/closet/crate/freezer/rations
|
|
name = "emergency rations"
|
|
desc = "A crate of emergency rations and bottles of water."
|
|
|
|
/obj/structure/closet/crate/freezer/rations/fill()
|
|
for(var/i=1,i<=6,i++)
|
|
new /obj/random/mre(src)
|
|
new /obj/item/reagent_containers/food/drinks/waterbottle(src)
|
|
|
|
/obj/structure/closet/crate/freezer/kois
|
|
name = "freezer"
|
|
desc = "A freezer, painted in a sickly yellow, with a biohazard sign on the side."
|
|
icon_state = "freezer_kois"
|
|
|
|
/obj/structure/closet/crate/freezer/kois/rations
|
|
name = "emergency k'ois rations"
|
|
desc = "A crate of emergency k'ois rations and bottles of water. Painted in a sickly yellow, with a biohazard sign on the side."
|
|
|
|
/obj/structure/closet/crate/freezer/kois/rations/fill()
|
|
for(var/i=1,i<=6,i++)
|
|
new /obj/item/storage/box/fancy/mre/menu12(src)
|
|
new /obj/item/reagent_containers/food/drinks/waterbottle(src)
|
|
|
|
/obj/structure/closet/crate/bin
|
|
name = "large bin"
|
|
desc = "A large bin."
|
|
icon_state = "largebin"
|
|
|
|
/obj/structure/closet/crate/bin/filled/fill()
|
|
for(var/i=1,i<=6,i++)
|
|
new /obj/random/junk(src)
|
|
|
|
/obj/structure/closet/crate/drop
|
|
name = "drop crate"
|
|
desc = "A large, sturdy crate meant for airdrops."
|
|
icon_state = "drop_crate"
|
|
door_hinge_x = 0.5
|
|
|
|
/obj/structure/closet/crate/drop/grey
|
|
name = "drop crate"
|
|
desc = "A large, sturdy crate meant for airdrops."
|
|
icon_state = "drop_crate-grey"
|
|
door_hinge_x = 0.5
|
|
|
|
/obj/structure/closet/crate/tool
|
|
name = "tool crate"
|
|
desc = "It's a crate for storing tools."
|
|
icon_state = "eng_tool"
|
|
icon_door_override = TRUE
|
|
icon_door = "eng"
|
|
|
|
/obj/structure/closet/crate/rad
|
|
name = "radioactive gear crate"
|
|
desc = "A crate with a radiation sign on it."
|
|
icon_state = "eng_rad"
|
|
icon_door_override = TRUE
|
|
icon_door = "eng"
|
|
|
|
/obj/structure/closet/crate/rad/gear/fill()
|
|
new /obj/item/clothing/suit/radiation(src)
|
|
new /obj/item/clothing/head/radiation(src)
|
|
new /obj/item/clothing/suit/radiation(src)
|
|
new /obj/item/clothing/head/radiation(src)
|
|
new /obj/item/clothing/suit/radiation(src)
|
|
new /obj/item/clothing/head/radiation(src)
|
|
new /obj/item/clothing/suit/radiation(src)
|
|
new /obj/item/clothing/head/radiation(src)
|
|
|
|
/obj/structure/closet/crate/elec
|
|
name = "electrical supplies crate"
|
|
desc = "It's a crate for storing electrical equipment."
|
|
icon_state = "eng_elec"
|
|
icon_door_override = TRUE
|
|
icon_door = "eng"
|
|
|
|
/obj/structure/closet/crate/weld
|
|
name = "welding supplies crate"
|
|
desc = "It's a crate for storing welding tools."
|
|
icon_state = "eng_weld"
|
|
icon_door_override = TRUE
|
|
icon_door = "eng"
|
|
|
|
/obj/structure/closet/crate/secure/aimodules
|
|
name = "AI modules crate"
|
|
desc = "A secure crate full of AI modules."
|
|
icon_state = "science_crate"
|
|
req_access = list(ACCESS_CENT_SPECOPS)
|
|
|
|
/obj/structure/closet/crate/secure/aimodules/fill()
|
|
for(var/moduletype in subtypesof(/obj/item/aiModule))
|
|
new moduletype(src)
|
|
|
|
/obj/structure/closet/crate/weapon
|
|
name = "weapons crate"
|
|
desc = "A weapons crate."
|
|
icon_state = "syndi_crate" //haha this pun was totally worth it.
|
|
|
|
/obj/structure/closet/crate/weapon/alt
|
|
icon_state = "syndi_crate1"
|
|
|
|
/obj/structure/closet/crate/secure/weapon
|
|
name = "weapons crate"
|
|
desc = "A secure weapons crate."
|
|
icon_state = "syndi_crate"
|
|
icon_door_override = TRUE
|
|
icon_door = "syndi_crate"
|
|
|
|
/obj/structure/closet/crate/secure/weapon/alt
|
|
icon_state = "syndi_crate1"
|
|
icon_door = "syndi_crate1"
|
|
|
|
/obj/structure/closet/crate/secure/legion
|
|
name = "foreign legion supply crate"
|
|
desc = "A secure supply crate, It carries the insignia of the Tau Ceti Foreign Legion. It appears quite scuffed."
|
|
icon_state = "tcfl_crate"
|
|
req_access = list(ACCESS_LEGION)
|
|
|
|
/obj/structure/closet/crate/secure/phoron
|
|
name = "phoron crate"
|
|
desc = "A secure phoron crate."
|
|
icon_state = "phoron_crate"
|
|
open_sound = 'sound/machines/wooden_closet_open.ogg'
|
|
close_sound = 'sound/machines/wooden_closet_close.ogg'
|
|
|
|
/obj/structure/closet/crate/secure/gear
|
|
name = "gear crate"
|
|
desc = "A secure gear crate."
|
|
icon_state = "secgear_crate"
|
|
|
|
/obj/structure/closet/crate/secure/hydrosec
|
|
name = "secure hydroponics crate"
|
|
desc = "A crate painted in the scheme of the station's botanists."
|
|
icon_state = "hydro_crate"
|
|
req_one_access = list(ACCESS_HYDROPONICS, ACCESS_XENOBOTANY)
|
|
|
|
/obj/structure/closet/crate/secure/bin
|
|
name = "secure bin"
|
|
desc = "A secure bin."
|
|
icon_state = "largebins"
|
|
icon_door_overlay = "largebin"
|
|
icon_door_override = TRUE
|
|
icon_door = "largebin"
|
|
|
|
/obj/structure/closet/crate/large
|
|
name = "large crate"
|
|
desc = "A hefty metal crate."
|
|
icon_state = "largemetal"
|
|
health = 200
|
|
door_anim_time = 0
|
|
|
|
/obj/structure/closet/crate/large/close()
|
|
. = ..()
|
|
if (.)//we can hold up to one large item
|
|
var/found = 0
|
|
for(var/obj/structure/S in loc)
|
|
if(S == src)
|
|
continue
|
|
if(!S.anchored)
|
|
found = 1
|
|
S.forceMove(src)
|
|
break
|
|
if(!found)
|
|
for(var/obj/machinery/M in loc)
|
|
if(!M.anchored)
|
|
M.forceMove(src)
|
|
break
|
|
return
|
|
|
|
/obj/structure/closet/crate/secure/large
|
|
name = "large crate"
|
|
desc = "A hefty metal crate with an electronic locking system."
|
|
icon_state = "largemetal"
|
|
icon_door_overlay = "largemetal"
|
|
health = 400
|
|
secure_lights = FALSE
|
|
door_anim_time = 0
|
|
|
|
/obj/structure/closet/crate/secure/large/close()
|
|
. = ..()
|
|
if (.)//we can hold up to one large item
|
|
var/found = 0
|
|
for(var/obj/structure/S in loc)
|
|
if(S == src)
|
|
continue
|
|
if(!S.anchored)
|
|
found = 1
|
|
S.forceMove(src)
|
|
break
|
|
if(!found)
|
|
for(var/obj/machinery/M in loc)
|
|
if(!M.anchored)
|
|
M.forceMove(src)
|
|
break
|
|
return
|
|
|
|
/obj/structure/closet/crate/secure/large/larva // Spawns with one greimorian larva inside of it. Can mature inside, so be careful.
|
|
|
|
/obj/structure/closet/crate/secure/large/larva/fill()
|
|
new /obj/effect/spider/spiderling(src)
|
|
|
|
/obj/structure/closet/crate/secure/large/viscerator // Spawns with one viscerator inside of it.
|
|
|
|
/obj/structure/closet/crate/secure/large/viscerator/fill()
|
|
new /mob/living/simple_animal/hostile/viscerator(src)
|
|
|
|
/obj/structure/closet/crate/secure/large/rats // Spawns with rats inside it.
|
|
|
|
/obj/structure/closet/crate/secure/large/rats/fill()
|
|
for(var/i=1,i<=5,i++)
|
|
new /mob/living/simple_animal/rat(src)
|
|
|
|
/obj/structure/closet/crate/hydroponics
|
|
name = "hydroponics crate"
|
|
desc = "All you need to destroy those pesky weeds and pests."
|
|
icon_state = "hydro_crate"
|
|
|
|
/obj/structure/closet/crate/hydroponics/prespawned
|
|
|
|
//This exists so the prespawned hydro crates spawn with their contents.
|
|
/obj/structure/closet/crate/hydroponics/prespawned/fill()
|
|
new /obj/item/material/minihoe(src)
|
|
new /obj/item/material/hatchet(src)
|
|
new /obj/item/wirecutters/clippers(src)
|
|
new /obj/item/reagent_containers/glass/bucket(src)
|
|
new /obj/item/reagent_containers/spray/plantbgone(src)
|
|
new /obj/item/reagent_containers/spray/plantbgone(src)
|
|
new /obj/item/reagent_containers/glass/fertilizer/ez(src)
|
|
new /obj/item/reagent_containers/glass/fertilizer/ez(src)
|
|
|
|
// Everything you need for beekeeping, including the bees. Those with allergies need not apply.
|
|
/obj/structure/closet/crate/hydroponics/beekeeping
|
|
name = "beekeeping crate"
|
|
desc = "Live bees included! Several small labels warn of the hazards involved therein."
|
|
|
|
/obj/structure/closet/crate/hydroponics/beekeeping/fill()
|
|
new /obj/item/bee_pack(src)
|
|
new /obj/item/honey_frame(src)
|
|
new /obj/item/honey_frame(src)
|
|
new /obj/item/beehive_assembly(src)
|
|
new /obj/item/bee_net(src)
|
|
new /obj/item/bee_smoker(src)
|
|
new /obj/item/crowbar(src)
|
|
|
|
// Includes everything you need to run your own horticultural medicinal operation. Or something more nefarious, if you prefer.
|
|
/obj/structure/closet/crate/hydroponics/herbalism
|
|
name = "herbalist crate"
|
|
desc = "Contains equipment and storage vessels involved in the processing and packaging of herbal medicine."
|
|
|
|
/obj/structure/closet/crate/hydroponics/herbalism/fill()
|
|
new /obj/item/storage/box/spraybottles(src)
|
|
new /obj/item/storage/box/pillbottles(src)
|
|
new /obj/item/storage/box/inhalers_auto(src)
|
|
new /obj/item/storage/box/autoinjectors(src)
|
|
new /obj/item/reagent_containers/chem_disp_cartridge(src)
|
|
new /obj/item/reagent_containers/chem_disp_cartridge(src)
|
|
new /obj/item/reagent_containers/chem_disp_cartridge(src)
|
|
new /obj/item/reagent_containers/chem_disp_cartridge(src)
|
|
new /obj/item/reagent_containers/chem_disp_cartridge(src)
|
|
new /obj/item/reagent_containers/chem_disp_cartridge(src)
|
|
|
|
// Spawns with everything you need to make your very own field kitchen! (assuming you have power)
|
|
// Contains enough to create a stove and oven. Using loops for anything above one for readability. Best paired with a freezer with ingredients.
|
|
// Intended to provide enough equipment that more than just chefs can function as field cooks on expeditions.
|
|
/obj/structure/closet/crate/field_kitchen
|
|
|
|
/obj/structure/closet/crate/field_kitchen/fill()
|
|
for(var/_ in 1 to 6)
|
|
new /obj/item/stock_parts/capacitor(src)
|
|
for(var/_ in 1 to 4)
|
|
new /obj/item/stock_parts/matter_bin(src)
|
|
for(var/_ in 1 to 2)
|
|
new /obj/item/stock_parts/scanning_module(src)
|
|
new /obj/item/circuitboard/oven(src)
|
|
new /obj/item/circuitboard/stove(src)
|
|
new /obj/item/stack/cable_coil(src)
|
|
new /obj/item/storage/box/kitchen(src)
|
|
new /obj/item/reagent_containers/spray/cleaner(src)
|
|
new /obj/item/storage/box/gloves(src)
|
|
new /obj/item/storage/box/large/condiment(src)
|
|
|
|
//A crate that populates itself with randomly selected loot from randomstock.dm
|
|
//Can be passed in a rarity value, which is used as a multiplier on the rare/uncommon chance
|
|
//Quantity of spawns is number of discrete selections from the loot lists, default 10
|
|
|
|
/obj/structure/closet/crate/loot
|
|
name = "unusual container"
|
|
desc = "A mysterious container of unknown origins. What mysteries lie within?"
|
|
icon = 'icons/obj/random.dmi'
|
|
icon_state = "loot_crate"
|
|
var/rarity = 1
|
|
var/quantity = 10
|
|
var/list/spawntypes
|
|
|
|
/obj/structure/closet/crate/loot/Initialize(mapload, no_fill)
|
|
. = ..()
|
|
|
|
spawntypes = list(
|
|
"1" = STOCK_RARE_PROB * rarity,
|
|
"2" = STOCK_UNCOMMON_PROB * rarity,
|
|
"3" = (100 - ((STOCK_RARE_PROB * rarity) + (STOCK_UNCOMMON_PROB * rarity)))
|
|
)
|
|
|
|
var/list/crates_to_use = typesof(/obj/structure/closet/crate) - typesof(/obj/structure/closet/crate/secure/gear_loadout)
|
|
crates_to_use -= /obj/structure/closet/crate/loot
|
|
crates_to_use -= /obj/structure/closet/crate/loot/contraband
|
|
var/icontype = pick(crates_to_use)
|
|
var/obj/structure/closet/crate/C = new icontype(get_turf(src), TRUE) //TRUE as we do not want the crate to fill(), we will fill it ourselves.
|
|
|
|
C.name = name
|
|
C.desc = desc
|
|
|
|
fill_spawned_crate(C, quantity)
|
|
|
|
if(C.secure || C.locked) //These should always be accessible
|
|
C.secure = FALSE
|
|
C.locked = FALSE
|
|
C.secure_lights = FALSE
|
|
C.req_access = null
|
|
|
|
C.anchored = FALSE
|
|
|
|
C.update_icon()
|
|
|
|
qdel(src)
|
|
|
|
/obj/structure/closet/crate/loot/proc/get_spawntype()
|
|
var/stocktype = pickweight(spawntypes)
|
|
switch (stocktype)
|
|
if ("1")
|
|
return pickweight(GLOB.random_stock_rare)
|
|
if ("2")
|
|
return pickweight(GLOB.random_stock_uncommon)
|
|
if ("3")
|
|
return pickweight(GLOB.random_stock_common)
|
|
|
|
/obj/structure/closet/crate/loot/proc/fill_spawned_crate(var/obj/structure/closet/crate/spawned_crate, var/quantity)
|
|
for(var/i in 1 to quantity)
|
|
var/newtype = get_spawntype()
|
|
call(newtype)(spawned_crate)
|
|
|
|
/obj/structure/closet/crate/loot/contraband
|
|
name = "suspicious container"
|
|
desc = "A container of some kind. Any and all identifying markings have been filed away. Who knows what it could hold!"
|
|
|
|
/obj/structure/closet/crate/loot/contraband/fill_spawned_crate(spawned_crate, quantity)
|
|
for(var/i in 1 to quantity)
|
|
new /obj/random/contraband(spawned_crate)
|
|
|
|
/obj/structure/closet/crate/extinguisher_cartridges
|
|
name = "crate of extinguisher cartridges"
|
|
desc = "Contains a dozen empty extinguisher cartridges."
|
|
icon_state = "fire"
|
|
|
|
/obj/structure/closet/crate/extinguisher_cartridges/fill()
|
|
for(var/a = 1 to 12)
|
|
new /obj/item/reagent_containers/extinguisher_refill(src)
|
|
|
|
/obj/structure/closet/crate/autakh
|
|
name = "aut'akh crate"
|
|
desc = "Contains a number of limbs and augmentations created by the Aut'akh Commune."
|
|
icon_state = "autakh_crate"
|
|
|
|
/obj/structure/closet/crate/autakh/fill()
|
|
new /obj/item/organ/external/arm/right/autakh(src)
|
|
new /obj/item/organ/external/arm/right/autakh(src)
|
|
new /obj/item/organ/external/arm/autakh(src)
|
|
new /obj/item/organ/external/arm/autakh(src)
|
|
new /obj/item/organ/external/hand/autakh(src)
|
|
new /obj/item/organ/external/hand/autakh(src)
|
|
new /obj/item/organ/external/hand/right/autakh(src)
|
|
new /obj/item/organ/external/hand/right/autakh(src)
|
|
new /obj/item/organ/external/leg/autakh(src)
|
|
new /obj/item/organ/external/leg/autakh(src)
|
|
new /obj/item/organ/external/leg/right/autakh(src)
|
|
new /obj/item/organ/external/leg/right/autakh(src)
|
|
new /obj/item/organ/external/foot/autakh(src)
|
|
new /obj/item/organ/external/foot/autakh(src)
|
|
new /obj/item/organ/external/foot/right/autakh(src)
|
|
new /obj/item/organ/external/foot/right/autakh(src)
|
|
new /obj/item/organ/external/hand/right/autakh/tool(src)
|
|
new /obj/item/organ/external/hand/right/autakh/tool/mining(src)
|
|
new /obj/item/organ/external/hand/right/autakh/medical(src)
|
|
new /obj/item/organ/external/hand/right/autakh/security(src)
|
|
|
|
/obj/structure/closet/crate/security
|
|
name = "security crate"
|
|
desc = "A secure security crate. Secure."
|
|
icon_state = "security_crate"
|
|
secure = TRUE
|
|
|
|
/obj/structure/closet/crate/drinks
|
|
name = "exotic drinks crate"
|
|
desc = "A crate packed with boxes of various beverages. Handle with care!"
|
|
|
|
/obj/structure/closet/crate/drinks/fill()
|
|
new /obj/item/storage/box/burukutu(src)
|
|
new /obj/item/storage/box/skrellbeerdyn(src)
|
|
new /obj/item/storage/box/khlibnyz(src)
|
|
new /obj/item/storage/box/hrozamal_soda(src)
|
|
new /obj/item/storage/box/xuizijuice(src)
|
|
new /obj/item/storage/box/midynhr_water(src)
|
|
new /obj/item/storage/box/fancy/yoke/grape_juice(src)
|
|
new /obj/item/storage/box/fancy/yoke/beetle_milk(src)
|
|
new /obj/item/storage/box/unique/tea/rasnif(src)
|
|
new /obj/item/storage/box/unique/tea/messa(src)
|
|
new /obj/item/reagent_containers/toothpaste(src)
|
|
new /obj/item/reagent_containers/food/drinks/flask/vacuumflask/mouthwash(src)
|