diff --git a/code/__DEFINES/~doppler_defines/traits/declarations.dm b/code/__DEFINES/~doppler_defines/traits/declarations.dm index 391336f06072b..8ee2c0d8e7f75 100644 --- a/code/__DEFINES/~doppler_defines/traits/declarations.dm +++ b/code/__DEFINES/~doppler_defines/traits/declarations.dm @@ -1,3 +1,2 @@ -/// The trait that determines if someone has the system shock quirk. -#define TRAIT_SYSTEM_SHOCK "trait_system_shock" - +/// The trait that determines if someone has the system shock quirk. +#define TRAIT_SYSTEM_SHOCK "trait_system_shock" diff --git a/modular_doppler/epic_loot/code/_basetype.dm b/modular_doppler/epic_loot/code/_basetype.dm new file mode 100644 index 0000000000000..48a1a91349a38 --- /dev/null +++ b/modular_doppler/epic_loot/code/_basetype.dm @@ -0,0 +1,83 @@ +/obj/structure/maintenance_loot_structure + name = "abandoned crate" + icon = 'modular_doppler/epic_loot/icons/loot_structures.dmi' + density = TRUE + anchored = TRUE + layer = BELOW_OBJ_LAYER + obj_flags = CAN_BE_HIT + pass_flags_self = LETPASSTHROW|LETPASSCLICKS + max_integrity = 200 + + /// What storage datum we use + var/storage_datum_to_use = /datum/storage/maintenance_loot_structure + /// Weighted list of the loot that can spawn in this + var/list/loot_weighted_list = list( + /obj/effect/spawner/random/maintenance = 1, + ) + /// This one is going to be weird, a string of dice to use when rolling number of contents + var/loot_spawn_dice_string = "2d4+1" + +/obj/structure/maintenance_loot_structure/Initialize(mapload) + . = ..() + create_storage(storage_type = storage_datum_to_use) + make_contents() + +/obj/structure/maintenance_loot_structure/examine(mob/user) + . = ..() + . += span_engradio("It might have other things you're looking for if you look again later?") + return . + +// Since it doesn't want to play nice for whatever reason +/obj/structure/maintenance_loot_structure/attack_hand(mob/living/user) + if(!user.can_perform_action(src, NEED_HANDS)) + return ..() + atom_storage.open_storage(user) + return TRUE + +/// Fills random contents into this structure's inventory, starting a loop to respawn loot if the container is empty later +/obj/structure/maintenance_loot_structure/proc/make_contents() + var/refill_check_time = rand(15 MINUTES, 30 MINUTES) + spawn_loot() + addtimer(CALLBACK(src, PROC_REF(make_contents)), refill_check_time) + +/// Spawns a random amount of loot into the structure, random numbers based on the amount of storage slots inside it +/obj/structure/maintenance_loot_structure/proc/spawn_loot() + if(length(contents)) + for(var/obj/thing in contents) + qdel(thing) + var/random_loot_amount = roll(loot_spawn_dice_string) + for(var/loot_spawn in 1 to random_loot_amount) + var/obj/new_loot = pick_weight(loot_weighted_list) + new new_loot(src) + Shake(2, 2, 1 SECONDS) + +/datum/storage/maintenance_loot_structure + max_slots = 9 + max_specific_storage = WEIGHT_CLASS_GIGANTIC + max_total_storage = WEIGHT_CLASS_BULKY * 6 + numerical_stacking = FALSE + rustle_sound = FALSE + screen_max_columns = 3 + /// What sound this makes when people open it's storage + var/opening_sound = 'modular_doppler/epic_loot/sound/plastic.mp3' + +/datum/storage/maintenance_loot_structure/open_storage(mob/to_show) + . = ..() + if(!.) + return + playsound(parent, opening_sound, 50, TRUE) + +// Loot items basetype, for convenience +/obj/item/epic_loot + name = "epic loot!!!!!" + desc = "Unknown purpose, unknown maker, unknown value. The only thing I know for real: There will be loot." + icon = 'modular_doppler/epic_loot/icons/epic_loot.dmi' + lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items_righthand.dmi' + inhand_icon_state = "binoculars" + w_class = WEIGHT_CLASS_SMALL + +/obj/item/epic_loot/examine(mob/user) + . = ..() + . += span_engradio("You should probably sell or recycle this.") + return . diff --git a/modular_doppler/epic_loot/code/loot_items/components.dm b/modular_doppler/epic_loot/code/loot_items/components.dm new file mode 100644 index 0000000000000..116507d6923e8 --- /dev/null +++ b/modular_doppler/epic_loot/code/loot_items/components.dm @@ -0,0 +1,214 @@ +/datum/export/epic_loot_components + cost = PAYCHECK_COMMAND + unit_name = "low value salvage" + export_types = list( + /obj/item/epic_loot/grenade_fuze, + /obj/item/epic_loot/nail_box, + /obj/item/epic_loot/cold_weld, + /obj/item/epic_loot/signal_amp, + /obj/item/epic_loot/fuel_conditioner, + ) + +/datum/export/epic_loot_components_super + cost = PAYCHECK_COMMAND * 2 + unit_name = "salvage" + export_types = list( + /obj/item/epic_loot/water_filter, + /obj/item/epic_loot/thermometer, + /obj/item/epic_loot/current_converter, + /obj/item/epic_loot/electric_motor, + ) + +/datum/export/epic_loot_components_super_super + cost = PAYCHECK_COMMAND * 3 + unit_name = "high value salvage" + export_types = list( + /obj/item/epic_loot/thermal_camera, + /obj/item/epic_loot/shuttle_gyro, + /obj/item/epic_loot/phased_array, + /obj/item/epic_loot/shuttle_battery, + ) + +// Grenade fuze, an old design from an old time past. You can still make a pretty good grenade with it though +/obj/item/epic_loot/grenade_fuze + name = "grenade fuze" + desc = "Just the fuze of a grenade, missing the explosive and arguably most important half of the grenade." + icon_state = "fuze" + inhand_icon_state = "pen" + drop_sound = 'sound/items/handling/component_drop.ogg' + pickup_sound = 'sound/items/handling/component_pickup.ogg' + custom_materials = list( + /datum/material/titanium = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT, + ) + +// The filter part of a water filter machine, though these machines are insanely rare due to modern synthesis technology +/obj/item/epic_loot/water_filter + name = "water filter cartridge" + desc = "A blue polymer tube filled with filter medium for use in an industrial water filtration unit." + icon_state = "water_filter" + inhand_icon_state = "miniFE" + drop_sound = 'sound/items/handling/tools/weldingtool_drop.ogg' + pickup_sound = 'sound/items/handling/tools/weldingtool_pickup.ogg' + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/titanium = HALF_SHEET_MATERIAL_AMOUNT, + ) + +// Analog thermometer, how to tell temperature before gas analyzers were cool +/obj/item/epic_loot/thermometer + name = "analog thermometer" + desc = "An outdated, and likely broken, analog thermometer." + icon_state = "thermometer" + inhand_icon_state = "razor" + drop_sound = 'sound/items/handling/tools/multitool_drop.ogg' + pickup_sound = 'sound/items/handling/tools/multitool_pickup.ogg' + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + ) + +// A box of nails, impossible tech on a space station +/obj/item/epic_loot/nail_box + name = "box of nails" + desc = "A pristine box of nails, a method of keeping things together that we... can't really use here, in a space station." + icon_state = "nails" + inhand_icon_state = "rubberducky" + drop_sound = 'sound/items/handling/ammobox_drop.ogg' + pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT, + /datum/material/cardboard = SHEET_MATERIAL_AMOUNT, + ) + +// Used for joining together plastics, ideally. +/obj/item/epic_loot/cold_weld + name = "tube of cold weld" + desc = "A tube of cold weld, used to join together plastics, usually for repair." + icon_state = "cold_weld" + inhand_icon_state = "razor" + drop_sound = 'sound/items/handling/component_drop.ogg' + pickup_sound = 'sound/items/handling/component_pickup.ogg' + custom_materials = list( + /datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT, + ) + +// An electronic motor +/obj/item/epic_loot/electric_motor + name = "electric motor" + desc = "An electrically driven motor for industrial applications." + icon_state = "motor" + inhand_icon_state = "miniFE" + w_class = WEIGHT_CLASS_NORMAL + drop_sound = 'sound/items/handling/cardboard_box/cardboardbox_drop.ogg' + pickup_sound = 'sound/items/handling/cardboard_box/cardboardbox_pickup.ogg' + custom_materials = list( + /datum/material/plastic = SHEET_MATERIAL_AMOUNT, + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + ) + +// Current converters, these change one rating of current into another in a mostly safe manner +/obj/item/epic_loot/current_converter + name = "current converter" + desc = "A device for regulating electric current that passes through it." + icon_state = "current_converter" + inhand_icon_state = "miniFE" + w_class = WEIGHT_CLASS_NORMAL + drop_sound = 'sound/items/handling/tools/weldingtool_drop.ogg' + pickup_sound = 'sound/items/handling/tools/weldingtool_pickup.ogg' + custom_materials = list( + /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/silver = SHEET_MATERIAL_AMOUNT, + /datum/material/gold = SHEET_MATERIAL_AMOUNT, + ) + +// Signal amplifiers, used to take a faint signal and return it stronger than before +/obj/item/epic_loot/signal_amp + name = "signal amplifier" + desc = "A device for taking weakened input signals and strengthening them for use or listening." + icon_state = "signal_amp" + drop_sound = 'sound/items/handling/component_drop.ogg' + pickup_sound = 'sound/items/handling/component_pickup.ogg' + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, + ) + +// Thermal camera modules +/obj/item/epic_loot/thermal_camera + name = "thermal camera module" + desc = "An infrared sensing device used for the production of thermal camera systems." + icon_state = "thermal" + drop_sound = 'sound/items/handling/component_drop.ogg' + pickup_sound = 'sound/items/handling/component_pickup.ogg' + custom_materials = list( + /datum/material/plastic = SHEET_MATERIAL_AMOUNT, + /datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, + ) + +// Shuttle gyroscopes, AKA how a shuttle realizes which way it's pointing +/obj/item/epic_loot/shuttle_gyro + name = "shuttle gyroscope" + desc = "A bulky device used by shuttles and other space faring vessels to find the direction they are facing." + icon_state = "shuttle_gyro" + inhand_icon_state = "miniFE" + w_class = WEIGHT_CLASS_BULKY + drop_sound = 'sound/items/handling/ammobox_drop.ogg' + pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + custom_materials = list( + /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/silver = SHEET_MATERIAL_AMOUNT * 4, + /datum/material/gold = SHEET_MATERIAL_AMOUNT * 4 + ) + +/obj/item/epic_loot/shuttle_gyro/Initialize(mapload) + . = ..() + AddComponent(/datum/component/two_handed, require_twohands = TRUE) + +// Phased array elements, combine a bunch together to get god's strongest radar, or whatever else you can think of +/obj/item/epic_loot/phased_array + name = "phased array element" + desc = "An element of a larger phased array. These combine together to produce sensing and scanning devices used on most common space-faring vessels." + icon_state = "phased_array" + inhand_icon_state = "blankplaque" + w_class = WEIGHT_CLASS_NORMAL + drop_sound = 'sound/items/handling/ammobox_drop.ogg' + pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + custom_materials = list( + /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/silver = SHEET_MATERIAL_AMOUNT, + /datum/material/gold = SHEET_MATERIAL_AMOUNT, + ) + +// Shuttle batteries, used to power electronics while the engines are off +/obj/item/epic_loot/shuttle_battery + name = "shuttle battery" + desc = "A massive shuttle-grade battery, used to keep the electronics of space-faring vessel powered while the main engines are de-activated." + icon_state = "ship_battery" + inhand_icon_state = "blankplaque" + w_class = WEIGHT_CLASS_BULKY + drop_sound = 'sound/items/handling/cardboard_box/cardboardbox_drop.ogg' + pickup_sound = 'sound/items/handling/cardboard_box/cardboardbox_pickup.ogg' + custom_materials = list( + /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 10, + /datum/material/silver = SHEET_MATERIAL_AMOUNT * 4, + /datum/material/gold = SHEET_MATERIAL_AMOUNT * 4, + ) + +/obj/item/epic_loot/shuttle_battery/Initialize(mapload) + . = ..() + AddComponent(/datum/component/two_handed, require_twohands = TRUE) + +// Industrial fuel conditioner, used to keep most fuel-burning machines within regulations for waste emissions +/obj/item/epic_loot/fuel_conditioner + name = "fuel conditioner" + desc = "A plastic container of fuel conditioner for industrial size plasma generators. \ + Any generator that would need this is either much too large or much too old to be seen around here." + icon_state = "fuel_conditioner" + w_class = WEIGHT_CLASS_NORMAL + drop_sound = 'sound/items/handling/cardboard_box/cardboardbox_drop.ogg' + pickup_sound = 'sound/items/handling/cardboard_box/cardboardbox_pickup.ogg' diff --git a/modular_doppler/epic_loot/code/loot_items/electronics.dm b/modular_doppler/epic_loot/code/loot_items/electronics.dm new file mode 100644 index 0000000000000..5719a1ed842e6 --- /dev/null +++ b/modular_doppler/epic_loot/code/loot_items/electronics.dm @@ -0,0 +1,143 @@ +/datum/export/epic_loot_electronics + cost = PAYCHECK_COMMAND + unit_name = "electronic salvage" + export_types = list( + /obj/item/epic_loot/device_fan, + /obj/item/epic_loot/display_broken, + /obj/item/epic_loot/civilian_circuit, + /obj/item/epic_loot/processor, + /obj/item/epic_loot/disk_drive, + ) + +/datum/export/epic_loot_electronics_super + cost = PAYCHECK_COMMAND * 2 + unit_name = "high value electronic salvage" + export_types = list( + /obj/item/epic_loot/display, + /obj/item/epic_loot/graphics, + /obj/item/epic_loot/military_circuit, + /obj/item/epic_loot/power_supply, + ) + +// Computer fans +/obj/item/epic_loot/device_fan + name = "device fan" + desc = "An electronics cooling fan, used to keep computers and the like at reasonable temperatures while working." + icon_state = "device_fan" + drop_sound = 'sound/items/handling/ammobox_drop.ogg' + pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + custom_materials = list( + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 9, + /datum/material/gold = SMALL_MATERIAL_AMOUNT, + ) + +// A display of some sort, this one probably still works +/obj/item/epic_loot/display + name = "display" + desc = "An electronic display, used in any number of machines to display information to users." + icon_state = "display" + w_class = WEIGHT_CLASS_NORMAL + drop_sound = 'sound/items/handling/ammobox_drop.ogg' + pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + custom_materials = list( + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 5, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 4, + /datum/material/gold = SMALL_MATERIAL_AMOUNT, + ) + +// A display of some sort, this one for sure does not work +/obj/item/epic_loot/display_broken + name = "broken display" + desc = "An electronic display, used in any number of machines to display information to users. This one is broken." + icon_state = "display_broken" + w_class = WEIGHT_CLASS_NORMAL + drop_sound = 'sound/items/handling/ammobox_drop.ogg' + pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + custom_materials = list( + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 5, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 4, + /datum/material/gold = SMALL_MATERIAL_AMOUNT, + ) + +// Martian made very high quality no scam 质量非常高 +/obj/item/epic_loot/graphics + name = "graphics processor" + desc = "A large processor card for the handling of computer generated graphics." + icon_state = "graphics" + w_class = WEIGHT_CLASS_NORMAL + drop_sound = 'sound/items/handling/ammobox_drop.ogg' + pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + custom_materials = list( + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 8, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 2, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 2, + ) + +// A military general-use circuit board +/obj/item/epic_loot/military_circuit + name = "military-grade circuit board" + desc = "A small circuit board commonly seen used by military-grade electronics." + icon_state = "circuit_military" + drop_sound = 'sound/items/handling/component_drop.ogg' + pickup_sound = 'sound/items/handling/component_pickup.ogg' + custom_materials = list( + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 6, + /datum/material/titanium = SMALL_MATERIAL_AMOUNT * 2, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 2, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 2, + ) + +// A civilian general-use circuit board +/obj/item/epic_loot/civilian_circuit + name = "general-purpose circuit board" + desc = "A small circuit board commonly seen used by general-purpose electronics." + icon_state = "civilian_circuit" + drop_sound = 'sound/items/handling/component_drop.ogg' + pickup_sound = 'sound/items/handling/component_pickup.ogg' + custom_materials = list( + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 6, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 2, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 2, + ) + +// A computer processor unit +/obj/item/epic_loot/processor + name = "processor core" + desc = "The processing core of a computer, the small chip responsible for all of the inner workings of most devices." + icon_state = "processor" + inhand_icon_state = "razor" + drop_sound = 'sound/items/handling/component_drop.ogg' + pickup_sound = 'sound/items/handling/component_pickup.ogg' + custom_materials = list( + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/silver = SMALL_MATERIAL_AMOUNT, + /datum/material/gold = SMALL_MATERIAL_AMOUNT, + ) + +// A computer power supply +/obj/item/epic_loot/power_supply + name = "computer power supply" + desc = "A computer power supply, used to provide regulated electric power to other components of a computer." + icon_state = "psu" + w_class = WEIGHT_CLASS_NORMAL + drop_sound = 'sound/items/handling/ammobox_drop.ogg' + pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + custom_materials = list( + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 8, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 2, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 2, + ) + +// A drive for reading data from data disks in computers +/obj/item/epic_loot/disk_drive + name = "hard-disk reader" + desc = "A device for reading and writing data to hard-disks, one of the most common data storage media on the frontier." + icon_state = "disk_drive" + w_class = WEIGHT_CLASS_NORMAL + drop_sound = 'sound/items/handling/ammobox_drop.ogg' + pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + custom_materials = list( + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 8, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 2, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 2, + ) diff --git a/modular_doppler/epic_loot/code/loot_items/medical.dm b/modular_doppler/epic_loot/code/loot_items/medical.dm new file mode 100644 index 0000000000000..d645cc4160f0a --- /dev/null +++ b/modular_doppler/epic_loot/code/loot_items/medical.dm @@ -0,0 +1,46 @@ +/datum/export/epic_loot_super_med_tools + cost = PAYCHECK_COMMAND * 5 + unit_name = "high value medical salvage" + export_types = list( + /obj/item/epic_loot/vein_finder, + /obj/item/epic_loot/eye_scope, + ) + +// Vein finder, uses strong LED lights to reveal veins in someone's body. Perhaps the name "LEDX" rings a bell +/obj/item/epic_loot/vein_finder + name = "medical vein locator" + desc = "A small device with a number of high intensity lights on one side. Used by medical professionals to locate veins in someone's body." + icon_state = "vein_finder" + inhand_icon_state = "headset" + drop_sound = 'sound/items/handling/component_drop.ogg' + pickup_sound = 'sound/items/handling/component_pickup.ogg' + custom_materials = list( + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 8, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 2, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 2, + ) + +/obj/item/epic_loot/vein_finder/afterattack(atom/target, mob/user, proximity_flag) + . = ..() + if(!proximity_flag) + return + if(!ishuman(target)) + return + user.visible_message( + "[user] determines that [target] does, in fact, have veins.", + "You determine that [target] does, in fact, have veins." + ) + new /obj/effect/temp_visual/medical_holosign(get_turf(target), user) + +// Eyescope, a now rare device that was used to check the eyes of patients before the universal health scanner became common +/obj/item/epic_loot/eye_scope + name = "medical eye-scope" + desc = "An outdated device used to examine a patient's eyes. Rare now due to the outbreak of the universal health scanner." + icon_state = "eyescope" + inhand_icon_state = "zippo" + drop_sound = 'sound/items/handling/component_drop.ogg' + pickup_sound = 'sound/items/handling/component_pickup.ogg' + custom_materials = list( + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 8, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2, + ) diff --git a/modular_doppler/epic_loot/code/loot_items/valuables.dm b/modular_doppler/epic_loot/code/loot_items/valuables.dm new file mode 100644 index 0000000000000..fb209e9a6485e --- /dev/null +++ b/modular_doppler/epic_loot/code/loot_items/valuables.dm @@ -0,0 +1,159 @@ +/datum/export/epic_loot_valuables + cost = PAYCHECK_COMMAND * 3 + unit_name = "recovered valuables" + export_types = list( + /obj/item/epic_loot/press_pass, + /obj/item/epic_loot/hdd, + /obj/item/epic_loot/slim_diary, + /obj/item/epic_loot/plasma_explosive, + /obj/item/epic_loot/silver_chainlet, + ) + +/datum/export/epic_loot_valuables_super + cost = PAYCHECK_COMMAND * 4 + unit_name = "recovered high valuables" + export_types = list( + /obj/item/epic_loot/ssd, + /obj/item/epic_loot/military_flash, + /obj/item/epic_loot/diary, + /obj/item/epic_loot/corpo_folder, + /obj/item/epic_loot/intel_folder, + /obj/item/epic_loot/gold_chainlet, + ) + +// An old press pass, perhaps of an unlucky soul who was reporting on the incident that made this place abandoned in the first place +/obj/item/epic_loot/press_pass + name = "expired visitor pass" + desc = "An old lanyard with an expired visitor pass stuck to it. Most of the text has worn off, you can't tell who it was for or who it was issued by." + icon_state = "press_pass" + drop_sound = 'sound/items/handling/disk_drop.ogg' + pickup_sound = 'sound/items/handling/disk_pickup.ogg' + w_class = WEIGHT_CLASS_NORMAL + custom_materials = list( + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 8, + ) + +// A computer SSD +/obj/item/epic_loot/ssd + name = "solid-state drive" + desc = "A solid-state drive for computers, may even contain some still-valuable information on it!" + icon_state = "ssd" + inhand_icon_state = "razor" + drop_sound = 'sound/items/handling/disk_drop.ogg' + pickup_sound = 'sound/items/handling/disk_pickup.ogg' + custom_materials = list( + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 8, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 2, + ) + +// A computer hard drive +/obj/item/epic_loot/hdd + name = "hard drive" + desc = "A hard drive for computers, may even contain some still-valuable information on it!" + icon_state = "hard_disk" + inhand_icon_state = "razor" + drop_sound = 'sound/items/handling/disk_drop.ogg' + pickup_sound = 'sound/items/handling/disk_pickup.ogg' + w_class = WEIGHT_CLASS_NORMAL + custom_materials = list( + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 8, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 2, + ) + +// Military-grade flash drives, made for use specifically with military computers +/obj/item/epic_loot/military_flash + name = "military flash drive" + desc = "A military-grade flash drive for use in matching military-grade computer systems. Might even contain some still-valuable information on it!" + icon_state = "military_flash" + inhand_icon_state = "razor" + drop_sound = 'sound/items/handling/disk_drop.ogg' + pickup_sound = 'sound/items/handling/disk_pickup.ogg' + custom_materials = list( + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 8, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 2, + ) + +// Someone's personal diary, or bootleg captain's log, whatever +/obj/item/epic_loot/diary + name = "sealed diary" + desc = "An old, apparently well-kept diary with unknown information inside. May hold important data on the location it was found in." + icon_state = "diary" + drop_sound = 'sound/items/handling/book_drop.ogg' + pickup_sound = 'sound/items/handling/book_pickup.ogg' + w_class = WEIGHT_CLASS_NORMAL + custom_materials = list( + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 8, + ) + +// A slimmer version of the regular diary +/obj/item/epic_loot/slim_diary + name = "sealed slim diary" + desc = "An old, apparently well-kept diary with unknown information inside. May hold important data on the location it was found in." + icon_state = "slim_diary" + drop_sound = 'sound/items/handling/book_drop.ogg' + pickup_sound = 'sound/items/handling/book_pickup.ogg' + custom_materials = list( + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 8, + ) + +// Straight up, a brick of plasma-cringe explosive, keep away from fire +/obj/item/epic_loot/plasma_explosive + name = "brick of plasma-based explosive" + desc = "A really quite dangerous brick of a plasma-based explosive. Usually, a demolition charge or something of the sort, but, it's still a bomb." + icon_state = "plasma_explosive" + drop_sound = 'sound/items/handling/cardboard_box/cardboardbox_drop.ogg' + pickup_sound = 'sound/items/handling/cardboard_box/cardboardbox_pickup.ogg' + w_class = WEIGHT_CLASS_NORMAL + custom_materials = list( + /datum/material/plasma = SHEET_MATERIAL_AMOUNT * 3, + ) + +/obj/item/epic_loot/plasma_explosive/Initialize(mapload) + . = ..() + AddComponent(/datum/component/explodable, 0, 1, 3, 5, 5) + +// A folder from some corporation with likely valuable data inside +/obj/item/epic_loot/corpo_folder + name = "corporate data folder" + desc = "A blue folder with no label of who it's from. What is labeled, however, is the series of marks of confidential or trade secret information inside." + icon_state = "nt_folders" + drop_sound = 'sound/items/handling/book_drop.ogg' + pickup_sound = 'sound/items/handling/book_pickup.ogg' + w_class = WEIGHT_CLASS_NORMAL + custom_materials = list( + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 8, + ) + +// Brown unlabeled folder of doom, may contain government secrets +/obj/item/epic_loot/intel_folder + name = "intelligence folder" + desc = "A an unmarked, unassuming folder for documents. What is labeled, however, is the series of marks of confidential or trade secret information inside." + icon_state = "documents" + drop_sound = 'sound/items/handling/book_drop.ogg' + pickup_sound = 'sound/items/handling/book_pickup.ogg' + w_class = WEIGHT_CLASS_NORMAL + custom_materials = list( + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 8, + ) + +// A small chainlet made of silver +/obj/item/epic_loot/silver_chainlet + name = "silver chainlet" + desc = "A small chainlet for decorating clothing or other items, made from silver." + icon_state = "silver_chain" + drop_sound = 'sound/items/handling/disk_drop.ogg' + pickup_sound = 'sound/items/handling/disk_pickup.ogg' + custom_materials = list( + /datum/material/silver = SHEET_MATERIAL_AMOUNT, + ) + +// A small chainlet made of gold +/obj/item/epic_loot/gold_chainlet + name = "gold chainlet" + desc = "A small chainlet for decorating clothing or other items, made from gold." + icon_state = "gold_chain" + drop_sound = 'sound/items/handling/disk_drop.ogg' + pickup_sound = 'sound/items/handling/disk_pickup.ogg' + custom_materials = list( + /datum/material/gold = SHEET_MATERIAL_AMOUNT, + ) diff --git a/modular_doppler/epic_loot/code/loot_structures/ammo_box.dm b/modular_doppler/epic_loot/code/loot_structures/ammo_box.dm new file mode 100644 index 0000000000000..d9d5f0f21e060 --- /dev/null +++ b/modular_doppler/epic_loot/code/loot_structures/ammo_box.dm @@ -0,0 +1,34 @@ +/datum/storage/maintenance_loot_structure/ammo_box + max_slots = 6 + max_specific_storage = WEIGHT_CLASS_NORMAL + max_total_storage = WEIGHT_CLASS_NORMAL * 6 + screen_max_columns = 3 + opening_sound = 'modular_doppler/epic_loot/sound/wood_crate_3.mp3' + +/obj/structure/maintenance_loot_structure/ammo_box + name = "small shipping crate" + desc = "A small reinforced box used for shipping small items in." + icon_state = "ammo_box" + storage_datum_to_use = /datum/storage/maintenance_loot_structure/ammo_box + loot_spawn_dice_string = "1d10-4" + loot_weighted_list = list( + /obj/effect/spawner/random/epic_loot/random_engineering = 1, + /obj/effect/spawner/random/epic_loot/random_provisions = 1, + /obj/effect/spawner/random/epic_loot/random_other_military_loot = 1, + ) + +/obj/structure/maintenance_loot_structure/ammo_box/super_evil + icon_state = "cache" + +/obj/structure/maintenance_loot_structure/ammo_box/random + icon_state = "ammo_box_random" + /// The different icon states we can swap to when initializing + var/list/random_icon_states = list( + "ammo_box", + "cache", + ) + +/obj/structure/maintenance_loot_structure/ammo_box/random/Initialize(mapload) + . = ..() + icon_state = pick(random_icon_states) + update_appearance() diff --git a/modular_doppler/epic_loot/code/loot_structures/computer_tower.dm b/modular_doppler/epic_loot/code/loot_structures/computer_tower.dm new file mode 100644 index 0000000000000..b53491ae61b63 --- /dev/null +++ b/modular_doppler/epic_loot/code/loot_structures/computer_tower.dm @@ -0,0 +1,36 @@ +/datum/storage/maintenance_loot_structure/computer + max_slots = 4 + max_specific_storage = WEIGHT_CLASS_NORMAL + max_total_storage = WEIGHT_CLASS_NORMAL * 4 + screen_max_columns = 2 + opening_sound = 'modular_doppler/epic_loot/sound/plastic.mp3' + +/obj/structure/maintenance_loot_structure/computer_tower + name = "computer tower" + desc = "A compact computer unit, missing it's monitor. May still contain valuable components inside." + icon_state = "alienware" + storage_datum_to_use = /datum/storage/maintenance_loot_structure/computer + loot_spawn_dice_string = "1d7-3" + loot_weighted_list = list( + /obj/effect/spawner/random/epic_loot/random_computer_parts = 1, + ) + +/obj/structure/maintenance_loot_structure/computer_tower/white + icon_state = "alienware_honeycrisp" + +/obj/structure/maintenance_loot_structure/computer_tower/eighties + icon_state = "alienware_tan_man" + +/obj/structure/maintenance_loot_structure/computer_tower/random + icon_state = "alienware_random" + /// The different icon states we can swap to when initializing + var/list/random_icon_states = list( + "alienware", + "alienware_honeycrisp", + "alienware_tan_man", + ) + +/obj/structure/maintenance_loot_structure/computer_tower/random/Initialize(mapload) + . = ..() + icon_state = pick(random_icon_states) + update_appearance() diff --git a/modular_doppler/epic_loot/code/loot_structures/files.dm b/modular_doppler/epic_loot/code/loot_structures/files.dm new file mode 100644 index 0000000000000..5a0557ffcdd6f --- /dev/null +++ b/modular_doppler/epic_loot/code/loot_structures/files.dm @@ -0,0 +1,32 @@ +/datum/storage/maintenance_loot_structure/file_cabinet + max_slots = 6 + max_specific_storage = WEIGHT_CLASS_NORMAL + max_total_storage = WEIGHT_CLASS_NORMAL * 6 + screen_max_columns = 2 + opening_sound = 'modular_doppler/epic_loot/sound/cabinet.mp3' + +/obj/structure/maintenance_loot_structure/file_cabinet + name = "filing cabinet" + desc = "A large filing cabinet, it even comes with terrible sounding unlubricated rails!" + icon_state = "files" + storage_datum_to_use = /datum/storage/maintenance_loot_structure/file_cabinet + loot_spawn_dice_string = "1d10-4" + loot_weighted_list = list( + /obj/effect/spawner/random/epic_loot/random_documents = 9, + ) + +/obj/structure/maintenance_loot_structure/file_cabinet/white + icon_state = "files_clean" + +/obj/structure/maintenance_loot_structure/file_cabinet/random + icon_state = "files_random" + /// The different icon states we can swap to when initializing + var/list/random_icon_states = list( + "files", + "files_clean", + ) + +/obj/structure/maintenance_loot_structure/file_cabinet/random/Initialize(mapload) + . = ..() + icon_state = pick(random_icon_states) + update_appearance() diff --git a/modular_doppler/epic_loot/code/loot_structures/grenade_box.dm b/modular_doppler/epic_loot/code/loot_structures/grenade_box.dm new file mode 100644 index 0000000000000..df773672fec76 --- /dev/null +++ b/modular_doppler/epic_loot/code/loot_structures/grenade_box.dm @@ -0,0 +1,34 @@ +/datum/storage/maintenance_loot_structure/grenade_box + max_slots = 4 + max_specific_storage = WEIGHT_CLASS_NORMAL + max_total_storage = WEIGHT_CLASS_NORMAL * 4 + screen_max_columns = 2 + opening_sound = 'modular_doppler/epic_loot/sound/wood_crate_2.mp3' + +/obj/structure/maintenance_loot_structure/grenade_box + name = "small shipping crate" + desc = "A reinforced shipping crate for the transport of small items." + icon_state = "grenade_box" + storage_datum_to_use = /datum/storage/maintenance_loot_structure/grenade_box + loot_spawn_dice_string = "1d6-2" + loot_weighted_list = list( + /obj/effect/spawner/random/epic_loot/random_engineering = 1, + /obj/effect/spawner/random/epic_loot/random_provisions = 1, + /obj/effect/spawner/random/epic_loot/random_other_military_loot = 1, + ) + +/obj/structure/maintenance_loot_structure/grenade_box/evil + icon_state = "grenade_box_evil" + +/obj/structure/maintenance_loot_structure/grenade_box/random + icon_state = "grenade_box_random" + /// The different icon states we can swap to when initializing + var/list/random_icon_states = list( + "grenade_box", + "grenade_box_evil", + ) + +/obj/structure/maintenance_loot_structure/grenade_box/random/Initialize(mapload) + . = ..() + icon_state = pick(random_icon_states) + update_appearance() diff --git a/modular_doppler/epic_loot/code/loot_structures/gun_case.dm b/modular_doppler/epic_loot/code/loot_structures/gun_case.dm new file mode 100644 index 0000000000000..fa7d384e057bd --- /dev/null +++ b/modular_doppler/epic_loot/code/loot_structures/gun_case.dm @@ -0,0 +1,34 @@ +/datum/storage/maintenance_loot_structure/gun_box + max_slots = 4 + max_specific_storage = WEIGHT_CLASS_BULKY + max_total_storage = WEIGHT_CLASS_BULKY * 4 + screen_max_columns = 4 + opening_sound = 'modular_doppler/epic_loot/sound/wood_crate_3.mp3' + +/obj/structure/maintenance_loot_structure/gun_box + name = "shipping crate" + desc = "A reinforced shipping crate foor the transport of larger items." + icon_state = "guncrate" + storage_datum_to_use = /datum/storage/maintenance_loot_structure/gun_box + loot_spawn_dice_string = "1d7-3" + loot_weighted_list = list( + /obj/effect/spawner/random/epic_loot/random_engineering = 1, + /obj/effect/spawner/random/epic_loot/random_provisions = 1, + /obj/effect/spawner/random/epic_loot/random_other_military_loot = 1, + ) + +/obj/structure/maintenance_loot_structure/gun_box/evil + icon_state = "guncrate_dark" + +/obj/structure/maintenance_loot_structure/gun_box/random + icon_state = "guncrate_random" + /// The different icon states we can swap to when initializing + var/list/random_icon_states = list( + "guncrate", + "guncrate_dark", + ) + +/obj/structure/maintenance_loot_structure/gun_box/random/Initialize(mapload) + . = ..() + icon_state = pick(random_icon_states) + update_appearance() diff --git a/modular_doppler/epic_loot/code/loot_structures/large_crate.dm b/modular_doppler/epic_loot/code/loot_structures/large_crate.dm new file mode 100644 index 0000000000000..1164a42b17a7f --- /dev/null +++ b/modular_doppler/epic_loot/code/loot_structures/large_crate.dm @@ -0,0 +1,63 @@ +/datum/storage/maintenance_loot_structure/large_crate + max_slots = 16 + max_specific_storage = WEIGHT_CLASS_BULKY + max_total_storage = WEIGHT_CLASS_BULKY * 16 + screen_max_columns = 4 + opening_sound = 'modular_doppler/epic_loot/sound/wood_crate_3.mp3' + +/obj/structure/maintenance_loot_structure/large_crate + name = "provision transport crate" + desc = "A large crate for transporting equally large amounts of food supplies around." + icon_state = "foodcrate" + storage_datum_to_use = /datum/storage/maintenance_loot_structure/large_crate + loot_spawn_dice_string = "4d5-4" + loot_weighted_list = list( + /obj/effect/spawner/random/epic_loot/random_provisions = 1, + ) + +/obj/structure/maintenance_loot_structure/large_crate/medical + name = "medical transport crate" + desc = "A large crate for transporting equally large amounts of medical supplies around." + icon_state = "medcrate" + loot_weighted_list = list( + /obj/effect/spawner/random/epic_loot/medical_everything = 1, + ) + +/obj/structure/maintenance_loot_structure/large_crate/medical/airdrop + icon_state = "supplydrop" + +/obj/structure/maintenance_loot_structure/large_crate/engineering + name = "engineering transport crate" + desc = "A large crate for transporting equally large amounts of tools and components around." + icon_state = "toolcrate" + loot_weighted_list = list( + /obj/effect/spawner/random/epic_loot/random_engineering = 1, + ) + +/obj/structure/maintenance_loot_structure/large_crate/engineering/airdrop + icon_state = "supplydrop_yellow" + +/obj/structure/maintenance_loot_structure/large_crate/military + name = "reinforced transport crate" + desc = "A large crate for transporting equally large amounts of militar." + icon_state = "supplydrop_green" + loot_weighted_list = list( + /obj/effect/spawner/random/epic_loot/random_engineering = 1, + /obj/effect/spawner/random/epic_loot/random_provisions = 1, + /obj/effect/spawner/random/epic_loot/random_other_military_loot = 1, + /obj/effect/spawner/random/epic_loot/medical_everything = 1, + ) + +/obj/effect/spawner/random/epic_loot/random_supply_crate + name = "random supply crate spawner" + desc = "Automagically transforms into a random supply crate, hopefully filled with goodies." + icon = 'modular_doppler/epic_loot/icons/loot_structures.dmi' + icon_state = "crate_random" + loot = list( + /obj/structure/maintenance_loot_structure/large_crate, + /obj/structure/maintenance_loot_structure/large_crate/medical, + /obj/structure/maintenance_loot_structure/large_crate/medical/airdrop, + /obj/structure/maintenance_loot_structure/large_crate/engineering, + /obj/structure/maintenance_loot_structure/large_crate/engineering/airdrop, + /obj/structure/maintenance_loot_structure/large_crate/military, + ) diff --git a/modular_doppler/epic_loot/code/loot_structures/medbox.dm b/modular_doppler/epic_loot/code/loot_structures/medbox.dm new file mode 100644 index 0000000000000..40ffab841a33d --- /dev/null +++ b/modular_doppler/epic_loot/code/loot_structures/medbox.dm @@ -0,0 +1,36 @@ +/datum/storage/maintenance_loot_structure/medical_box + max_slots = 6 + max_specific_storage = WEIGHT_CLASS_BULKY + max_total_storage = WEIGHT_CLASS_BULKY * 6 + screen_max_columns = 3 + opening_sound = 'modular_doppler/epic_loot/sound/plastic.mp3' + +/obj/structure/maintenance_loot_structure/medbox + name = "emergency medical box" + desc = "A large, atmos-sealed plastic container for holding emergency medical supplies." + icon_state = "medbox" + storage_datum_to_use = /datum/storage/maintenance_loot_structure/medical_box + loot_spawn_dice_string = "1d8-2" + loot_weighted_list = list( + /obj/effect/spawner/random/epic_loot/medical_everything = 1, + ) + +/obj/structure/maintenance_loot_structure/medbox/bleu + icon_state = "medbox_blue" + +/obj/structure/maintenance_loot_structure/medbox/red + icon_state = "medbox_red" + +/obj/structure/maintenance_loot_structure/medbox/random + icon_state = "medbox_random" + /// The different icon states we can swap to when initializing + var/list/random_icon_states = list( + "medbox", + "medbox_blue", + "medbox_red", + ) + +/obj/structure/maintenance_loot_structure/medbox/random/Initialize(mapload) + . = ..() + icon_state = pick(random_icon_states) + update_appearance() diff --git a/modular_doppler/epic_loot/code/loot_structures/military_case.dm b/modular_doppler/epic_loot/code/loot_structures/military_case.dm new file mode 100644 index 0000000000000..0b26b90cf3e74 --- /dev/null +++ b/modular_doppler/epic_loot/code/loot_structures/military_case.dm @@ -0,0 +1,38 @@ +/datum/storage/maintenance_loot_structure/military_case + max_slots = 8 + max_specific_storage = WEIGHT_CLASS_BULKY + max_total_storage = WEIGHT_CLASS_BULKY * 8 + screen_max_columns = 4 + opening_sound = 'modular_doppler/epic_loot/sound/wood_crate_3.mp3' + +/obj/structure/maintenance_loot_structure/military_case + name = "large shipping crate" + desc = "A reinforced shipping crate for the transport of larger items." + icon_state = "military_crate" + storage_datum_to_use = /datum/storage/maintenance_loot_structure/military_case + loot_spawn_dice_string = "1d10-2" + loot_weighted_list = list( + /obj/effect/spawner/random/epic_loot/random_engineering = 1, + /obj/effect/spawner/random/epic_loot/random_provisions = 1, + /obj/effect/spawner/random/epic_loot/random_other_military_loot = 1, + ) + +/obj/structure/maintenance_loot_structure/military_case/evil + icon_state = "guncrate_dark" + +/obj/structure/maintenance_loot_structure/military_case/super_evil + icon_state = "larpbox" + +/obj/structure/maintenance_loot_structure/military_case/random + icon_state = "military_crate_random" + /// The different icon states we can swap to when initializing + var/list/random_icon_states = list( + "military_crate", + "military_crate_dark", + "larpbox", + ) + +/obj/structure/maintenance_loot_structure/military_case/random/Initialize(mapload) + . = ..() + icon_state = pick(random_icon_states) + update_appearance() diff --git a/modular_doppler/epic_loot/code/loot_structures/register.dm b/modular_doppler/epic_loot/code/loot_structures/register.dm new file mode 100644 index 0000000000000..0013d6d7761a3 --- /dev/null +++ b/modular_doppler/epic_loot/code/loot_structures/register.dm @@ -0,0 +1,42 @@ +/datum/storage/maintenance_loot_structure/register + max_slots = 2 + max_specific_storage = WEIGHT_CLASS_NORMAL + max_total_storage = WEIGHT_CLASS_NORMAL * 2 + screen_max_columns = 2 + opening_sound = 'modular_doppler/epic_loot/sound/wood_crate_2.mp3' + +/obj/structure/maintenance_loot_structure/register + name = "credits register" + desc = "A compact computing unit to handle transfers of credits between accounts. May still contain currency left behind!" + icon_state = "register_small" + storage_datum_to_use = /datum/storage/maintenance_loot_structure/register + loot_spawn_dice_string = "1d3-1" + loot_weighted_list = list( + /obj/effect/spawner/random/entertainment/coin = 1, + /obj/effect/spawner/random/entertainment/money_small = 2, + /obj/effect/spawner/random/entertainment/money = 1, + ) + +/obj/structure/maintenance_loot_structure/register/white + icon_state = "register_small_clean" + +/obj/structure/maintenance_loot_structure/register/big + icon_state = "register_big" + +/obj/structure/maintenance_loot_structure/register/big_white + icon_state = "register_big_clean" + +/obj/structure/maintenance_loot_structure/register/random + icon_state = "register_random" + /// The different icon states we can swap to when initializing + var/list/random_icon_states = list( + "register_small", + "register_small_clean", + "register_big", + "register_big_clean", + ) + +/obj/structure/maintenance_loot_structure/register/random/Initialize(mapload) + . = ..() + icon_state = pick(random_icon_states) + update_appearance() diff --git a/modular_doppler/epic_loot/code/loot_structures/safe.dm b/modular_doppler/epic_loot/code/loot_structures/safe.dm new file mode 100644 index 0000000000000..2b5342e028805 --- /dev/null +++ b/modular_doppler/epic_loot/code/loot_structures/safe.dm @@ -0,0 +1,32 @@ +/datum/storage/maintenance_loot_structure/desk_safe + max_slots = 2 + max_specific_storage = WEIGHT_CLASS_NORMAL + max_total_storage = WEIGHT_CLASS_NORMAL * 2 + screen_max_columns = 1 + opening_sound = 'modular_doppler/epic_loot/sound/wood_crate_3.mp3' + +/obj/structure/maintenance_loot_structure/desk_safe + name = "compact safe" + desc = "A not-so-secure safe meant to fit around or under desks." + icon_state = "safe" + storage_datum_to_use = /datum/storage/maintenance_loot_structure/desk_safe + loot_spawn_dice_string = "1d3-1" + loot_weighted_list = list( + /obj/effect/spawner/random/epic_loot/random_strongbox_loot = 1, + ) + +/obj/structure/maintenance_loot_structure/desk_safe/bleu + icon_state = "safe_blue" + +/obj/structure/maintenance_loot_structure/desk_safe/random + icon_state = "safe_random" + /// The different icon states we can swap to when initializing + var/list/random_icon_states = list( + "safe", + "safe_blue", + ) + +/obj/structure/maintenance_loot_structure/desk_safe/random/Initialize(mapload) + . = ..() + icon_state = pick(random_icon_states) + update_appearance() diff --git a/modular_doppler/epic_loot/code/loot_structures/toolbox.dm b/modular_doppler/epic_loot/code/loot_structures/toolbox.dm new file mode 100644 index 0000000000000..43e2babff2852 --- /dev/null +++ b/modular_doppler/epic_loot/code/loot_structures/toolbox.dm @@ -0,0 +1,38 @@ +/datum/storage/maintenance_loot_structure/toolbox + max_slots = 6 + max_specific_storage = WEIGHT_CLASS_BULKY + max_total_storage = WEIGHT_CLASS_BULKY * 6 + screen_max_columns = 3 + opening_sound = 'modular_doppler/epic_loot/sound/wood_crate_1.mp3' + +/obj/structure/maintenance_loot_structure/toolbox + name = "heavy toolbox" + desc = "An industrial grade toolbox, for when you need to carry a LOT of things to a job. \ + It's previous owner has smartly attached this one pretty firmly to whatever surface it's on, \ + to prevent theft." + icon_state = "toolbox" + storage_datum_to_use = /datum/storage/maintenance_loot_structure/toolbox + loot_spawn_dice_string = "1d8-2" + loot_weighted_list = list( + /obj/effect/spawner/random/epic_loot/random_engineering = 1, + ) + +/obj/structure/maintenance_loot_structure/toolbox/yellow + icon_state = "toolbox_yellow" + +/obj/structure/maintenance_loot_structure/toolbox/red + icon_state = "toolbox_red" + +/obj/structure/maintenance_loot_structure/toolbox/random + icon_state = "toolbox_random" + /// The different icon states we can swap to when initializing + var/list/random_icon_states = list( + "toolbox", + "toolbox_yellow", + "toolbox_red", + ) + +/obj/structure/maintenance_loot_structure/toolbox/random/Initialize(mapload) + . = ..() + icon_state = pick(random_icon_states) + update_appearance() diff --git a/modular_doppler/epic_loot/code/loot_structures/wall_jackets.dm b/modular_doppler/epic_loot/code/loot_structures/wall_jackets.dm new file mode 100644 index 0000000000000..3b3bfd24b0802 --- /dev/null +++ b/modular_doppler/epic_loot/code/loot_structures/wall_jackets.dm @@ -0,0 +1,67 @@ +/datum/storage/maintenance_loot_structure/jacket + max_slots = 2 + max_specific_storage = WEIGHT_CLASS_NORMAL + max_total_storage = WEIGHT_CLASS_NORMAL * 4 + screen_max_columns = 2 + opening_sound = 'sound/items/handling/cloth_pickup.ogg' + +/obj/structure/maintenance_loot_structure/wall_jacket + name = "hanging jacket" + desc = "Someone's old, now abandoned jacket. Maybe there's still stuff in the pockets?" + icon_state = "jacket_green" + density = FALSE + storage_datum_to_use = /datum/storage/maintenance_loot_structure/jacket + loot_spawn_dice_string = "1d3-1" + loot_weighted_list = list( + /obj/effect/spawner/random/epic_loot/pocket_sized_items = 1, + ) + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/maintenance_loot_structure/wall_jacket, 28) + +/obj/structure/maintenance_loot_structure/wall_jacket/Initialize(mapload) + . = ..() + find_and_hang_on_wall() + +/obj/structure/maintenance_loot_structure/wall_jacket/yellow + icon_state = "jacket_yellow" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/maintenance_loot_structure/wall_jacket/yellow, 28) + +/obj/structure/maintenance_loot_structure/wall_jacket/blue + icon_state = "jacket_blue" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/maintenance_loot_structure/wall_jacket/blue, 28) + +/obj/structure/maintenance_loot_structure/wall_jacket/police + icon_state = "jacket_police" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/maintenance_loot_structure/wall_jacket/police, 28) + +/obj/structure/maintenance_loot_structure/wall_jacket/black + icon_state = "jacket_black" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/maintenance_loot_structure/wall_jacket/black, 28) + +/obj/structure/maintenance_loot_structure/wall_jacket/military + icon_state = "jacket_military" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/maintenance_loot_structure/wall_jacket/military, 28) + +/obj/structure/maintenance_loot_structure/wall_jacket/random + icon_state = "jacket_random" + /// The different icon states we can swap to when initializing + var/list/random_icon_states = list( + "jacket_green", + "jacket_yellow", + "jacket_blue", + "jacket_police", + "jacket_black", + "jacket_military", + ) + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/maintenance_loot_structure/wall_jacket/random, 28) + +/obj/structure/maintenance_loot_structure/wall_jacket/random/Initialize(mapload) + . = ..() + icon_state = pick(random_icon_states) + update_appearance() diff --git a/modular_doppler/epic_loot/code/random_spawners_real.dm b/modular_doppler/epic_loot/code/random_spawners_real.dm new file mode 100644 index 0000000000000..eab701f4a1391 --- /dev/null +++ b/modular_doppler/epic_loot/code/random_spawners_real.dm @@ -0,0 +1,690 @@ +/obj/effect/spawner/random/epic_loot + name = "extraction loot spawner" + desc = "Gods please let there be nobody extract camping." + icon = 'modular_doppler/epic_loot/icons/epic_loot.dmi' + icon_state = null + +// Jacket pocket contents + +// Actual pocket items spawner + +/obj/effect/spawner/random/epic_loot/pocket_sized_items + name = "random pocket sized items" + icon_state = "random_pocket_valuable" + loot = list( + /obj/effect/spawner/random/epic_loot/pocket_valuable = 1, + /obj/effect/spawner/random/epic_loot/pocket_medical = 1, + /obj/effect/spawner/random/epic_loot/pocket_da_money = 1, + ) + +// Chainlet, good or not good, call it + +/obj/effect/spawner/random/epic_loot/pocket_valuable + name = "random pocket valuable" + icon_state = "random_chain" + loot = list( + /obj/item/epic_loot/silver_chainlet = 3, + /obj/item/epic_loot/press_pass = 2, + /obj/item/epic_loot/military_flash = 2, + /obj/item/epic_loot/slim_diary = 2, + /obj/item/epic_loot/gold_chainlet = 1, + ) + +// Pocket meds + +/obj/effect/spawner/random/epic_loot/pocket_medical + name = "random pocket medical item" + icon_state = "random_med_stack" + loot = list( + /obj/item/storage/pill_bottle/iron = 2, + /obj/item/storage/pill_bottle/painkiller = 2, + /obj/item/storage/pill_bottle/ondansetron = 1, + /obj/item/stack/medical/bandage = 2, + /obj/item/stack/medical/bandage/makeshift = 2, + /obj/item/stack/medical/aloe = 2, + /obj/item/stack/medical/ointment/red_sun = 1, + /obj/item/stack/medical/bruise_pack = 1, + /obj/item/stack/medical/gauze/sterilized = 1, + ) + +// Pocket da money + +/obj/effect/spawner/random/epic_loot/pocket_da_money + name = "random pocket money" + icon_state = "random_pocket_valuable" + loot = list( + /obj/effect/spawner/random/entertainment/money_small = 2, + /obj/effect/spawner/random/entertainment/money = 1, + /obj/effect/spawner/random/entertainment/cigarette_pack = 1, + /obj/effect/spawner/random/entertainment/cigarette = 2, + /obj/effect/spawner/random/entertainment/wallet_lighter = 2, + ) + +// Medical related spawners + +// The medical everything spawner + +/obj/effect/spawner/random/epic_loot/medical_everything + name = "random medical anything" + icon_state = "random_med_stack" + loot = list( + /obj/effect/spawner/random/epic_loot/medical_stack_item = 2, + /obj/effect/spawner/random/epic_loot/medical_stack_item_advanced = 1, + /obj/effect/spawner/random/epic_loot/chemical = 1, + /obj/effect/spawner/random/epic_loot/medical_tools = 2, + /obj/effect/spawner/random/epic_loot/medkit = 1, + /obj/effect/spawner/random/epic_loot/medpens = 2, + /obj/effect/spawner/random/epic_loot/medpens_combat_based_redpilled = 1, + ) + +// Basic healing items + +/obj/effect/spawner/random/epic_loot/medical_stack_item + name = "random medical item" + icon_state = "random_med_stack" + loot = list( + /obj/item/stack/medical/bruise_pack = 3, + /obj/item/stack/medical/gauze = 3, + /obj/item/stack/medical/gauze/sterilized = 2, + /obj/item/stack/medical/suture/emergency = 3, + /obj/item/stack/medical/suture/coagulant = 2, + /obj/item/stack/medical/suture/bloody = 1, + /obj/item/stack/medical/ointment = 3, + /obj/item/stack/medical/ointment/red_sun = 2, + /obj/item/stack/medical/mesh = 2, + /obj/item/stack/medical/aloe = 2, + /obj/item/stack/medical/bone_gel/one = 2, + /obj/item/stack/medical/bone_gel = 1, + /obj/item/stack/medical/bandage/makeshift = 3, + /obj/item/stack/medical/bandage = 2, + /obj/item/stack/sticky_tape/surgical = 2, + /obj/item/reagent_containers/blood/random = 1, + /obj/item/stack/medical/wound_recovery/robofoam = 2, + // Pill bottles + /obj/item/storage/pill_bottle/iron = 2, + /obj/item/storage/pill_bottle/potassiodide = 2, + /obj/item/storage/pill_bottle/painkiller = 2, + /obj/item/storage/pill_bottle/probital = 2, + /obj/item/storage/pill_bottle/happinesspsych = 1, + /obj/item/storage/pill_bottle/lsdpsych = 1, + /obj/item/storage/pill_bottle/mannitol = 2, + /obj/item/storage/pill_bottle/multiver = 2, + /obj/item/storage/pill_bottle/mutadone = 1, + /obj/item/storage/pill_bottle/neurine = 1, + /obj/item/storage/pill_bottle/ondansetron = 1, + /obj/item/storage/pill_bottle/psicodine = 1, + /obj/item/storage/pill_bottle/sansufentanyl = 1, + ) + +// More advanced healing items + +/obj/effect/spawner/random/epic_loot/medical_stack_item_advanced + name = "random advanced medical item" + icon_state = "random_med_stack_adv" + loot = list( + /obj/item/stack/medical/gauze/sterilized = 2, + /obj/item/stack/medical/suture = 3, + /obj/item/stack/medical/suture/coagulant = 3, + /obj/item/stack/medical/suture/bloody = 2, + /obj/item/stack/medical/suture/medicated = 1, + /obj/item/stack/medical/ointment/red_sun = 3, + /obj/item/stack/medical/mesh = 3, + /obj/item/stack/medical/mesh/bloody = 2, + /obj/item/stack/medical/mesh/advanced = 1, + /obj/item/stack/medical/aloe = 2, + /obj/item/stack/medical/bone_gel = 2, + /obj/item/stack/medical/bandage = 2, + /obj/item/stack/sticky_tape/surgical = 2, + /obj/item/stack/medical/poultice = 1, + /obj/item/stack/medical/wound_recovery = 1, + /obj/item/stack/medical/wound_recovery/rapid_coagulant = 1, + /obj/item/reagent_containers/blood/random = 2, + /obj/item/stack/medical/wound_recovery/robofoam = 3, + /obj/item/stack/medical/wound_recovery/robofoam_super = 2, + // Medigels + /obj/item/reagent_containers/medigel/libital = 2, + /obj/item/reagent_containers/medigel/aiuri = 2, + /obj/item/reagent_containers/medigel/sterilizine = 2, + /obj/item/reagent_containers/medigel/synthflesh = 1, + // Pill bottles + /obj/item/storage/pill_bottle/iron = 2, + /obj/item/storage/pill_bottle/potassiodide = 2, + /obj/item/storage/pill_bottle/painkiller = 2, + /obj/item/storage/pill_bottle/probital = 2, + /obj/item/storage/pill_bottle/happinesspsych = 1, + /obj/item/storage/pill_bottle/lsdpsych = 1, + /obj/item/storage/pill_bottle/mannitol = 2, + /obj/item/storage/pill_bottle/multiver = 2, + /obj/item/storage/pill_bottle/mutadone = 1, + /obj/item/storage/pill_bottle/neurine = 1, + /obj/item/storage/pill_bottle/ondansetron = 1, + /obj/item/storage/pill_bottle/psicodine = 1, + /obj/item/storage/pill_bottle/sansufentanyl = 1, + ) + +// Chems and whatnot + +/obj/effect/spawner/random/epic_loot/chemical + name = "random chemical" + icon_state = "random_med_stack_adv" + loot = list( + // Chemjaks + /obj/item/reagent_containers/cup/bottle/epinephrine = 1, + /obj/item/reagent_containers/cup/bottle/morphine = 2, + /obj/item/reagent_containers/cup/bottle/mannitol = 1, + /obj/item/reagent_containers/cup/bottle/multiver = 2, + /obj/item/reagent_containers/cup/bottle/ammoniated_mercury = 2, + /obj/item/reagent_containers/cup/bottle/syriniver = 2, + /obj/item/reagent_containers/cup/bottle/synaptizine = 2, + /obj/item/reagent_containers/cup/bottle/fentanyl = 2, + /obj/item/reagent_containers/cup/bottle/formaldehyde = 1, + /obj/item/reagent_containers/cup/bottle/diphenhydramine = 1, + /obj/item/reagent_containers/cup/bottle/potass_iodide = 2, + /obj/item/reagent_containers/cup/bottle/salglu_solution = 3, + /obj/item/reagent_containers/cup/bottle/atropine = 2, + /obj/item/reagent_containers/cup/bottle/capsaicin = 2, + /obj/item/reagent_containers/cup/bottle/fentanyl = 1, + /obj/item/reagent_containers/cup/bottle/leadacetate = 1, + /obj/item/reagent_containers/cup/bottle/thermite = 1, + /obj/item/reagent_containers/cup/bottle/ethanol = 2, + /obj/item/reagent_containers/syringe = 2, + // Medigels + /obj/item/reagent_containers/medigel/libital = 2, + /obj/item/reagent_containers/medigel/aiuri = 2, + /obj/item/reagent_containers/medigel/sterilizine = 2, + /obj/item/reagent_containers/medigel/synthflesh = 1, + ) + +// Medical tools spawner + +/obj/effect/spawner/random/epic_loot/medical_tools + name = "random medical tools" + icon_state = "random_med_tools" + loot = list( + /obj/item/bonesetter = 2, + /obj/item/cautery = 2, + /obj/item/cautery/cruel = 1, + /obj/item/clothing/neck/stethoscope = 2, + /obj/item/flashlight/pen = 2, + /obj/item/flashlight/pen/paramedic = 2, + /obj/item/healthanalyzer = 1, + /obj/item/healthanalyzer/simple = 2, + /obj/item/healthanalyzer/simple/disease = 2, + /obj/item/hemostat = 2, + /obj/item/storage/box/bandages = 1, + /obj/item/bodybag = 2, + /obj/item/blood_filter = 2, + /obj/item/circular_saw = 2, + /obj/item/clothing/gloves/latex/nitrile = 2, + /obj/item/clothing/mask/surgical = 2, + /obj/item/retractor = 2, + /obj/item/scalpel = 2, + /obj/item/shears = 1, + /obj/item/surgical_drapes = 2, + /obj/item/surgicaldrill = 2, + /obj/item/epic_loot/vein_finder = 1, + /obj/item/epic_loot/eye_scope = 1, + /obj/item/reagent_containers/dropper = 2, + /obj/item/reagent_containers/cup/beaker = 2, + /obj/item/reagent_containers/cup/beaker/large = 1, + /obj/item/reagent_containers/cup/bottle = 2, + /obj/item/reagent_containers/cup/tube = 2, + /obj/item/reagent_containers/syringe = 2, + /obj/item/defibrillator = 1, + /obj/item/defibrillator/loaded = 1, + /obj/item/emergency_bed = 2, + /obj/item/storage/epic_loot_medical_case = 1, + ) + +// Random medkits + +/obj/effect/spawner/random/epic_loot/medkit + name = "random medkit" + icon_state = "random_medkit" + loot = list( + /obj/item/storage/medkit/civil_defense/stocked = 2, + /obj/item/storage/medkit/civil_defense/comfort/stocked = 2, + /obj/item/storage/medkit/frontier/stocked = 2, + /obj/item/storage/medkit/combat_surgeon/stocked = 2, + /obj/item/storage/medkit/robotic_repair/stocked = 2, + /obj/item/storage/medkit/robotic_repair/preemo/stocked = 1, + /obj/item/storage/backpack/duffelbag/deforest_medkit/stocked = 1, + /obj/item/storage/backpack/duffelbag/deforest_surgical/stocked = 1, + /obj/item/storage/epic_loot_medpen_case = 2, + ) + +// Random medpens for healing yourself + +/obj/effect/spawner/random/epic_loot/medpens + name = "random autoinjectors" + icon_state = "random_medpen_spawner" + loot = list( + /obj/item/reagent_containers/hypospray/medipen/deforest/occuisate = 2, + /obj/item/reagent_containers/hypospray/medipen/deforest/adrenaline = 2, + /obj/item/reagent_containers/hypospray/medipen/deforest/morpital = 3, + /obj/item/reagent_containers/hypospray/medipen/deforest/lipital = 3, + /obj/item/reagent_containers/hypospray/medipen/deforest/meridine = 3, + /obj/item/reagent_containers/hypospray/medipen/deforest/synephrine = 2, + /obj/item/reagent_containers/hypospray/medipen/deforest/calopine = 3, + /obj/item/reagent_containers/hypospray/medipen/deforest/coagulants = 2, + /obj/item/reagent_containers/hypospray/medipen/deforest/krotozine = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/lepoturi = 2, + /obj/item/reagent_containers/hypospray/medipen/deforest/psifinil = 2, + /obj/item/reagent_containers/hypospray/medipen/deforest/halobinin = 2, + ) + +// Random medpens for fighting other people + +/obj/effect/spawner/random/epic_loot/medpens_combat_based_redpilled + name = "random combat autoinjectors" + icon_state = "random_medpen_advanced" + loot = list( + /obj/item/reagent_containers/hypospray/medipen/deforest/adrenaline = 3, + /obj/item/reagent_containers/hypospray/medipen/deforest/morpital = 2, + /obj/item/reagent_containers/hypospray/medipen/deforest/lipital = 2, + /obj/item/reagent_containers/hypospray/medipen/deforest/synephrine = 3, + /obj/item/reagent_containers/hypospray/medipen/deforest/calopine = 2, + /obj/item/reagent_containers/hypospray/medipen/deforest/coagulants = 2, + /obj/item/reagent_containers/hypospray/medipen/deforest/krotozine = 3, + /obj/item/reagent_containers/hypospray/medipen/deforest/lepoturi = 2, + /obj/item/reagent_containers/hypospray/medipen/deforest/twitch = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/demoneye = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/aranepaine = 2, + /obj/item/reagent_containers/hypospray/medipen/deforest/pentibinin = 2, + /obj/item/reagent_containers/hypospray/medipen/deforest/synalvipitol = 2, + ) + +// Tool and supply spawners + +/obj/effect/spawner/random/epic_loot/random_engineering + name = "random engineering thing" + icon_state = "random_component" + loot = list( + /obj/effect/spawner/random/epic_loot/random_components = 1, + /obj/effect/spawner/random/epic_loot/random_computer_parts = 1, + /obj/effect/spawner/random/epic_loot/random_tools = 1, + /obj/effect/spawner/random/epic_loot/random_construction = 1, + ) + +// Sellable components + +/obj/effect/spawner/random/epic_loot/random_components + name = "random components" + icon_state = "random_component" + loot = list( + /obj/item/epic_loot/water_filter = 2, + /obj/item/epic_loot/thermometer = 2, + /obj/item/epic_loot/nail_box = 2, + /obj/item/epic_loot/cold_weld = 2, + /obj/item/epic_loot/electric_motor = 1, + /obj/item/epic_loot/current_converter = 1, + /obj/item/epic_loot/signal_amp = 1, + /obj/item/epic_loot/thermal_camera = 1, + /obj/item/epic_loot/shuttle_gyro = 1, + /obj/item/epic_loot/phased_array = 1, + /obj/item/epic_loot/shuttle_battery = 1, + /obj/item/epic_loot/fuel_conditioner = 2, + /obj/item/epic_loot/display = 1, + /obj/item/epic_loot/display_broken = 2, + /obj/item/epic_loot/civilian_circuit = 2, + ) + +// Random computer parts + +/obj/effect/spawner/random/epic_loot/random_computer_parts + name = "random computer parts" + icon_state = "random_electronic_part" + loot = list( + /obj/item/epic_loot/signal_amp = 2, + /obj/item/epic_loot/device_fan = 2, + /obj/item/epic_loot/graphics = 1, + /obj/item/epic_loot/military_circuit = 1, + /obj/item/epic_loot/civilian_circuit = 2, + /obj/item/epic_loot/processor = 2, + /obj/item/epic_loot/power_supply = 2, + /obj/item/epic_loot/disk_drive = 2, + /obj/item/epic_loot/ssd = 1, + /obj/item/epic_loot/hdd = 1, + /obj/item/epic_loot/military_flash = 1, + ) + +// Random tools + +/obj/effect/spawner/random/epic_loot/random_tools + name = "random tools and supplies" + icon_state = "random_tool" + loot = list( + // Wrench + /obj/item/wrench = 3, + /obj/item/wrench/bolter = 2, + /obj/item/wrench/caravan = 1, + /obj/item/wrench/combat = 1, + // Screwdriver + /obj/item/screwdriver = 3, + /obj/item/screwdriver/omni_drill = 2, + /obj/item/screwdriver/caravan = 1, + // Crowbar + /obj/item/crowbar = 3, + /obj/item/crowbar/large/doorforcer = 2, + /obj/item/crowbar/red/caravan = 1, + /obj/item/fireaxe/metal_h2_axe = 1, + // Wirecutters + /obj/item/wirecutters = 3, + /obj/item/wirecutters/caravan = 1, + // Welder + /obj/item/weldingtool = 3, + /obj/item/weldingtool/largetank = 3, + /obj/item/weldingtool/arc_welder = 2, + /obj/item/weldingtool/experimental = 1, + // Multitool + /obj/item/multitool = 2, + /obj/item/multitool/ai_detect = 1, + // Rapid whatever tools + /obj/item/pipe_dispenser = 1, + /obj/item/construction/rcd = 1, + /obj/item/construction/rtd = 1, + // Misc tools and related items + /obj/item/stack/cable_coil = 3, + /obj/item/flashlight = 2, + /obj/item/flashlight/flare = 3, + /obj/item/grenade/chem_grenade/metalfoam = 2, + /obj/item/geiger_counter = 2, + /obj/item/analyzer = 2, + // Various methods of insulation + /obj/item/clothing/gloves/color/yellow = 2, + /obj/item/clothing/gloves/chief_engineer = 1, + /obj/item/clothing/gloves/atmos = 1, + // Misc utility clothing + /obj/item/clothing/gloves/tinkerer = 1, + /obj/item/clothing/head/utility/welding = 2, + /obj/item/clothing/head/utility/hardhat/welding = 1, + /obj/item/clothing/glasses/meson = 3, + /obj/item/clothing/glasses/meson/engine = 2, + /obj/item/storage/belt/utility = 2, + /obj/item/clothing/shoes/magboots = 2, + // Tapes + /obj/item/stack/sticky_tape = 2, + /obj/item/stack/sticky_tape/super = 1, + // Cells + /obj/item/stock_parts/power_store/cell/upgraded = 1, + /obj/item/stock_parts/power_store/cell/crap = 2, + /obj/item/stock_parts/power_store/battery/upgraded = 1, + /obj/item/stock_parts/power_store/battery/crap = 2, + // Masks + /obj/item/clothing/mask/gas = 3, + /obj/item/clothing/mask/gas/welding = 2, + /obj/item/clothing/mask/gas/atmos/frontier_colonist = 2, + // Air tanks + /obj/item/tank/internals/nitrogen/belt = 1, + /obj/item/tank/internals/emergency_oxygen/engi = 2, + /obj/item/tank/internals/emergency_oxygen/double = 1, + // stuff + /obj/item/storage/epic_loot_cooler = 1, + /obj/item/storage/epic_loot_money_case = 1, + // Robofoam is a tool, right? + /obj/item/stack/medical/wound_recovery/robofoam = 2, + /obj/item/stack/medical/wound_recovery/robofoam_super = 1, + ) + +// Random construction stuff + +/obj/effect/spawner/random/epic_loot/random_construction + name = "random constructions" + icon_state = "random_tool" + loot = list( + // Sheets + /obj/item/stack/sheet/iron/twenty = 2, + /obj/item/stack/sheet/iron/ten = 3, + /obj/item/stack/sheet/glass/fifty = 1, + /obj/item/stack/sheet/plastic/five = 3, + /obj/item/stack/sheet/plastic_wall_panel/ten = 2, + /obj/item/stack/rods/twentyfive = 2, + /obj/item/stack/sheet/tinumium/three = 2, + /obj/item/stack/sheet/mineral/silver = 2, + /obj/item/stack/sheet/mineral/gold = 2, + /obj/item/stack/sheet/mineral/plasma/five = 2, + // Flatpack machines + /obj/item/flatpacked_machine = 1, + /obj/item/flatpacked_machine/airlock_kit = 2, + /obj/item/flatpacked_machine/airlock_kit_manual = 2, + /obj/item/flatpacked_machine/arc_furnace = 1, + /obj/item/flatpacked_machine/co2_cracker = 2, + /obj/item/flatpacked_machine/frontier_griddle = 1, + /obj/item/flatpacked_machine/frontier_range = 1, + /obj/item/flatpacked_machine/fuel_generator = 1, + /obj/item/flatpacked_machine/gps_beacon = 2, + /obj/item/flatpacked_machine/hydro_synth = 1, + /obj/item/flatpacked_machine/large_station_battery = 1, + /obj/item/flatpacked_machine/macrowave = 1, + /obj/item/flatpacked_machine/ore_silo = 1, + /obj/item/flatpacked_machine/ore_thumper = 1, + /obj/item/flatpacked_machine/organics_printer = 2, + /obj/item/flatpacked_machine/organics_ration_printer = 2, + /obj/item/flatpacked_machine/recycler = 2, + /obj/item/flatpacked_machine/rtg = 2, + /obj/item/flatpacked_machine/shutter_kit = 1, + /obj/item/flatpacked_machine/solar = 2, + /obj/item/flatpacked_machine/solar_tracker = 1, + /obj/item/flatpacked_machine/station_battery = 1, + /obj/item/flatpacked_machine/stirling_generator = 1, + /obj/item/flatpacked_machine/sustenance_machine = 2, + /obj/item/flatpacked_machine/thermomachine = 1, + /obj/item/flatpacked_machine/water_synth = 2, + /obj/item/flatpacked_machine/wind_turbine = 2, + /obj/item/folded_navigation_gigabeacon = 1, + /obj/item/wallframe/cell_charger_multi = 2, + /obj/item/wallframe/frontier_medstation = 1, + /obj/item/wallframe/wall_heater = 2, + /obj/item/wallframe/digital_clock = 1, + // Other things + /obj/item/door_seal = 2, + ) + +// Things from a safe + +// Documents and whatnot + +/obj/effect/spawner/random/epic_loot/random_documents + name = "random documents" + icon_state = "random_documents" + loot = list( + /obj/item/folder/white = 2, + /obj/item/folder/red = 2, + /obj/item/folder/blue = 2, + /obj/item/folder/ancient_paperwork = 2, + /obj/item/epic_loot/intel_folder = 2, + /obj/item/epic_loot/corpo_folder = 2, + /obj/item/epic_loot/slim_diary = 2, + /obj/item/epic_loot/diary = 2, + /obj/item/computer_disk/maintenance = 2, + /obj/item/computer_disk/black_market = 1, + /obj/item/computer_disk/virus = 1, + /obj/item/clipboard = 2, + /obj/item/pen/fountain/captain = 1, + /obj/item/pen/fountain = 2, + /obj/item/pen/screwdriver = 1, + /obj/item/pen/red = 2, + /obj/item/pen/blue = 2, + /obj/item/pen/fourcolor = 2, + /obj/item/pen/survival = 1, + /obj/item/storage/epic_loot_docs_case = 1, + /obj/item/book/granter/crafting_recipe/dusting/smoothbore_disabler_prime = 1, + /obj/item/book/granter/crafting_recipe/dusting/laser_musket_prime = 1, + /obj/item/book/granter/crafting_recipe/dusting/pipegun_prime = 1, + /obj/item/book/granter/crafting_recipe/death_sandwich = 1, + /obj/item/book/granter/crafting_recipe/trash_cannon = 1, + /obj/item/book/granter/crafting_recipe/donk_secret_recipe = 1, + ) + +// Stuff that comes in strongboxes specifically + +/obj/effect/spawner/random/epic_loot/random_strongbox_loot + name = "random strongbox loot" + icon_state = "random_strongbox_loot" + loot = list( + /obj/item/epic_loot/ssd = 1, + /obj/item/epic_loot/hdd = 1, + /obj/effect/spawner/random/epic_loot/pocket_valuable = 2, + /obj/effect/spawner/random/epic_loot/random_documents = 2, + ) + +// Unsorted yeah + +// "Military" loot + +/obj/effect/spawner/random/epic_loot/random_other_military_loot + name = "random military loot" + desc = "Automagically transforms into some kind of misc. military loot item." + icon_state = "random_loot_military" + loot = list( + /obj/item/clothing/mask/gas/sechailer = 3, + /obj/item/clothing/mask/gas = 2, + /obj/item/clothing/mask/gas/atmos/frontier_colonist = 2, + /obj/item/folder/ancient_paperwork = 2, + /obj/item/epic_loot/intel_folder = 3, + /obj/item/epic_loot/slim_diary = 3, + /obj/item/epic_loot/ssd = 2, + /obj/item/epic_loot/hdd = 2, + /obj/item/epic_loot/military_flash = 2, + /obj/item/computer_disk/maintenance = 2, + /obj/item/computer_disk/black_market = 1, + /obj/item/epic_loot/plasma_explosive = 1, + /obj/item/epic_loot/grenade_fuze = 3, + /obj/item/epic_loot/signal_amp = 3, + /obj/item/epic_loot/thermal_camera = 2, + /obj/item/epic_loot/shuttle_gyro = 2, + /obj/item/epic_loot/phased_array = 2, + /obj/item/epic_loot/shuttle_battery = 2, + /obj/item/epic_loot/military_circuit = 3, + /obj/item/storage/epic_loot_medpen_case = 2, + /obj/item/storage/epic_loot_docs_case = 2, + /obj/item/storage/epic_loot_org_pouch = 2, + ) + +// Random food for transport +/obj/effect/spawner/random/epic_loot/random_provisions + name = "random provisions" + icon_state = "random_food" + loot = list( + /obj/item/food/sustenance_bar = 3, + /obj/item/food/sustenance_bar/cheese = 2, + /obj/item/food/sustenance_bar/mint = 2, + /obj/item/food/sustenance_bar/neapolitan = 2, + /obj/item/food/vendor_snacks/mothmallow = 1, + /obj/item/food/vendor_snacks/moth_bag = 3, + /obj/item/food/vendor_snacks/moth_bag/cheesecake = 2, + /obj/item/food/vendor_snacks/moth_bag/cheesecake/honey = 2, + /obj/item/food/vendor_snacks/moth_bag/fuel_jack = 3, + /obj/item/food/vendor_tray_meal/side/cornbread = 2, + /obj/item/food/vendor_tray_meal/side/moffin = 2, + /obj/item/food/vendor_tray_meal/side/roasted_seeds = 2, + /obj/item/food/brain_pate = 2, + /obj/item/food/branrequests = 3, + /obj/item/food/breadslice/corn = 2, + /obj/item/food/breadslice/reispan = 2, + /obj/item/food/breadslice/plain = 2, + /obj/item/food/breadslice/root = 2, + /obj/item/food/butter = 3, + /obj/item/food/candy = 3, + /obj/item/food/canned/beans = 3, + /obj/item/food/canned/peaches = 3, + /obj/item/food/canned/tomatoes = 3, + /obj/item/food/canned/chap = 3, + /obj/item/food/canned/desert_snails = 2, + /obj/item/food/canned/envirochow = 1, + /obj/item/food/canned/jellyfish = 2, + /obj/item/food/canned/larvae = 2, + /obj/item/food/canned/pine_nuts = 2, + /obj/item/food/canned/squid_ink = 1, + /obj/item/food/cheese/firm_cheese_slice = 2, + /obj/item/food/cheese/firm_cheese = 1, + /obj/item/food/chocolatebar = 2, + /obj/item/food/cnds/random = 3, + /obj/item/food/colonial_course/pljeskavica = 1, + /obj/item/food/colonial_course/nachos = 1, + /obj/item/food/colonial_course/blins = 1, + /obj/item/food/cornchips/random = 2, + /obj/item/food/peanuts/random = 2, + /obj/item/food/ready_donk = 1, + /obj/item/food/ready_donk/donkhiladas = 1, + /obj/item/food/ready_donk/donkrange_chicken = 1, + /obj/item/food/ready_donk/mac_n_cheese = 1, + /obj/item/food/ready_donk/nachos_grandes = 1, + /obj/item/food/ready_donk/country_chicken = 1, + /obj/item/food/ready_donk/salisbury_steak = 1, + /obj/item/food/semki = 3, + /obj/item/food/spacers_sidekick = 2, + /obj/item/food/sticko/random = 3, + // Ingredients + /obj/item/reagent_containers/cup/glass/bottle/juice/limejuice = 2, + /obj/item/reagent_containers/cup/glass/bottle/juice/orangejuice = 2, + /obj/item/reagent_containers/cup/glass/bottle/juice/pineapplejuice = 2, + /obj/item/reagent_containers/condiment/milk = 1, + /obj/item/reagent_containers/condiment/sugar/small_ration = 2, + /obj/item/reagent_containers/condiment/flour/small_ration = 2, + /obj/item/reagent_containers/condiment/small_ration_korta_flour = 2, + /obj/item/reagent_containers/condiment/cherryjelly = 1, + /obj/item/reagent_containers/condiment/rice/small_ration = 2, + /obj/item/reagent_containers/condiment/soymilk/small_ration = 2, + /obj/item/reagent_containers/condiment/cornmeal = 1, + /obj/item/reagent_containers/condiment/grounding_solution = 1, + /obj/item/reagent_containers/condiment/bbqsauce = 2, + /obj/item/reagent_containers/condiment/chocolate = 1, + /obj/item/reagent_containers/condiment/coconut_milk = 2, + /obj/item/reagent_containers/condiment/curry_powder = 2, + /obj/item/reagent_containers/condiment/dashi_concentrate = 1, + /obj/item/reagent_containers/condiment/donksauce = 1, + /obj/item/reagent_containers/condiment/vegetable_oil = 2, + /obj/item/reagent_containers/condiment/worcestershire = 1, + /obj/item/reagent_containers/condiment/enzyme = 1, + /obj/item/reagent_containers/condiment/honey = 1, + /obj/item/reagent_containers/condiment/hotsauce = 1, + /obj/item/reagent_containers/condiment/ketchup = 1, + /obj/item/reagent_containers/condiment/mayonnaise = 1, + /obj/item/reagent_containers/condiment/peanut_butter = 1, + /obj/item/reagent_containers/condiment/protein = 1, + /obj/item/reagent_containers/condiment/red_bay = 2, + /obj/item/reagent_containers/condiment/vinegar = 1, + /obj/item/reagent_containers/condiment/coldsauce = 1, + /obj/item/storage/box/spaceman_ration/meats = 1, + /obj/item/storage/box/spaceman_ration/meats/lizard = 1, + /obj/item/storage/box/spaceman_ration/meats/fish = 1, + /obj/item/storage/box/spaceman_ration/plants = 2, + /obj/item/storage/box/spaceman_ration/plants/alternate = 2, + /obj/item/storage/box/spaceman_ration/plants/lizard = 2, + /obj/item/storage/box/spaceman_ration/plants/mothic = 2, + /obj/item/storage/box/papersack/ration_bread_slice = 1, + /obj/item/storage/box/colonial_rations = 1, + // Da cooler + /obj/item/storage/epic_loot_cooler = 2, + ) + +// Da money + +/obj/effect/spawner/random/entertainment/money/one + spawn_loot_count = 1 + +/obj/effect/spawner/random/entertainment/money_small/one + spawn_loot_count = 1 + +// Maint structure spawner + +/obj/effect/spawner/random/epic_loot/random_maint_loot_structure + name = "random maintenance loot structure" + desc = "Automagically transforms into a random loot structure that spawns in maint." + icon = 'modular_doppler/epic_loot/icons/loot_structures.dmi' + icon_state = "random_maint_structure" + loot = list( + /obj/structure/maintenance_loot_structure/ammo_box/random, + /obj/structure/maintenance_loot_structure/computer_tower/random, + /obj/structure/maintenance_loot_structure/file_cabinet/random, + /obj/structure/maintenance_loot_structure/grenade_box/random, + /obj/structure/maintenance_loot_structure/gun_box/random, + /obj/effect/spawner/random/epic_loot/random_supply_crate, + /obj/structure/maintenance_loot_structure/medbox/random, + /obj/structure/maintenance_loot_structure/military_case/random, + /obj/structure/maintenance_loot_structure/register/random, + /obj/structure/maintenance_loot_structure/desk_safe/random, + /obj/structure/maintenance_loot_structure/toolbox/random, + /obj/structure/maintenance_loot_structure/wall_jacket/random, + ) diff --git a/modular_doppler/epic_loot/code/storage_containers/containers.dm b/modular_doppler/epic_loot/code/storage_containers/containers.dm new file mode 100644 index 0000000000000..682315b83a58b --- /dev/null +++ b/modular_doppler/epic_loot/code/storage_containers/containers.dm @@ -0,0 +1,232 @@ +/obj/item/storage/epic_loot_medpen_case + name = "autoinjector case" + desc = "A semi-rigid case for holding a large number of autoinjectors inside of." + icon = 'modular_doppler/epic_loot/icons/storage_items.dmi' + icon_state = "pencase" + equip_sound = 'sound/items/equip/toolbelt_equip.ogg' + pickup_sound = 'sound/items/handling/cloth_pickup.ogg' + drop_sound = 'sound/items/handling/cloth_drop.ogg' + storage_type = /datum/storage/maintenance_loot_structure/epic_loot_medpen_case + slot_flags = ITEM_SLOT_POCKETS + w_class = WEIGHT_CLASS_BULKY + +/datum/storage/maintenance_loot_structure/epic_loot_medpen_case + max_slots = 6 + max_specific_storage = WEIGHT_CLASS_SMALL + max_total_storage = WEIGHT_CLASS_SMALL * 6 + numerical_stacking = TRUE + opening_sound = 'sound/items/zip/un_zip.ogg' + +/datum/storage/maintenance_loot_structure/epic_loot_medpen_case/New() + . = ..() + + can_hold = typecacheof(list( + /obj/item/dnainjector, + /obj/item/hypospray, + /obj/item/implant, + /obj/item/implantcase, + /obj/item/implanter, + /obj/item/lazarus_injector, + /obj/item/reagent_containers/hypospray, + /obj/item/reagent_containers/medigel, + /obj/item/reagent_containers/pill, + /obj/item/storage/pill_bottle, + )) + +/obj/item/storage/epic_loot_docs_case + name = "documents case" + desc = "A large pouch conveniently shaped to hold all of the valueable paperwork in the galaxy." + icon = 'modular_doppler/epic_loot/icons/storage_items.dmi' + icon_state = "documents" + equip_sound = 'sound/items/equip/toolbelt_equip.ogg' + pickup_sound = 'sound/items/handling/cloth_pickup.ogg' + drop_sound = 'sound/items/handling/cloth_drop.ogg' + storage_type = /datum/storage/maintenance_loot_structure/epic_loot_docs_case + slot_flags = ITEM_SLOT_POCKETS + w_class = WEIGHT_CLASS_BULKY + +/datum/storage/maintenance_loot_structure/epic_loot_docs_case + max_slots = 4 + max_specific_storage = WEIGHT_CLASS_BULKY + max_total_storage = WEIGHT_CLASS_BULKY * 4 + screen_max_columns = 2 + numerical_stacking = TRUE + opening_sound = 'sound/items/handling/cloth_pickup.ogg' + +/datum/storage/maintenance_loot_structure/epic_loot_docs_case/New() + . = ..() + + can_hold = typecacheof(list( + /obj/item/folder, + /obj/item/epic_loot/intel_folder, + /obj/item/epic_loot/corpo_folder, + /obj/item/epic_loot/slim_diary, + /obj/item/epic_loot/diary, + /obj/item/computer_disk, + /obj/item/paper, + /obj/item/photo, + /obj/item/documents, + /obj/item/paperwork, + /obj/item/clipboard, + )) + +/obj/item/storage/epic_loot_org_pouch + name = "organizational pouch" + desc = "A pouch with every possible type of pocket and organizer stuck into it, to hold all of the small stuff you could think of." + icon = 'modular_doppler/epic_loot/icons/storage_items.dmi' + icon_state = "sick" + equip_sound = 'sound/items/equip/toolbelt_equip.ogg' + pickup_sound = 'sound/items/handling/cloth_pickup.ogg' + drop_sound = 'sound/items/handling/cloth_drop.ogg' + storage_type = /datum/storage/maintenance_loot_structure/epic_loot_org_pouch + slot_flags = ITEM_SLOT_POCKETS + w_class = WEIGHT_CLASS_BULKY + +/datum/storage/maintenance_loot_structure/epic_loot_org_pouch + max_slots = 4 + max_specific_storage = WEIGHT_CLASS_SMALL + max_total_storage = WEIGHT_CLASS_SMALL * 4 + screen_max_columns = 2 + numerical_stacking = TRUE + opening_sound = 'sound/items/zip/un_zip.ogg' + +/obj/item/storage/epic_loot_cooler + name = "compact cooler" + desc = "A wonder in food storage technology, it's a blue bag that you can put food in." + icon = 'modular_doppler/epic_loot/icons/storage_items.dmi' + icon_state = "cooler" + lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi' + inhand_icon_state = "toolbox_blue" + drop_sound = 'sound/items/handling/ammobox_drop.ogg' + pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + storage_type = /datum/storage/maintenance_loot_structure/epic_loot_cooler + w_class = WEIGHT_CLASS_BULKY + +/datum/storage/maintenance_loot_structure/epic_loot_cooler + max_slots = 12 + max_specific_storage = WEIGHT_CLASS_BULKY + max_total_storage = WEIGHT_CLASS_BULKY * 12 + screen_max_columns = 4 + numerical_stacking = FALSE + opening_sound = 'sound/items/zip/un_zip.ogg' + +/datum/storage/maintenance_loot_structure/epic_loot_cooler/New() + . = ..() + + can_hold = typecacheof(list( + /obj/item/food, + /obj/item/reagent_containers/condiment, + /obj/item/reagent_containers/cup, + )) + +/obj/item/storage/epic_loot_money_case + name = "money case" + desc = "A heavy duty case for the transportation of (bribe) money." + icon = 'modular_doppler/epic_loot/icons/storage_items.dmi' + icon_state = "money_case" + lefthand_file = 'icons/mob/inhands/equipment/briefcase_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/briefcase_righthand.dmi' + inhand_icon_state = "lockbox" + drop_sound = 'sound/items/handling/ammobox_drop.ogg' + pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + storage_type = /datum/storage/maintenance_loot_structure/epic_loot_the_money + w_class = WEIGHT_CLASS_BULKY + +/datum/storage/maintenance_loot_structure/epic_loot_the_money + max_slots = 6 + max_specific_storage = WEIGHT_CLASS_NORMAL + max_total_storage = WEIGHT_CLASS_NORMAL * 6 + screen_max_columns = 2 + numerical_stacking = FALSE + opening_sound = 'modular_doppler/epic_loot/sound/wood_crate_1.mp3' + +/datum/storage/maintenance_loot_structure/epic_loot_the_money/New() + . = ..() + + can_hold = typecacheof(list( + /obj/item/stack/spacecash, + /obj/item/coin, + )) + +/obj/item/storage/epic_loot_medical_case + name = "medical case" + desc = "A heavy duty case for the transportation of medical supplies." + icon = 'modular_doppler/epic_loot/icons/storage_items.dmi' + icon_state = "medical" + lefthand_file = 'icons/mob/inhands/equipment/briefcase_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/briefcase_righthand.dmi' + inhand_icon_state = "bitrunning" + drop_sound = 'sound/items/handling/ammobox_drop.ogg' + pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + storage_type = /datum/storage/maintenance_loot_structure/epic_loot_medkit + w_class = WEIGHT_CLASS_BULKY + +/datum/storage/maintenance_loot_structure/epic_loot_medkit + max_slots = 21 + max_specific_storage = WEIGHT_CLASS_BULKY + max_total_storage = WEIGHT_CLASS_BULKY * 21 + screen_max_columns = 7 + numerical_stacking = FALSE + opening_sound = 'modular_doppler/epic_loot/sound/wood_crate_1.mp3' + +/datum/storage/maintenance_loot_structure/epic_loot_medkit/New() + . = ..() + + can_hold = typecacheof(list( + /obj/item/blood_filter, + /obj/item/bonesetter, + /obj/item/cautery, + /obj/item/circular_saw, + /obj/item/clothing/glasses, + /obj/item/clothing/gloves, + /obj/item/clothing/neck/stethoscope, + /obj/item/clothing/mask/breath, + /obj/item/clothing/mask/muzzle, + /obj/item/clothing/mask/surgical, + /obj/item/clothing/suit/toggle/labcoat/hospitalgown, + /obj/item/construction/plumbing, + /obj/item/dnainjector, + /obj/item/extinguisher/mini, + /obj/item/flashlight/pen, + /obj/item/geiger_counter, + /obj/item/gun/syringe/syndicate, + /obj/item/healthanalyzer, + /obj/item/hemostat, + /obj/item/holosign_creator/medical, + /obj/item/hypospray, + /obj/item/implant, + /obj/item/implantcase, + /obj/item/implanter, + /obj/item/lazarus_injector, + /obj/item/lighter, + /obj/item/pinpointer/crew, + /obj/item/plunger, + /obj/item/radio, + /obj/item/reagent_containers/blood, + /obj/item/reagent_containers/dropper, + /obj/item/reagent_containers/cup/beaker, + /obj/item/reagent_containers/cup/bottle, + /obj/item/reagent_containers/cup/tube, + /obj/item/reagent_containers/hypospray, + /obj/item/reagent_containers/medigel, + /obj/item/reagent_containers/pill, + /obj/item/reagent_containers/spray, + /obj/item/reagent_containers/syringe, + /obj/item/retractor, + /obj/item/scalpel, + /obj/item/shears, + /obj/item/stack/medical, + /obj/item/stack/sticky_tape, + /obj/item/stamp, + /obj/item/sensor_device, + /obj/item/storage/fancy/cigarettes, + /obj/item/storage/pill_bottle, + /obj/item/surgical_drapes, + /obj/item/surgicaldrill, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/wrench/medical, + /obj/item/emergency_bed, + /obj/item/storage/box/bandages, + /obj/item/bodybag, + )) diff --git a/modular_doppler/epic_loot/code/where_they_spawn.dm b/modular_doppler/epic_loot/code/where_they_spawn.dm new file mode 100644 index 0000000000000..2d981ae7598d3 --- /dev/null +++ b/modular_doppler/epic_loot/code/where_they_spawn.dm @@ -0,0 +1,42 @@ +/obj/effect/spawner/random/trash/box + loot = list( + /obj/structure/closet/cardboard = 9, + /obj/structure/closet/cardboard/metal = 1, + /obj/effect/spawner/random/epic_loot/random_maint_loot_structure = 3, + ) + +/obj/effect/spawner/random/structure/crate + loot = list( + /obj/effect/spawner/random/epic_loot/random_maint_loot_structure = 1000, + /obj/effect/spawner/random/structure/crate_loot = 744, + /obj/structure/closet/crate/trashcart/filled = 75, + /obj/effect/spawner/random/trash/moisture_trap = 50, + /obj/effect/spawner/random/trash/hobo_squat = 30, + /obj/structure/closet/mini_fridge = 35, + /obj/effect/spawner/random/trash/mess = 30, + /obj/item/kirbyplants/fern = 20, + /obj/structure/closet/crate/decorations = 15, + /obj/effect/decal/remains/human/smokey/maintenance = 7, + /obj/structure/destructible/cult/pants_altar = 1, + ) + +/obj/effect/spawner/random/structure/crate_loot + loot = list( + /obj/effect/spawner/random/epic_loot/random_maint_loot_structure = 30, + /obj/effect/spawner/random/structure/closet_empty/crate/with_loot = 15, + /obj/effect/spawner/random/structure/closet_empty/crate = 4, + /obj/structure/closet/crate/secure/loot = 1, + ) + +/obj/effect/spawner/random/structure/closet_maintenance + loot = list( + /obj/effect/spawner/random/epic_loot/random_maint_loot_structure = 15, + /obj/effect/spawner/random/structure/closet_empty = 10, + /obj/structure/closet/emcloset = 2, + /obj/structure/closet/firecloset = 2, + /obj/structure/closet/toolcloset = 2, + /obj/structure/closet/l3closet = 1, + /obj/structure/closet/radiation = 1, + /obj/structure/closet/bombcloset = 1, + /obj/structure/closet/mini_fridge/grimy = 1, + ) diff --git a/modular_doppler/epic_loot/icons/epic_loot.dmi b/modular_doppler/epic_loot/icons/epic_loot.dmi new file mode 100644 index 0000000000000..e05a53aefdea6 Binary files /dev/null and b/modular_doppler/epic_loot/icons/epic_loot.dmi differ diff --git a/modular_doppler/epic_loot/icons/loot_structures.dmi b/modular_doppler/epic_loot/icons/loot_structures.dmi new file mode 100644 index 0000000000000..213c69849cfef Binary files /dev/null and b/modular_doppler/epic_loot/icons/loot_structures.dmi differ diff --git a/modular_doppler/epic_loot/icons/storage_items.dmi b/modular_doppler/epic_loot/icons/storage_items.dmi new file mode 100644 index 0000000000000..04e6db41d6708 Binary files /dev/null and b/modular_doppler/epic_loot/icons/storage_items.dmi differ diff --git a/modular_doppler/epic_loot/sound/attributions.txt b/modular_doppler/epic_loot/sound/attributions.txt new file mode 100644 index 0000000000000..6aee04bdec393 --- /dev/null +++ b/modular_doppler/epic_loot/sound/attributions.txt @@ -0,0 +1 @@ +The sounds in this folder are all from https://pixabay.com/users/38928062/ as of the time of writing this comment diff --git a/modular_doppler/epic_loot/sound/cabinet.mp3 b/modular_doppler/epic_loot/sound/cabinet.mp3 new file mode 100644 index 0000000000000..b2380969d783d Binary files /dev/null and b/modular_doppler/epic_loot/sound/cabinet.mp3 differ diff --git a/modular_doppler/epic_loot/sound/plastic.mp3 b/modular_doppler/epic_loot/sound/plastic.mp3 new file mode 100644 index 0000000000000..469ff97a2fdde Binary files /dev/null and b/modular_doppler/epic_loot/sound/plastic.mp3 differ diff --git a/modular_doppler/epic_loot/sound/wood_crate_1.mp3 b/modular_doppler/epic_loot/sound/wood_crate_1.mp3 new file mode 100644 index 0000000000000..3fdf354ae0b07 Binary files /dev/null and b/modular_doppler/epic_loot/sound/wood_crate_1.mp3 differ diff --git a/modular_doppler/epic_loot/sound/wood_crate_2.mp3 b/modular_doppler/epic_loot/sound/wood_crate_2.mp3 new file mode 100644 index 0000000000000..01fa391d6cccc Binary files /dev/null and b/modular_doppler/epic_loot/sound/wood_crate_2.mp3 differ diff --git a/modular_doppler/epic_loot/sound/wood_crate_3.mp3 b/modular_doppler/epic_loot/sound/wood_crate_3.mp3 new file mode 100644 index 0000000000000..aa3d9954f8266 Binary files /dev/null and b/modular_doppler/epic_loot/sound/wood_crate_3.mp3 differ diff --git a/modular_doppler/objects_and_structures/code/structure.dm b/modular_doppler/objects_and_structures/code/structure.dm deleted file mode 100644 index 8ebda2b81ed2f..0000000000000 --- a/modular_doppler/objects_and_structures/code/structure.dm +++ /dev/null @@ -1,16 +0,0 @@ -/obj/effect/spawner/random/structure/crate - name = "crate spawner" - icon_state = "crate_secure" - loot = list( - /obj/effect/spawner/random/structure/crate_loot = 495, - /obj/structure/trash_pile = 250, - /obj/structure/closet/crate/trashcart/filled = 75, - /obj/effect/spawner/random/trash/moisture_trap = 50, - /obj/effect/spawner/random/trash/hobo_squat = 30, - /obj/structure/closet/mini_fridge = 35, - /obj/effect/spawner/random/trash/mess = 30, - /obj/item/kirbyplants/fern = 20, - /obj/structure/closet/crate/decorations = 15, - /obj/effect/decal/remains/human/smokey/maintenance = 7, - /obj/structure/destructible/cult/pants_altar = 1, - ) diff --git a/modular_doppler/objects_and_structures/code/trash_pile.dm b/modular_doppler/objects_and_structures/code/trash_pile.dm deleted file mode 100644 index 8e38a9bc46796..0000000000000 --- a/modular_doppler/objects_and_structures/code/trash_pile.dm +++ /dev/null @@ -1,138 +0,0 @@ -/obj/structure/trash_pile - name = "trash pile" - desc = "A heap of garbage, but maybe there's something interesting inside?" - icon = 'modular_doppler/objects_and_structures/icons/trash_piles.dmi' - icon_state = "randompile" - density = TRUE - anchored = TRUE - layer = TABLE_LAYER - obj_flags = CAN_BE_HIT - pass_flags = LETPASSTHROW - - max_integrity = 50 - - var/hide_person_time = 30 - var/hide_item_time = 15 - - var/list/searchedby = list()// Characters that have searched this trashpile, with values of searched time. - -/obj/structure/trash_pile/Initialize(mapload) - . = ..() - icon_state = pick( - "pile1", - "pile2", - "pilechair", - "piletable", - "pilevending", - "brtrashpile", - "microwavepile", - "rackpile", - "boxfort", - "trashbag", - "brokecomp", - ) - -/obj/structure/trash_pile/proc/do_search(mob/user) - if(contents.len) // There's something hidden - var/atom/hidden_atom = contents[contents.len] // Get the most recent hidden thing - if(istype(hidden_atom, /mob/living)) - var/mob/living/hidden_mob = hidden_atom - balloon_alert(user, "someone is inside!") - eject_mob(hidden_mob) - else if (istype(hidden_atom, /obj/item)) - var/obj/item/hidden_item = hidden_atom - balloon_alert(user, "found something!") - hidden_item.forceMove(src.loc) - else - // You already searched this one bruh - if(user.ckey in searchedby) - balloon_alert(user, "already searched!") - // You found an item! - else - produce_alpha_item() - balloon_alert(user, "found something!") - searchedby += user.ckey - -/obj/structure/trash_pile/attack_hand(mob/user) - // Human mob - if(ishuman(user)) - var/mob/living/carbon/human/human_user = user - human_user.visible_message("[user] searches through \the [src].", span_notice("You search through \the [src].")) - // Do the searching - if(do_after(user, rand(4 SECONDS, 6 SECONDS), target = src)) - if(src.loc) // Let's check if the pile still exists - do_search(user) - else - return ..() - -// Random lists -/obj/structure/trash_pile/proc/produce_alpha_item() - var/lootspawn = pick_weight(GLOB.maintenance_loot) - while(islist(lootspawn)) - lootspawn = pick_weight(lootspawn) - var/obj/item/hidden_item = new lootspawn(get_turf(src)) - return hidden_item - -/obj/structure/trash_pile/mouse_drop_receive(atom/dropping, mob/user, params) - if(user == dropping && iscarbon(dropping)) - var/mob/living/dropped_mob = dropping - if(dropped_mob.mobility_flags & MOBILITY_MOVE) - dive_in_pile(user) - return - -/obj/structure/trash_pile/proc/eject_mob(mob/living/hidden_mob) - hidden_mob.forceMove(src.loc) - playsound(hidden_mob.loc, 'sound/machines/chime.ogg', 50, FALSE, -5) - hidden_mob.do_alert_animation(hidden_mob) - -/obj/structure/trash_pile/proc/do_dive(mob/user) - if(contents.len) - for(var/mob/hidden_mob in contents) - balloon_alert(user, "already someone inside!") - eject_mob(hidden_mob) - return FALSE - return TRUE - -/obj/structure/trash_pile/proc/dive_in_pile(mob/user) - user.visible_message(span_warning("[user] starts diving into [src]."), \ - span_notice("You start diving into [src]...")) - var/adjusted_dive_time = hide_person_time - if(HAS_TRAIT(user, TRAIT_RESTRAINED)) // hiding takes twice as long when restrained. - adjusted_dive_time *= 2 - - if(do_after(user, adjusted_dive_time, user)) - if(src.loc) // Checking if structure has been destroyed - if(do_dive(user)) - user.forceMove(src) - -/obj/structure/trash_pile/proc/can_hide_item(obj/item/hidden_item) - if(contents.len > 10) - return FALSE - return TRUE - -/obj/structure/trash_pile/attackby(obj/item/hidden_item, mob/living/user, params) - if(!user.combat_mode) - if(can_hide_item(hidden_item)) - balloon_alert(user, "hiding item...") - if(do_after(user, hide_item_time, user)) - if(src.loc) - if(user.transferItemToLoc(hidden_item, src)) - balloon_alert(user, "item hidden") - else - balloon_alert(user, "it's stuck to your hand!") - else - balloon_alert(user, "it's full!") - return - - . = ..() - -/obj/structure/trash_pile/Destroy() - for(var/atom/movable/pile_contents in src) - pile_contents.forceMove(src.loc) - return ..() - -/obj/structure/trash_pile/container_resist_act(mob/user) - user.forceMove(src.loc) - -/obj/structure/trash_pile/relaymove(mob/user) - container_resist_act(user) diff --git a/tgstation.dme b/tgstation.dme index e19b6041b1bcd..a6a8905e39b7c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6653,6 +6653,26 @@ #include "modular_doppler\emotes\code\overlay_emotes\overlay_emotes.dm" #include "modular_doppler\enterprise_resource_planning\code\breasts.dm" #include "modular_doppler\enterprise_resource_planning\code\erp_prefs.dm" +#include "modular_doppler\epic_loot\code\_basetype.dm" +#include "modular_doppler\epic_loot\code\random_spawners_real.dm" +#include "modular_doppler\epic_loot\code\where_they_spawn.dm" +#include "modular_doppler\epic_loot\code\loot_items\components.dm" +#include "modular_doppler\epic_loot\code\loot_items\electronics.dm" +#include "modular_doppler\epic_loot\code\loot_items\medical.dm" +#include "modular_doppler\epic_loot\code\loot_items\valuables.dm" +#include "modular_doppler\epic_loot\code\loot_structures\ammo_box.dm" +#include "modular_doppler\epic_loot\code\loot_structures\computer_tower.dm" +#include "modular_doppler\epic_loot\code\loot_structures\files.dm" +#include "modular_doppler\epic_loot\code\loot_structures\grenade_box.dm" +#include "modular_doppler\epic_loot\code\loot_structures\gun_case.dm" +#include "modular_doppler\epic_loot\code\loot_structures\large_crate.dm" +#include "modular_doppler\epic_loot\code\loot_structures\medbox.dm" +#include "modular_doppler\epic_loot\code\loot_structures\military_case.dm" +#include "modular_doppler\epic_loot\code\loot_structures\register.dm" +#include "modular_doppler\epic_loot\code\loot_structures\safe.dm" +#include "modular_doppler\epic_loot\code\loot_structures\toolbox.dm" +#include "modular_doppler\epic_loot\code\loot_structures\wall_jackets.dm" +#include "modular_doppler\epic_loot\code\storage_containers\containers.dm" #include "modular_doppler\examinemore\code\examine_more.dm" #include "modular_doppler\face_mouse_preferences\code\face_mouse_pref.dm" #include "modular_doppler\flavortext_and_records\code\defines.dm" @@ -7142,9 +7162,7 @@ #include "modular_doppler\objects_and_structures\code\icemoon_tiles.dm" #include "modular_doppler\objects_and_structures\code\mannequin.dm" #include "modular_doppler\objects_and_structures\code\sauna_oven.dm" -#include "modular_doppler\objects_and_structures\code\structure.dm" #include "modular_doppler\objects_and_structures\code\towel_bins.dm" -#include "modular_doppler\objects_and_structures\code\trash_pile.dm" #include "modular_doppler\objects_and_structures\code\watercloset.dm" #include "modular_doppler\pixel_shift\living.dm" #include "modular_doppler\pixel_shift\living_movement.dm"