From 1428f663e02edeccb749dd9a90b8999bb022eb2c Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Sat, 3 May 2025 02:55:58 +0530 Subject: [PATCH] Part 4: Storage Improvements (#90783) - Address https://github.com/tgstation/tgstation/pull/90476#discussion_r2051701283. Makes pill bottle code cleaner - Datumized some more storage values(monkey guncase toolbox & crafter toolbox) making their init slightly faster - Moved all standard storage subtypes(bags, boxes, lockboxes etc) that is scattered across various files & folders in the codebase into their respective files under `code/game/objects/item/storage` folder. This means for e.g. if you want to see all boxes in the game you can find them in `code/game/objects/item/storage/boxes` folder & don't have to go looking for hidden subtypes in various module files or folders where they were hidden away. Makes looking for stuff & modifying these storages much saner & easier :cl: code: organized storage subtypes under the same files & folders /:cl: --------- Co-authored-by: _0Steven <42909981+00-Steven@users.noreply.github.com> --- code/datums/station_traits/neutral_traits.dm | 25 - code/datums/storage/subtypes/toolboxes.dm | 10 + code/game/machinery/launch_pad.dm | 40 - code/game/objects/items/devices/spyglasses.dm | 11 - .../objects/items/devices/traitordevices.dm | 58 +- code/game/objects/items/dice.dm | 2 - code/game/objects/items/food/moth.dm | 24 - code/game/objects/items/pinpointer.dm | 10 - code/game/objects/items/religion.dm | 12 - code/game/objects/items/storage/backpack.dm | 411 +--------- code/game/objects/items/storage/bags.dm | 120 +-- code/game/objects/items/storage/belt.dm | 13 + .../objects/items/storage/boxes/_boxes.dm | 3 +- .../items/storage/boxes/clothes_boxes.dm | 76 ++ .../items/storage/boxes/fishing_boxes.dm | 66 ++ .../objects/items/storage/boxes/food_boxes.dm | 24 + .../items/storage/boxes/implant_boxes.dm | 11 + .../objects/items/storage/boxes/job_boxes.dm | 9 + code/game/objects/items/storage/boxes/misc.dm | 58 ++ .../items/storage/boxes/security_boxes.dm | 17 +- .../items/storage/boxes/service_boxes.dm | 43 ++ code/game/objects/items/storage/briefcase.dm | 55 +- code/game/objects/items/storage/dufflebags.dm | 406 ++++++++++ code/game/objects/items/storage/lockbox.dm | 96 ++- .../game/objects/items/storage/pillbottles.dm | 171 ++--- code/game/objects/items/storage/sixpack.dm | 35 + code/game/objects/items/storage/toolbox.dm | 707 ------------------ .../items/storage/toolboxes/_toolbox.dm | 160 ++++ .../items/storage/toolboxes/emergency.dm | 25 + .../items/storage/toolboxes/fishing.dm | 53 ++ .../items/storage/toolboxes/mechanical.dm | 70 ++ .../items/storage/toolboxes/medical.dm | 44 ++ .../objects/items/storage/toolboxes/misc.dm | 62 ++ .../items/storage/toolboxes/service.dm | 21 + .../items/storage/toolboxes/weapons.dm | 344 +++++++++ code/game/objects/items/teleportation.dm | 7 - code/game/objects/items/toys.dm | 8 - code/modules/admin/verbs/anonymousnames.dm | 48 -- .../traitor/contractor/contractor_items.dm | 9 - .../objects/gimmick_disks/_gimmick_disk.dm | 13 - .../objects/gimmick_disks/dungeon_disk.dm | 48 -- .../objects/gimmick_disks/sports_disk.dm | 45 -- code/modules/bitrunning/objects/loot_box.dm | 53 -- code/modules/clothing/head/costume.dm | 19 + code/modules/detectivework/evidence.dm | 8 - .../events/shuttle_loan/shuttle_loan_items.dm | 6 - code/modules/fishing/aquarium/aquarium_kit.dm | 10 - code/modules/fishing/fishing_equipment.dm | 115 --- .../ruins/spaceruin_code/forgottenship.dm | 8 - code/modules/mining/money_bag.dm | 35 - .../guns/ballistic/bows/bow_quivers.dm | 33 - .../projectiles/guns/energy/dueling.dm | 23 - .../internal/cyberimp/augments_internal.dm | 12 - .../vehicles/mecha/mecha_control_console.dm | 13 - tgstation.dme | 15 +- 55 files changed, 1864 insertions(+), 1956 deletions(-) create mode 100644 code/game/objects/items/storage/boxes/fishing_boxes.dm create mode 100644 code/game/objects/items/storage/boxes/misc.dm create mode 100644 code/game/objects/items/storage/dufflebags.dm delete mode 100644 code/game/objects/items/storage/toolbox.dm create mode 100644 code/game/objects/items/storage/toolboxes/_toolbox.dm create mode 100644 code/game/objects/items/storage/toolboxes/emergency.dm create mode 100644 code/game/objects/items/storage/toolboxes/fishing.dm create mode 100644 code/game/objects/items/storage/toolboxes/mechanical.dm create mode 100644 code/game/objects/items/storage/toolboxes/medical.dm create mode 100644 code/game/objects/items/storage/toolboxes/misc.dm create mode 100644 code/game/objects/items/storage/toolboxes/service.dm create mode 100644 code/game/objects/items/storage/toolboxes/weapons.dm delete mode 100644 code/modules/bitrunning/objects/loot_box.dm delete mode 100644 code/modules/mining/money_bag.dm delete mode 100644 code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm diff --git a/code/datums/station_traits/neutral_traits.dm b/code/datums/station_traits/neutral_traits.dm index 4b84117ff58..7fa13d5f534 100644 --- a/code/datums/station_traits/neutral_traits.dm +++ b/code/datums/station_traits/neutral_traits.dm @@ -492,31 +492,6 @@ if(!spawned.equip_to_slot_if_possible(shirt, ITEM_SLOT_OCLOTHING, indirect_action = TRUE)) shirt.forceMove(boxie) -/// A box containing a skub, for easier carry because skub is a bulky item. -/obj/item/storage/box/stickers/skub - name = "skub fan pack" - desc = "A vinyl pouch to store your skub and pro-skub shirt in. A label on the back reads: \"Skubtide, Stationwide\"." - icon_state = "skubpack" - illustration = "label_skub" - w_class = WEIGHT_CLASS_SMALL - storage_type = /datum/storage/box/skub - -/obj/item/storage/box/stickers/skub/PopulateContents() - new /obj/item/skub(src) - new /obj/item/sticker/skub(src) - new /obj/item/sticker/skub(src) - -/obj/item/storage/box/stickers/anti_skub - name = "anti-skub stickers pack" - desc = "The enemy may have been given a skub and a shirt, but I've got more stickers! Plus the pack can hold my anti-skub shirt." - icon_state = "skubpack" - illustration = "label_anti_skub" - storage_type = /datum/storage/box/anti_skub - -/obj/item/storage/box/stickers/anti_skub/PopulateContents() - for(var/i in 1 to 4) - new /obj/item/sticker/anti_skub(src) - #undef PRO_SKUB #undef ANTI_SKUB #undef SKUB_IDFC diff --git a/code/datums/storage/subtypes/toolboxes.dm b/code/datums/storage/subtypes/toolboxes.dm index 17358d4600c..fb97bfc9d1a 100644 --- a/code/datums/storage/subtypes/toolboxes.dm +++ b/code/datums/storage/subtypes/toolboxes.dm @@ -22,6 +22,11 @@ max_slots = 4 max_specific_storage = WEIGHT_CLASS_BULKY +///Monkey Guncase toolbox +/datum/storage/toolbox/guncase/monkey/New(atom/parent, max_slots, max_specific_storage, max_total_storage) + . = ..() + set_locked(STORAGE_SOFT_LOCKED) + ///Doublesword toolbox /datum/storage/toolbox/guncase/doublesword max_slots = 5 @@ -35,3 +40,8 @@ ///Fishing toolbox small /datum/storage/toolbox/fishing/small max_specific_storage = WEIGHT_CLASS_SMALL //It can still hold a fishing rod + +///Crafter toolbox +/datum/storage/toolbox/crafter + max_total_storage = 20 + max_slots = 11 diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index bac6a1650b6..1a48dbff661 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -322,46 +322,6 @@ else return ..() -//Briefcase item that contains the launchpad. -/obj/item/storage/briefcase/launchpad - var/obj/machinery/launchpad/briefcase/pad - -/obj/item/storage/briefcase/launchpad/Initialize(mapload) - pad = new(null, src) //spawns pad in nullspace to hide it from briefcase contents - . = ..() - -/obj/item/storage/briefcase/launchpad/Destroy() - if(!QDELETED(pad)) - qdel(pad) - pad = null - return ..() - -/obj/item/storage/briefcase/launchpad/PopulateContents() - new /obj/item/pen(src) - new /obj/item/launchpad_remote(src, pad) - -/obj/item/storage/briefcase/launchpad/attack_self(mob/user) - if(!isturf(user.loc)) //no setting up in a locker - return - add_fingerprint(user) - user.visible_message(span_notice("[user] starts setting down [src]..."), span_notice("You start setting up [pad]...")) - if(do_after(user, 3 SECONDS, target = user)) - pad.forceMove(get_turf(src)) - pad.update_indicator() - pad.closed = FALSE - user.transferItemToLoc(src, pad, TRUE) - atom_storage.close_all() - -/obj/item/storage/briefcase/launchpad/tool_act(mob/living/user, obj/item/tool, list/modifiers) - if(!istype(tool, /obj/item/launchpad_remote)) - return ..() - var/obj/item/launchpad_remote/remote = tool - if(remote.pad == WEAKREF(src.pad)) - return ..() - remote.pad = WEAKREF(src.pad) - to_chat(user, span_notice("You link [pad] to [remote].")) - return ITEM_INTERACT_BLOCKING - /obj/item/launchpad_remote name = "folder" desc = "A folder." diff --git a/code/game/objects/items/devices/spyglasses.dm b/code/game/objects/items/devices/spyglasses.dm index 0c91b8b2255..14cbca8edc5 100644 --- a/code/game/objects/items/devices/spyglasses.dm +++ b/code/game/objects/items/devices/spyglasses.dm @@ -78,11 +78,6 @@ for(var/turf/visible_turf in view(cam_range, get_turf(src)))//fuck you usr cam_screen.vis_contents += visible_turf -//it needs to be linked, hence a kit. -/obj/item/storage/box/rxglasses/spyglasskit - name = "spyglass kit" - desc = "this box contains cool nerd glasses; with built-in displays to view a linked camera." - /obj/item/paper/fluff/nerddocs name = "Espionage For Dummies" color = COLOR_YELLOW @@ -98,9 +93,3 @@ My SpySpeks tm Make a shrill beep while attempting to use! A shrill beep coming from your SpySpeks means that they can't connect to the included ProfitProtektor tm, please make sure your ProfitProtektor is still active, and functional! "} -/obj/item/storage/box/rxglasses/spyglasskit/PopulateContents() - var/obj/item/clothing/accessory/spy_bug/newbug = new(src) - var/obj/item/clothing/glasses/sunglasses/spy/newglasses = new(src) - newbug.linked_glasses = newglasses - newglasses.linked_bug = newbug - new /obj/item/paper/fluff/nerddocs(src) diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index af603ca6cf5..213a3cca4fd 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -409,58 +409,6 @@ effective or pretty fucking useless. . = ..() ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) -/obj/item/storage/toolbox/emergency/turret - desc = "You feel a strange urge to hit this with a wrench." - -/obj/item/storage/toolbox/emergency/turret/PopulateContents() - new /obj/item/screwdriver(src) - new /obj/item/wrench/combat(src) - new /obj/item/weldingtool(src) - new /obj/item/crowbar(src) - new /obj/item/analyzer(src) - new /obj/item/wirecutters(src) - -/obj/item/storage/toolbox/emergency/turret/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - if(!istype(tool, /obj/item/wrench/combat)) - return NONE - if(!user.combat_mode) - return NONE - if(!tool.toolspeed) - return ITEM_INTERACT_BLOCKING - balloon_alert(user, "constructing...") - if(!tool.use_tool(src, user, 2 SECONDS, volume = 20)) - return ITEM_INTERACT_BLOCKING - - balloon_alert(user, "constructed!") - user.visible_message( - span_danger("[user] bashes [src] with [tool]!"), - span_danger("You bash [src] with [tool]!"), - null, - COMBAT_MESSAGE_RANGE, - ) - - playsound(src, 'sound/items/tools/drill_use.ogg', 80, TRUE, -1) - var/obj/machinery/porta_turret/syndicate/toolbox/turret = new(get_turf(loc)) - set_faction(turret, user) - turret.toolbox = src - forceMove(turret) - return ITEM_INTERACT_SUCCESS - - -/obj/item/storage/toolbox/emergency/turret/proc/set_faction(obj/machinery/porta_turret/turret, mob/user) - turret.faction = list("[REF(user)]") - -/obj/item/storage/toolbox/emergency/turret/nukie/set_faction(obj/machinery/porta_turret/turret, mob/user) - turret.faction = list(ROLE_SYNDICATE) - -/obj/machinery/porta_turret/syndicate/toolbox - icon_state = "toolbox_off" - base_icon_state = "toolbox" - -/obj/machinery/porta_turret/syndicate/toolbox/Initialize(mapload) - . = ..() - underlays += image(icon = icon, icon_state = "[base_icon_state]_frame") - /obj/machinery/porta_turret/syndicate/toolbox integrity_failure = 0 max_integrity = 100 @@ -469,9 +417,15 @@ effective or pretty fucking useless. lethal_projectile = /obj/projectile/bullet/toolbox_turret subsystem_type = /datum/controller/subsystem/processing/projectiles ignore_faction = TRUE + icon_state = "toolbox_off" + base_icon_state = "toolbox" /// The toolbox we store. var/obj/item/toolbox +/obj/machinery/porta_turret/syndicate/toolbox/Initialize(mapload) + . = ..() + underlays += image(icon = icon, icon_state = "[base_icon_state]_frame") + /obj/machinery/porta_turret/syndicate/toolbox/examine(mob/user) . = ..() if(faction_check(faction, user.faction)) diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index 71d00898431..59d264e0210 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -34,8 +34,6 @@ user.visible_message(span_suicide("[user] is gambling with death! It looks like [user.p_theyre()] trying to commit suicide!")) return OXYLOSS -/obj/item/storage/dice/hazard - /obj/item/storage/dice/hazard/PopulateContents() new /obj/item/dice/d6(src) new /obj/item/dice/d6(src) diff --git a/code/game/objects/items/food/moth.dm b/code/game/objects/items/food/moth.dm index eeaa02cebc8..db06689d795 100644 --- a/code/game/objects/items/food/moth.dm +++ b/code/game/objects/items/food/moth.dm @@ -895,30 +895,6 @@ tastes = list("herbs" = 1) color = "#567D46" -/obj/item/storage/box/gum/wake_up - name = "\improper Activin 12 Hour medicated gum packet" - desc = "Stay awake during long shifts in the maintenance tunnels with Activin! The approval seal of the Mothic Nomad Fleet \ - is emblazoned on the packaging, alongside a litany of health and safety disclaimers in both Mothic and Galactic Common." - icon_state = "bubblegum_wake_up" - custom_premium_price = PAYCHECK_CREW * 1.5 - -/obj/item/storage/box/gum/wake_up/examine_more(mob/user) - . = ..() - . += span_notice("You read some of the health and safety information...") - . += "\t[span_info("For the relief of tiredness and drowsiness while working.")]" - . += "\t[span_info("Do not chew more than one strip every 12 hours. Do not use as a complete substitute for sleep.")]" - . += "\t[span_info("Do not give to children under 16. Do not exceed the maximum dosage. Do not ingest. Do not take for more than 3 days consecutively. Do not take in conjunction with other medication. May cause adverse reactions in patients with pre-existing heart conditions.")]" - . += "\t[span_info("Side effects of Activin use may include twitchy antennae, overactive wings, loss of keratin sheen, loss of setae coverage, arrythmia, blurred vision, and euphoria. Cease taking the medication if side effects occur.")]" - . += "\t[span_info("Repeated use may cause addiction.")]" - . += "\t[span_info("If the maximum dosage is exceeded, inform a member of your assigned vessel's medical staff immediately. Do not induce vomiting.")]" - . += "\t[span_info("Ingredients: each strip contains 500mg of Activin (dextro-methamphetamine). Other ingredients include Green Dye 450 (Verdant Meadow) and artificial herb flavouring.")]" - . += "\t[span_info("Storage: keep in a cool dry place. Do not use after the use-by date: 32/4/350.")]" - return . - -/obj/item/storage/box/gum/wake_up/PopulateContents() - for(var/i in 1 to 4) - new/obj/item/food/bubblegum/wake_up(src) - /obj/item/food/spacers_sidekick name = "\improper Spacer's Sidekick mints" desc = "Spacer's Sidekick: Breathe easy with a friend at your side!" diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm index c28f5acb66b..9d333e6332f 100644 --- a/code/game/objects/items/pinpointer.dm +++ b/code/game/objects/items/pinpointer.dm @@ -190,16 +190,6 @@ . += "Its pair is being held by [mob_holder]." return -/obj/item/storage/box/pinpointer_pairs - name = "pinpointer pair box" - -/obj/item/storage/box/pinpointer_pairs/PopulateContents() - var/obj/item/pinpointer/pair/A = new(src) - var/obj/item/pinpointer/pair/B = new(src) - - A.other_pair = B - B.other_pair = A - /obj/item/pinpointer/shuttle name = "bounty shuttle pinpointer" desc = "A handheld tracking device that locates the bounty hunter shuttle for quick escapes." diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index 582c209102b..95746907440 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -411,18 +411,6 @@ /obj/item/clothing/shoes/plate/blue icon_state = "crusader-blue" -/obj/item/storage/box/itemset/crusader/blue/PopulateContents() - new /obj/item/clothing/suit/chaplainsuit/armor/crusader/blue(src) - new /obj/item/clothing/head/helmet/plate/crusader/blue(src) - new /obj/item/clothing/gloves/plate/blue(src) - new /obj/item/clothing/shoes/plate/blue(src) - -/obj/item/storage/box/itemset/crusader/red/PopulateContents() - new /obj/item/clothing/suit/chaplainsuit/armor/crusader/red(src) - new /obj/item/clothing/head/helmet/plate/crusader/red(src) - new /obj/item/clothing/gloves/plate/red(src) - new /obj/item/clothing/shoes/plate/red(src) - /obj/item/claymore/weak desc = "This one is rusted." force = 24 diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index ea5844ecad0..16da3fddbbc 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -406,417 +406,8 @@ /obj/item/storage/backpack/satchel/flat/empty/PopulateContents() return -/obj/item/storage/backpack/duffelbag - name = "duffel bag" - desc = "A large duffel bag for holding extra things." - icon_state = "duffel" - inhand_icon_state = "duffel" - actions_types = list(/datum/action/item_action/zipper) - action_slots = ALL - storage_type = /datum/storage/duffel - // How much to slow you down if your bag isn't zipped up - var/zip_slowdown = 1 - /// If this bag is zipped (contents hidden) up or not - /// Starts enabled so you're forced to interact with it to "get" it - var/zipped_up = TRUE - // How much time it takes to zip up (close) the duffelbag - var/zip_up_duration = 0.5 SECONDS - // Audio played during zipup - var/zip_up_sfx = 'sound/items/zip/zip_up.ogg' - // How much time it takes to unzip the duffel - var/unzip_duration = 2.1 SECONDS - // Audio played during unzip - var/unzip_sfx = 'sound/items/zip/un_zip.ogg' - -/obj/item/storage/backpack/duffelbag/Initialize(mapload) - . = ..() - set_zipper(TRUE) - -/obj/item/storage/backpack/duffelbag/update_desc(updates) - . = ..() - desc = "[initial(desc)]
[zipped_up ? "It's zipped up, preventing you from accessing its contents." : "It's unzipped, and harder to move in."]" - -/obj/item/storage/backpack/duffelbag/attack_self(mob/user, modifiers) - if(loc != user) // God fuck TK - return ..() - if(zipped_up) - return attack_hand(user, modifiers) - else - return attack_hand_secondary(user, modifiers) - -/obj/item/storage/backpack/duffelbag/attack_self_secondary(mob/user, modifiers) - attack_self(user, modifiers) - return ..() - -// If we're zipped, click to unzip -/obj/item/storage/backpack/duffelbag/attack_hand(mob/user, list/modifiers) - if(loc != user) - // Hacky, but please don't be cringe yeah? - atom_storage.silent = TRUE - . = ..() - atom_storage.silent = initial(atom_storage.silent) - return - if(!zipped_up) - return ..() - - balloon_alert(user, "unzipping...") - playsound(src, unzip_sfx, 100, FALSE) - var/datum/callback/can_unzip = CALLBACK(src, PROC_REF(zipper_matches), TRUE) - if(!do_after(user, unzip_duration, src, extra_checks = can_unzip)) - user.balloon_alert(user, "unzip failed!") - return - balloon_alert(user, "unzipped") - set_zipper(FALSE) - return TRUE - -// Vis versa -/obj/item/storage/backpack/duffelbag/attack_hand_secondary(mob/user, list/modifiers) - if(loc != user) - return ..() - if(zipped_up) - return SECONDARY_ATTACK_CALL_NORMAL - - balloon_alert(user, "zipping...") - playsound(src, zip_up_sfx, 100, FALSE) - var/datum/callback/can_zip = CALLBACK(src, PROC_REF(zipper_matches), FALSE) - if(!do_after(user, zip_up_duration, src, extra_checks = can_zip)) - user.balloon_alert(user, "zip failed!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - balloon_alert(user, "zipped") - set_zipper(TRUE) - return SECONDARY_ATTACK_CONTINUE_CHAIN - -/// Checks to see if the zipper matches the passed in state -/// Returns true if so, false otherwise -/obj/item/storage/backpack/duffelbag/proc/zipper_matches(matching_value) - return zipped_up == matching_value - -/obj/item/storage/backpack/duffelbag/proc/set_zipper(new_zip) - zipped_up = new_zip - SEND_SIGNAL(src, COMSIG_DUFFEL_ZIP_CHANGE, new_zip) - if(zipped_up) - slowdown = initial(slowdown) - atom_storage.set_locked(STORAGE_SOFT_LOCKED) - atom_storage.display_contents = FALSE - else - slowdown = zip_slowdown - atom_storage.set_locked(STORAGE_NOT_LOCKED) - atom_storage.display_contents = TRUE - - if(isliving(loc)) - var/mob/living/wearer = loc - wearer.update_equipment_speed_mods() - -/obj/item/storage/backpack/duffelbag/cursed - name = "living duffel bag" - desc = "A cursed clown duffel bag that hungers for food of any kind. A warning label suggests that it eats food inside. \ - If that food happens to be a horribly ruined mess or the chef scrapped out of the microwave, or poisoned in some way, \ - then it might have negative effects on the bag..." - icon_state = "duffel-curse" - inhand_icon_state = "duffel-curse" - zip_slowdown = 2 - max_integrity = 100 - -/obj/item/storage/backpack/duffelbag/cursed/Initialize(mapload) - . = ..() - AddComponent(/datum/component/curse_of_hunger, add_dropdel = TRUE) - -/obj/item/storage/backpack/duffelbag/captain - name = "captain's duffel bag" - desc = "A large duffel bag for holding extra captainly goods." - icon_state = "duffel-captain" - inhand_icon_state = "duffel-captain" - -/obj/item/storage/backpack/duffelbag/med - name = "medical duffel bag" - desc = "A large duffel bag for holding extra medical supplies." - icon_state = "duffel-medical" - inhand_icon_state = "duffel-med" - -/obj/item/storage/backpack/duffelbag/coroner - name = "coroner duffel bag" - desc = "A large duffel bag for holding large amounts of organs at once." - icon_state = "duffel-coroner" - inhand_icon_state = "duffel-coroner" - -/obj/item/storage/backpack/duffelbag/explorer - name = "explorer duffel bag" - desc = "A large duffel bag for holding extra exotic treasures." - icon_state = "duffel-explorer" - inhand_icon_state = "duffel-explorer" - -/obj/item/storage/backpack/duffelbag/hydroponics - name = "hydroponic's duffel bag" - desc = "A large duffel bag for holding extra gardening tools." - icon_state = "duffel-hydroponics" - inhand_icon_state = "duffel-hydroponics" - -/obj/item/storage/backpack/duffelbag/chemistry - name = "chemistry duffel bag" - desc = "A large duffel bag for holding extra chemical substances." - icon_state = "duffel-chemistry" - inhand_icon_state = "duffel-chemistry" - -/obj/item/storage/backpack/duffelbag/genetics - name = "geneticist's duffel bag" - desc = "A large duffel bag for holding extra genetic mutations." - icon_state = "duffel-genetics" - inhand_icon_state = "duffel-genetics" - -/obj/item/storage/backpack/duffelbag/science - name = "scientist's duffel bag" - desc = "A large duffel bag for holding extra scientific components." - icon_state = "duffel-science" - inhand_icon_state = "duffel-sci" - -/obj/item/storage/backpack/duffelbag/virology - name = "virologist's duffel bag" - desc = "A large duffel bag for holding extra viral bottles." - icon_state = "duffel-virology" - inhand_icon_state = "duffel-virology" - -/obj/item/storage/backpack/duffelbag/sec - name = "security duffel bag" - desc = "A large duffel bag for holding extra security supplies and ammunition." - icon_state = "duffel-security" - inhand_icon_state = "duffel-sec" - -/obj/item/storage/backpack/duffelbag/sec/surgery - name = "surgical duffel bag" - desc = "A large duffel bag for holding extra supplies - this one has a material inlay with space for various sharp-looking tools." - -/obj/item/storage/backpack/duffelbag/sec/surgery/PopulateContents() - new /obj/item/scalpel(src) - new /obj/item/hemostat(src) - new /obj/item/retractor(src) - new /obj/item/circular_saw(src) - new /obj/item/bonesetter(src) - new /obj/item/surgicaldrill(src) - new /obj/item/cautery(src) - new /obj/item/surgical_drapes(src) - new /obj/item/clothing/suit/toggle/labcoat/hospitalgown(src) //SKYRAT EDIT ADDITION - new /obj/item/clothing/mask/surgical(src) - new /obj/item/blood_filter(src) - -/obj/item/storage/backpack/duffelbag/engineering - name = "industrial duffel bag" - desc = "A large duffel bag for holding extra tools and supplies." - icon_state = "duffel-engineering" - inhand_icon_state = "duffel-eng" - resistance_flags = FIRE_PROOF - -/obj/item/storage/backpack/duffelbag/drone - name = "drone duffel bag" - desc = "A large duffel bag for holding tools and hats." - icon_state = "duffel-drone" - inhand_icon_state = "duffel-drone" - resistance_flags = FIRE_PROOF - -/obj/item/storage/backpack/duffelbag/drone/PopulateContents() - new /obj/item/screwdriver(src) - new /obj/item/wrench(src) - new /obj/item/weldingtool(src) - new /obj/item/crowbar(src) - new /obj/item/stack/cable_coil(src) - new /obj/item/wirecutters(src) - new /obj/item/multitool(src) - -/obj/item/storage/backpack/duffelbag/clown - name = "clown's duffel bag" - desc = "A large duffel bag for holding lots of funny gags!" - icon_state = "duffel-clown" - inhand_icon_state = "duffel-clown" - -/obj/item/storage/backpack/duffelbag/clown/cream_pie/PopulateContents() - for(var/i in 1 to 10) - new /obj/item/food/pie/cream(src) - -/obj/item/storage/backpack/fireproof - resistance_flags = FIRE_PROOF - -/obj/item/storage/backpack/duffelbag/syndie - name = "suspicious looking duffel bag" - desc = "A large duffel bag for holding extra tactical supplies. It contains an oiled plastitanium zipper for maximum speed tactical zipping, and is better balanced on your back than an average duffelbag. Can hold two bulky items!" - icon_state = "duffel-syndie" - inhand_icon_state = "duffel-syndieammo" - storage_type = /datum/storage/duffel/syndicate - resistance_flags = FIRE_PROOF - // Less slowdown while unzipped. Still bulky, but it won't halve your movement speed in an active combat situation. - zip_slowdown = 0.3 - // Faster unzipping. Utilizes the same noise as zipping up to fit the unzip duration. - unzip_duration = 0.5 SECONDS - unzip_sfx = 'sound/items/zip/zip_up.ogg' - -//SKYRAT EDIT CHANGE START - It's just a black duffel. -/obj/item/storage/backpack/duffelbag/syndie - name = "tactical duffel bag" - desc = "A large duffel bag for holding extra tactical supplies." - special_desc_requirement = EXAMINE_CHECK_SYNDICATE - special_desc = "This duffel bag has the Syndicate logo stiched on the inside. It appears to be made from lighter yet sturdier materials, and features an oiled plastitanium zipper for maximum speed tactical zipping." -//SKYRAT EDIT CHANGE END - -/obj/item/storage/backpack/duffelbag/syndie/hitman - desc = "A large duffel bag for holding extra things. There is a Nanotrasen logo on the back." - icon_state = "duffel-syndieammo" - inhand_icon_state = "duffel-syndieammo" - -/obj/item/storage/backpack/duffelbag/syndie/hitman/PopulateContents() - new /obj/item/clothing/under/costume/buttondown/slacks/service(src) - new /obj/item/clothing/neck/tie/red/hitman(src) - new /obj/item/clothing/accessory/waistcoat(src) - new /obj/item/clothing/suit/toggle/lawyer/black(src) - new /obj/item/clothing/shoes/laceup(src) - new /obj/item/clothing/gloves/color/black(src) - new /obj/item/clothing/glasses/sunglasses(src) - new /obj/item/clothing/head/fedora(src) - -/obj/item/storage/backpack/duffelbag/syndie/med - name = "medical duffel bag" - desc = "A large duffel bag for holding extra tactical medical supplies." - icon_state = "duffel-syndiemed" - inhand_icon_state = "duffel-syndiemed" - -/obj/item/storage/backpack/duffelbag/syndie/surgery - name = "surgery duffel bag" - desc = "A large duffel bag for holding extra supplies - this one has a material inlay with space for various sharp-looking tools." //SKYRAT EDIT CHANGE, to match the security surgery bag - icon_state = "duffel-syndiemed" - inhand_icon_state = "duffel-syndiemed" - special_desc_requirement = EXAMINE_CHECK_SYNDICATE // SKYRAT EDIT ADDITION - special_desc = "This duffel bag has the Syndicate logo stiched on the inside. It appears to be made from lighter yet sturdier materials." // SKYRAT EDIT ADDITION - -/obj/item/storage/backpack/duffelbag/syndie/surgery/PopulateContents() - new /obj/item/scalpel/advanced(src) - new /obj/item/retractor/advanced(src) - new /obj/item/cautery/advanced(src) - new /obj/item/surgical_drapes(src) - new /obj/item/reagent_containers/medigel/sterilizine(src) - new /obj/item/bonesetter(src) - new /obj/item/blood_filter(src) - new /obj/item/stack/medical/bone_gel(src) - new /obj/item/stack/sticky_tape/surgical(src) - new /obj/item/emergency_bed(src) - new /obj/item/clothing/suit/jacket/straight_jacket(src) - new /obj/item/clothing/mask/muzzle(src) - new /obj/item/mmi/syndie(src) - -/obj/item/storage/backpack/duffelbag/syndie/ammo - name = "ammunition duffel bag" - desc = "A large duffel bag for holding extra weapons ammunition and supplies." - icon_state = "duffel-syndieammo" - inhand_icon_state = "duffel-syndieammo" - -/obj/item/storage/backpack/duffelbag/syndie/ammo/mech - desc = "A large duffel bag, packed to the brim with various exosuit ammo." - -/obj/item/storage/backpack/duffelbag/syndie/ammo/mech/PopulateContents() - new /obj/item/mecha_ammo/scattershot(src) - new /obj/item/mecha_ammo/scattershot(src) - new /obj/item/mecha_ammo/scattershot(src) - new /obj/item/mecha_ammo/scattershot(src) - new /obj/item/storage/belt/utility/syndicate(src) - -/obj/item/storage/backpack/duffelbag/syndie/ammo/mauler - desc = "A large duffel bag, packed to the brim with various exosuit ammo." - -/obj/item/storage/backpack/duffelbag/syndie/ammo/mauler/PopulateContents() - new /obj/item/mecha_ammo/lmg(src) - new /obj/item/mecha_ammo/lmg(src) - new /obj/item/mecha_ammo/lmg(src) - new /obj/item/mecha_ammo/scattershot(src) - new /obj/item/mecha_ammo/scattershot(src) - new /obj/item/mecha_ammo/scattershot(src) - new /obj/item/mecha_ammo/missiles_srm(src) - new /obj/item/mecha_ammo/missiles_srm(src) - new /obj/item/mecha_ammo/missiles_srm(src) - -/obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle - desc = "A large duffel bag containing a medical equipment, a Donksoft LMG, a big jumbo box of riot darts, and a magboot MODsuit module." - -/obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle/PopulateContents() - new /obj/item/mod/module/magboot(src) - new /obj/item/storage/medkit/tactical/premium(src) - new /obj/item/gun/ballistic/automatic/l6_saw/toy(src) - new /obj/item/ammo_box/foambox/riot(src) - -/obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle - desc = "A large duffel bag containing deadly chemicals, a handheld chem sprayer, Bioterror foam grenade, a Donksoft assault rifle, box of riot grade darts, a dart pistol, and a box of syringes." - -/obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle/PopulateContents() - new /obj/item/reagent_containers/spray/chemsprayer/bioterror(src) - new /obj/item/storage/box/syndie_kit/chemical(src) - new /obj/item/gun/syringe/syndicate(src) - new /obj/item/gun/ballistic/automatic/c20r/toy(src) - new /obj/item/storage/box/syringes(src) - new /obj/item/ammo_box/foambox/riot(src) - new /obj/item/grenade/chem_grenade/bioterrorfoam(src) - if(prob(5)) - new /obj/item/food/pizza/pineapple(src) - -/obj/item/storage/backpack/duffelbag/syndie/c4/PopulateContents() - for(var/i in 1 to 10) - new /obj/item/grenade/c4(src) - -/obj/item/storage/backpack/duffelbag/syndie/x4/PopulateContents() - for(var/i in 1 to 3) - new /obj/item/grenade/c4/x4(src) - -/obj/item/storage/backpack/duffelbag/syndie/firestarter - desc = "A large duffel bag containing a New Russian pyro backpack sprayer, Elite MODsuit, a Stechkin APS pistol, minibomb, ammo, and other equipment." - -/obj/item/storage/backpack/duffelbag/syndie/firestarter/PopulateContents() - new /obj/item/clothing/under/syndicate/soviet(src) - new /obj/item/mod/control/pre_equipped/elite/flamethrower(src) - new /obj/item/gun/ballistic/automatic/pistol/aps(src) - new /obj/item/ammo_box/magazine/m9mm_aps/fire(src) - new /obj/item/ammo_box/magazine/m9mm_aps/fire(src) - new /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka(src) - new /obj/item/reagent_containers/hypospray/medipen/stimulants(src) - new /obj/item/grenade/syndieminibomb(src) - -// For ClownOps. -/obj/item/storage/backpack/duffelbag/clown/syndie - storage_type = /datum/storage/duffel/syndicate - -/obj/item/storage/backpack/duffelbag/clown/syndie/PopulateContents() - new /obj/item/modular_computer/pda/clown(src) - new /obj/item/clothing/under/rank/civilian/clown(src) - new /obj/item/clothing/shoes/clown_shoes(src) - new /obj/item/clothing/mask/gas/clown_hat(src) - new /obj/item/bikehorn(src) - new /obj/item/implanter/sad_trombone(src) - -/obj/item/storage/backpack/henchmen - name = "wings" - desc = "Granted to the henchmen who deserve it. This probably doesn't include you." - icon_state = "henchmen" - inhand_icon_state = null - -/obj/item/storage/backpack/duffelbag/cops - name = "police bag" - desc = "A large duffel bag for holding extra police gear." - -/obj/item/storage/backpack/duffelbag/mining_conscript - name = "mining conscription kit" - desc = "A duffel bag containing everything a crewmember needs to support a shaft miner in the field." - icon_state = "duffel-explorer" - inhand_icon_state = "duffel-explorer" - -/obj/item/storage/backpack/duffelbag/mining_conscript/PopulateContents() - new /obj/item/clothing/glasses/meson(src) - new /obj/item/t_scanner/adv_mining_scanner/lesser(src) - new /obj/item/storage/bag/ore(src) - new /obj/item/clothing/suit/hooded/explorer(src) - new /obj/item/encryptionkey/headset_mining(src) - new /obj/item/clothing/mask/gas/explorer(src) - new /obj/item/card/id/advanced/mining(src) - new /obj/item/gun/energy/recharge/kinetic_accelerator(src) - new /obj/item/knife/combat/survival(src) - new /obj/item/flashlight/seclite(src) - -/* - * Messenger Bag Types - */ +/// Messenger Bag Types /obj/item/storage/backpack/messenger name = "messenger bag" desc = "A trendy looking messenger bag; sometimes known as a courier bag. Fashionable and portable." diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index 2dcdc81af9b..00da00b89d1 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -23,9 +23,6 @@ w_class = WEIGHT_CLASS_BULKY storage_type = /datum/storage/bag -// ----------------------------- -// Trash bag -// ----------------------------- /obj/item/storage/bag/trash name = "trash bag" desc = "It's the heavy-duty black polymer kind. Time to take out the trash!" @@ -97,10 +94,6 @@ /obj/item/storage/bag/trash/bluespace/cyborg insertable = FALSE -// ----------------------------- -// Mining Satchel -// ----------------------------- - /obj/item/storage/bag/ore name = "mining satchel" desc = "This little bugger can be used to store and transport ores." @@ -196,10 +189,6 @@ icon_state = "satchel_bspace" storage_type = /datum/storage/bag/ore/holding -// ----------------------------- -// Plant bag -// ----------------------------- - /obj/item/storage/bag/plants name = "plant bag" icon = 'icons/obj/service/hydroponics/equipment.dmi' @@ -227,7 +216,6 @@ context[SCREENTIP_CONTEXT_CTRL_LMB] = "Make seeds" return CONTEXTUAL_SCREENTIP_SET - /obj/item/storage/bag/plants/portaseeder/examine(mob/user) . = ..() . += span_notice("Ctrl-click to activate seed extraction.") @@ -240,11 +228,6 @@ /obj/item/storage/bag/plants/cyborg name = "cyborg plant bag" -// ----------------------------- -// Sheet Snatcher -// ----------------------------- -// sorry sayu your sheet snatcher is now OBSOLETE but i'm leaving it because idc - /obj/item/storage/bag/sheetsnatcher name = "sheet snatcher" desc = "A patented Nanotrasen storage system designed for any kind of mineral sheet." @@ -253,20 +236,11 @@ worn_icon_state = "satchel" storage_type = /datum/storage/bag/sheet_snatcher -// ----------------------------- -// Sheet Snatcher (Cyborg) -// ----------------------------- - /obj/item/storage/bag/sheetsnatcher/borg name = "sheet snatcher 9000" desc = "" storage_type = /datum/storage/bag/sheet_snatcher/borg - -// ----------------------------- -// Sheet Snatcher (Debug) -// ----------------------------- - /obj/item/storage/bag/sheetsnatcher/debug name = "sheet snatcher EXTREME EDITION" desc = "A Nanotrasen storage system designed which has been given post-market alterations to hold any type of sheet. Comes pre-populated with " @@ -306,10 +280,6 @@ var/amt = items_inside[stack_type] new stack_type(src, amt, FALSE) -// ----------------------------- -// Book bag -// ----------------------------- - /obj/item/storage/bag/books name = "book bag" desc = "A bag for books." @@ -319,9 +289,6 @@ resistance_flags = FLAMMABLE storage_type = /datum/storage/bag/books -/* - * Trays - Agouri - */ /obj/item/storage/bag/tray name = "serving tray" icon = 'icons/obj/food/containers.dmi' @@ -392,10 +359,6 @@ icon_state = "foodtray" desc = "A cheap metal tray to pile today's meal onto." -/* - * Chemistry bag - */ - /obj/item/storage/bag/chemistry name = "chemistry bag" icon = 'icons/obj/medical/chemical.dmi' @@ -405,6 +368,39 @@ resistance_flags = FLAMMABLE storage_type = /datum/storage/bag/chemistry +/obj/item/storage/bag/money + name = "money bag" + desc = "A bag for storing your profits." + icon_state = "moneybag" + worn_icon_state = "moneybag" + force = 10 + throwforce = 0 + resistance_flags = FLAMMABLE + max_integrity = 100 + w_class = WEIGHT_CLASS_BULKY + storage_type = /datum/storage/bag/money + +/obj/item/storage/bag/money/Initialize(mapload) + . = ..() + if(prob(20)) + icon_state = "moneybagalt" + +/obj/item/storage/bag/money/vault/PopulateContents() + new /obj/item/coin/silver(src) + new /obj/item/coin/silver(src) + new /obj/item/coin/silver(src) + new /obj/item/coin/silver(src) + new /obj/item/coin/gold(src) + new /obj/item/coin/gold(src) + new /obj/item/coin/adamantine(src) + +///Used in the dutchmen pirate shuttle. +/obj/item/storage/bag/money/dutchmen/PopulateContents() + for(var/iteration in 1 to 9) + new /obj/item/coin/silver/doubloon(src) + for(var/iteration in 1 to 9) + new /obj/item/coin/gold/doubloon(src) + new /obj/item/coin/adamantine/doubloon(src) /obj/item/storage/bag/bio name = "bio bag" @@ -415,10 +411,6 @@ resistance_flags = FLAMMABLE storage_type = /datum/storage/bag/bio -/* - * Science bag (mostly for xenobiologists) - */ - /obj/item/storage/bag/xeno name = "science bag" icon = 'icons/obj/medical/chemical.dmi' @@ -428,10 +420,6 @@ resistance_flags = FLAMMABLE storage_type = /datum/storage/bag/xeno -/* - * Construction bag (for engineering, holds stock parts and electronics) - */ - /obj/item/storage/bag/construction name = "construction bag" icon = 'icons/obj/tools.dmi' @@ -521,4 +509,46 @@ var/obj/item/ammo_casing/rebar/ammo_to_load = contents[1] held_crossbow.attackby(ammo_to_load, user) +/obj/item/storage/bag/quiver + name = "quiver" + desc = "Holds arrows for your bow. Good, because while pocketing arrows is possible, it surely can't be pleasant." + icon = 'icons/obj/weapons/bows/quivers.dmi' + icon_state = "quiver" + inhand_icon_state = null + worn_icon_state = "harpoon_quiver" + storage_type = /datum/storage/bag/quiver + + /// type of arrow the quivel should hold + var/arrow_path = /obj/item/ammo_casing/arrow + +/obj/item/storage/bag/quiver/lesser + storage_type = /datum/storage/bag/quiver/less + +/obj/item/storage/bag/quiver/full/PopulateContents() + . = ..() + for(var/i in 1 to 10) + new arrow_path(src) + +/obj/item/storage/bag/quiver/holy + name = "divine quiver" + desc = "Holds arrows for your divine bow, where they wait to find their target." + icon_state = "holyquiver" + inhand_icon_state = "holyquiver" + worn_icon_state = "holyquiver" + arrow_path = /obj/item/ammo_casing/arrow/holy + +/obj/item/storage/bag/quiver/holy/PopulateContents() + . = ..() + for(var/i in 1 to 10) + new arrow_path(src) + +/obj/item/storage/bag/quiver/endless + name = "endless quiver" + desc = "Holds arrows for your bow. A deep digital void is contained within." + storage_type = /datum/storage/bag/quiver/endless + +/obj/item/storage/bag/quiver/endless/PopulateContents() + . = ..() + new arrow_path(src) + #undef ORE_BAG_BALOON_COOLDOWN diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 360680091e3..83cb65406ce 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -587,6 +587,19 @@ inhand_icon_state = null worn_icon_state = "cummerbund" +/obj/item/storage/belt/fannypack/yellow/bee_terrorist/PopulateContents() + new /obj/item/grenade/c4 (src) + new /obj/item/reagent_containers/applicator/pill/cyanide(src) + new /obj/item/grenade/chem_grenade/facid(src) + +/obj/item/storage/belt/fannypack/black/rogue + name = "fannypack of ULTIMATE DESPAIR" + +/obj/item/storage/belt/fannypack/black/rogue/PopulateContents() + new /obj/item/food/drug/saturnx(src) + new /obj/item/reagent_containers/cup/blastoff_ampoule(src) + new /obj/item/reagent_containers/hypospray/medipen/methamphetamine(src) + /obj/item/storage/belt/sabre name = "sabre sheath" desc = "An ornate sheath designed to hold an officer's blade." diff --git a/code/game/objects/items/storage/boxes/_boxes.dm b/code/game/objects/items/storage/boxes/_boxes.dm index a898474a8cd..ab29439da50 100644 --- a/code/game/objects/items/storage/boxes/_boxes.dm +++ b/code/game/objects/items/storage/boxes/_boxes.dm @@ -10,11 +10,12 @@ resistance_flags = FLAMMABLE drop_sound = 'sound/items/handling/cardboard_box/cardboardbox_drop.ogg' pickup_sound = 'sound/items/handling/cardboard_box/cardboardbox_pickup.ogg' + storage_type = /datum/storage/box + /// What material do we get when we fold this box? var/foldable_result = /obj/item/stack/sheet/cardboard /// What drawing will we get on the face of the box? var/illustration = "writing" - storage_type = /datum/storage/box /obj/item/storage/box/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/storage/boxes/clothes_boxes.dm b/code/game/objects/items/storage/boxes/clothes_boxes.dm index 45e49e6adf3..4da6c3cb6dc 100644 --- a/code/game/objects/items/storage/boxes/clothes_boxes.dm +++ b/code/game/objects/items/storage/boxes/clothes_boxes.dm @@ -27,6 +27,18 @@ for(var/i in 1 to 7) new /obj/item/clothing/glasses/regular(src) +//it needs to be linked, hence a kit. +/obj/item/storage/box/rxglasses/spyglasskit + name = "spyglass kit" + desc = "this box contains cool nerd glasses; with built-in displays to view a linked camera." + +/obj/item/storage/box/rxglasses/spyglasskit/PopulateContents() + var/obj/item/clothing/accessory/spy_bug/newbug = new(src) + var/obj/item/clothing/glasses/sunglasses/spy/newglasses = new(src) + newbug.linked_glasses = newglasses + newglasses.linked_bug = newbug + new /obj/item/paper/fluff/nerddocs(src) + /obj/item/storage/box/tape_wizard name = "Tape Wizard - Episode 23" desc = "A box containing the costume used by legendary entertainment icon 'Super Tape Wizard'. It got a little stuck on its way out." @@ -242,6 +254,68 @@ var/obj/item/collar_bomb_button/button = new(src) new /obj/item/clothing/neck/collar_bomb(src, button) +/obj/item/storage/box/itemset/crusader/blue/PopulateContents() + new /obj/item/clothing/suit/chaplainsuit/armor/crusader/blue(src) + new /obj/item/clothing/head/helmet/plate/crusader/blue(src) + new /obj/item/clothing/gloves/plate/blue(src) + new /obj/item/clothing/shoes/plate/blue(src) + +/obj/item/storage/box/itemset/crusader/red/PopulateContents() + new /obj/item/clothing/suit/chaplainsuit/armor/crusader/red(src) + new /obj/item/clothing/head/helmet/plate/crusader/red(src) + new /obj/item/clothing/gloves/plate/red(src) + new /obj/item/clothing/shoes/plate/red(src) + +/obj/item/storage/box/wizard_kit + name = "Generic Wizard Cosplay Kit" + +/obj/item/storage/box/wizard_kit/PopulateContents() + new /obj/item/clothing/head/wizard(src) + new /obj/item/clothing/suit/wizrobe(src) + new /obj/item/clothing/shoes/sandal(src) + +/obj/item/storage/box/wizard_kit/red + name = "Evocation Wizard Cosplay Kit" + +/obj/item/storage/box/wizard_kit/red/PopulateContents() + new /obj/item/clothing/head/wizard/red(src) + new /obj/item/clothing/suit/wizrobe/red(src) + new /obj/item/clothing/shoes/sandal(src) + +/obj/item/storage/box/wizard_kit/yellow + name = "Translocation Wizard Cosplay Kit" + +/obj/item/storage/box/wizard_kit/yellow/PopulateContents() + new /obj/item/clothing/head/wizard/yellow(src) + new /obj/item/clothing/suit/wizrobe/yellow(src) + new /obj/item/clothing/shoes/sandal(src) + +/obj/item/storage/box/wizard_kit/magusred + name = "Conjuration Wizard Cosplay Kit" + +/obj/item/storage/box/wizard_kit/yellow/PopulateContents() + new /obj/item/clothing/head/wizard/magus(src) + new /obj/item/clothing/suit/wizrobe/magusred(src) + new /obj/item/clothing/shoes/sandal(src) + +/obj/item/storage/box/wizard_kit/magusblue + name = "Transmutation Wizard Cosplay Kit" + +/obj/item/storage/box/wizard_kit/yellow/PopulateContents() + new /obj/item/clothing/head/wizard/magus(src) + new /obj/item/clothing/suit/wizrobe/magusblue(src) + new /obj/item/clothing/shoes/sandal(src) + +/obj/item/storage/box/wizard_kit/black + name = "Necromancy Wizard Cosplay Kit" + +/obj/item/storage/box/wizard_kit/black/PopulateContents() + new /obj/item/clothing/head/wizard/black(src) + new /obj/item/clothing/suit/wizrobe/black(src) + new /obj/item/clothing/shoes/sandal(src) + +// BUBBER EDIT ADDITION BEGIN + /obj/item/storage/box/lewd_toys name = "lewd toys box" desc = "Contains lewd impliments for spending time alone, or together with someone! Try to hide it better next time." @@ -254,3 +328,5 @@ new /obj/item/clothing/mask/ballgag(src) new /obj/item/clothing/suit/straight_jacket/shackles(src) new /obj/item/clothing/glasses/blindfold/kinky(src) + +// BUBBER EDIT ADDITION END diff --git a/code/game/objects/items/storage/boxes/fishing_boxes.dm b/code/game/objects/items/storage/boxes/fishing_boxes.dm new file mode 100644 index 00000000000..82bfb1fb4dc --- /dev/null +++ b/code/game/objects/items/storage/boxes/fishing_boxes.dm @@ -0,0 +1,66 @@ +/obj/item/storage/box/fishing_hooks + name = "fishing hook set" + illustration = "fish" + custom_price = PAYCHECK_CREW * 2 + +/obj/item/storage/box/fishing_hooks/PopulateContents() + new /obj/item/fishing_hook/magnet(src) + new /obj/item/fishing_hook/shiny(src) + new /obj/item/fishing_hook/weighted(src) + +/obj/item/storage/box/fishing_hooks/master/PopulateContents() + . = ..() + new /obj/item/fishing_hook/stabilized(src) + new /obj/item/fishing_hook/jaws(src) + +/obj/item/storage/box/fishing_lines + name = "fishing line set" + illustration = "fish" + custom_price = PAYCHECK_CREW * 2 + +/obj/item/storage/box/fishing_lines/PopulateContents() + new /obj/item/fishing_line/bouncy(src) + new /obj/item/fishing_line/reinforced(src) + new /obj/item/fishing_line/cloaked(src) + +/obj/item/storage/box/fishing_lines/master/PopulateContents() + . = ..() + new /obj/item/fishing_line/auto_reel(src) + +///From the fishing mystery box. It's basically a lazarus and a few bottles of strange reagents. +/obj/item/storage/box/fish_revival_kit + name = "fish revival kit" + desc = "Become a fish doctor today. A label on the side indicates that fish require two to ten reagent units to be splashed onto them for revival, depending on size." + illustration = "fish" + +/obj/item/storage/box/fish_revival_kit/PopulateContents() + new /obj/item/lazarus_injector(src) + new /obj/item/reagent_containers/cup/bottle/fishy_reagent(src) + new /obj/item/reagent_containers/cup(src) //to splash the reagents on the fish. + new /obj/item/storage/fish_case(src) + new /obj/item/storage/fish_case(src) + +/obj/item/storage/box/fishing_lures + name = "fishing lures set" + desc = "A small tackle box containing all the fishing lures you will ever need to curb randomness." + icon_state = "plasticbox" + foldable_result = null + illustration = "fish" + custom_price = PAYCHECK_CREW * 9 + storage_type = /datum/storage/box/fishing_lures + +/obj/item/storage/box/fishing_lures/PopulateContents() + new /obj/item/paper/lures_instructions(src) + var/list/typesof = subtypesof(/obj/item/fishing_lure) + for(var/type in typesof) + new type (src) + +/obj/item/storage/box/aquarium_props + name = "aquarium props box" + desc = "All you need to make your aquarium look good." + illustration = "fish" + custom_price = PAYCHECK_LOWER + +/obj/item/storage/box/aquarium_props/PopulateContents() + for(var/prop_type in subtypesof(/obj/item/aquarium_prop)) + new prop_type(src) diff --git a/code/game/objects/items/storage/boxes/food_boxes.dm b/code/game/objects/items/storage/boxes/food_boxes.dm index cfcb1e5ec30..07ad1bdc79a 100644 --- a/code/game/objects/items/storage/boxes/food_boxes.dm +++ b/code/game/objects/items/storage/boxes/food_boxes.dm @@ -346,6 +346,30 @@ for(var/i in 1 to 4) new /obj/item/storage/bubblegum_wrapper(src, spawning_gum_type) +/obj/item/storage/box/gum/wake_up + name = "\improper Activin 12 Hour medicated gum packet" + desc = "Stay awake during long shifts in the maintenance tunnels with Activin! The approval seal of the Mothic Nomad Fleet \ + is emblazoned on the packaging, alongside a litany of health and safety disclaimers in both Mothic and Galactic Common." + icon_state = "bubblegum_wake_up" + custom_premium_price = PAYCHECK_CREW * 1.5 + +/obj/item/storage/box/gum/wake_up/examine_more(mob/user) + . = ..() + . += span_notice("You read some of the health and safety information...") + . += "\t[span_info("For the relief of tiredness and drowsiness while working.")]" + . += "\t[span_info("Do not chew more than one strip every 12 hours. Do not use as a complete substitute for sleep.")]" + . += "\t[span_info("Do not give to children under 16. Do not exceed the maximum dosage. Do not ingest. Do not take for more than 3 days consecutively. Do not take in conjunction with other medication. May cause adverse reactions in patients with pre-existing heart conditions.")]" + . += "\t[span_info("Side effects of Activin use may include twitchy antennae, overactive wings, loss of keratin sheen, loss of setae coverage, arrythmia, blurred vision, and euphoria. Cease taking the medication if side effects occur.")]" + . += "\t[span_info("Repeated use may cause addiction.")]" + . += "\t[span_info("If the maximum dosage is exceeded, inform a member of your assigned vessel's medical staff immediately. Do not induce vomiting.")]" + . += "\t[span_info("Ingredients: each strip contains 500mg of Activin (dextro-methamphetamine). Other ingredients include Green Dye 450 (Verdant Meadow) and artificial herb flavouring.")]" + . += "\t[span_info("Storage: keep in a cool dry place. Do not use after the use-by date: 32/4/350.")]" + return . + +/obj/item/storage/box/gum/wake_up/PopulateContents() + for(var/i in 1 to 4) + new/obj/item/food/bubblegum/wake_up(src) + /obj/item/storage/bubblegum_wrapper name = "bubblegum wrapper" icon = 'icons/obj/food/food.dmi' diff --git a/code/game/objects/items/storage/boxes/implant_boxes.dm b/code/game/objects/items/storage/boxes/implant_boxes.dm index 1da12ba3285..b0961f881e3 100644 --- a/code/game/objects/items/storage/boxes/implant_boxes.dm +++ b/code/game/objects/items/storage/boxes/implant_boxes.dm @@ -80,3 +80,14 @@ /obj/item/implantpad = 1, ) generate_items_inside(items_inside,src) + +//BOX O' IMPLANTS +/obj/item/storage/box/cyber_implants + name = "boxed cybernetic implants" + desc = "A sleek, sturdy box." + icon_state = "cyber_implants" + +/obj/item/storage/box/cyber_implants/PopulateContents() + new /obj/item/autosurgeon/syndicate/xray_eyes(src) + new /obj/item/autosurgeon/syndicate/anti_stun(src) + new /obj/item/autosurgeon/syndicate/reviver(src) diff --git a/code/game/objects/items/storage/boxes/job_boxes.dm b/code/game/objects/items/storage/boxes/job_boxes.dm index 5bfc50dbe22..1d703260981 100644 --- a/code/game/objects/items/storage/boxes/job_boxes.dm +++ b/code/game/objects/items/storage/boxes/job_boxes.dm @@ -317,3 +317,12 @@ /obj/item/storage/box/skillchips/engineering/PopulateContents() new/obj/item/skillchip/job/engineer(src) new/obj/item/skillchip/job/engineer(src) + +/obj/item/storage/box/contractor/fulton_extraction + name = "Fulton Extraction Kit" + icon_state = "syndiebox" + illustration = "writing_syndie" + +/obj/item/storage/box/contractor/fulton_extraction/PopulateContents() + new /obj/item/extraction_pack/syndicate(src) + new /obj/item/fulton_core(src) diff --git a/code/game/objects/items/storage/boxes/misc.dm b/code/game/objects/items/storage/boxes/misc.dm new file mode 100644 index 00000000000..bc9305f72bf --- /dev/null +++ b/code/game/objects/items/storage/boxes/misc.dm @@ -0,0 +1,58 @@ +/obj/item/storage/box/syndie_kit/syndicate_teleporter + name = "syndicate teleporter kit" + +/obj/item/storage/box/syndie_kit/syndicate_teleporter/PopulateContents() + new /obj/item/syndicate_teleporter(src) + new /obj/item/paper/syndicate_teleporter(src) + +/obj/item/storage/box/alchemist_basic_chems + name = "box of alchemical bases" + desc = "Contains a set of basic reagents, for all your potion-making needs! If only you labeled them." + illustration = "beaker" + +/obj/item/storage/box/alchemist_basic_chems/PopulateContents() + for(var/i in 1 to 7) + if(prob(1)) + new /obj/item/reagent_containers/cup/glass/coffee(src) + continue + new /obj/item/reagent_containers/cup/bottle/alchemist_basic(src) + +/obj/item/storage/box/alchemist_random_chems + name = "box of potions" + desc = "An especially fancy box to keep your finished potions safe." + icon_state = "syndiebox" + illustration = "beaker" + +/obj/item/storage/box/alchemist_random_chems/PopulateContents() + for(var/i in 1 to 7) + if(prob(1)) + new /obj/item/reagent_containers/cup/glass/coffee(src) + continue + new /obj/item/reagent_containers/cup/bottle/alchemist_random(src) + +/obj/item/storage/box/alchemist_chemistry_kit + name = "box of alchemy tools" + desc = "Contains everything needed for the up and coming chemistry student to enact hazardous chemical mishaps in the comfort of their own home." + +/obj/item/storage/box/alchemist_chemistry_kit/PopulateContents() + new /obj/item/reagent_containers/cup/mortar(src) + new /obj/item/pestle(src) + new /obj/item/lighter/skull(src) + new /obj/item/ph_booklet(src) + new /obj/item/thermometer(src) + new /obj/item/storage/test_tube_rack/full(src) + new /obj/item/reagent_containers/cup/glass/coffee(src) + + +/obj/item/storage/box/mechabeacons + name = "exosuit tracking beacons" + +/obj/item/storage/box/mechabeacons/PopulateContents() + ..() + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) diff --git a/code/game/objects/items/storage/boxes/security_boxes.dm b/code/game/objects/items/storage/boxes/security_boxes.dm index de18eb76258..4742921ecce 100644 --- a/code/game/objects/items/storage/boxes/security_boxes.dm +++ b/code/game/objects/items/storage/boxes/security_boxes.dm @@ -108,12 +108,19 @@ /obj/item/storage/box/firingpins/paywall name = "box of paywall firing pins" desc = "A box full of paywall firing pins, to allow newly-developed firearms to operate behind a custom-set paywall." - illustration = "firingpin" /obj/item/storage/box/firingpins/paywall/PopulateContents() for(var/i in 1 to 5) new /obj/item/firing_pin/paywall(src) +/obj/item/storage/box/firingpins/syndicate + name = "box of syndicate firing pins" + desc = "A box full of special syndicate firing pins which allow only syndicate operatives to use weapons with those firing pins." + +/obj/item/storage/box/firingpins/syndicate/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/firing_pin/implant/pindicate(src) + /obj/item/storage/box/lasertagpins name = "box of laser tag firing pins" desc = "A box full of laser tag firing pins, to allow newly-developed firearms to require wearing brightly coloured plastic armor before being able to be used." @@ -278,3 +285,11 @@ /obj/item/storage/box/sparklers/PopulateContents() for(var/i in 1 to 7) new/obj/item/sparkler(src) + +/obj/item/storage/box/evidence + name = "evidence bag box" + desc = "A box claiming to contain evidence bags." + +/obj/item/storage/box/evidence/PopulateContents() + for(var/i in 1 to 6) + new /obj/item/evidencebag(src) diff --git a/code/game/objects/items/storage/boxes/service_boxes.dm b/code/game/objects/items/storage/boxes/service_boxes.dm index 9adfc42da6e..d76cb25f14a 100644 --- a/code/game/objects/items/storage/boxes/service_boxes.dm +++ b/code/game/objects/items/storage/boxes/service_boxes.dm @@ -251,3 +251,46 @@ /obj/item/storage/box/stickers/googly/PopulateContents() for(var/i in 1 to 6) new /obj/item/sticker/googly(src) + +/// A box containing a skub, for easier carry because skub is a bulky item. +/obj/item/storage/box/stickers/skub + name = "skub fan pack" + desc = "A vinyl pouch to store your skub and pro-skub shirt in. A label on the back reads: \"Skubtide, Stationwide\"." + icon_state = "skubpack" + illustration = "label_skub" + w_class = WEIGHT_CLASS_SMALL + storage_type = /datum/storage/box/skub + +/obj/item/storage/box/stickers/skub/PopulateContents() + new /obj/item/skub(src) + new /obj/item/sticker/skub(src) + new /obj/item/sticker/skub(src) + +/obj/item/storage/box/stickers/anti_skub + name = "anti-skub stickers pack" + desc = "The enemy may have been given a skub and a shirt, but I've got more stickers! Plus the pack can hold my anti-skub shirt." + icon_state = "skubpack" + illustration = "label_anti_skub" + storage_type = /datum/storage/box/anti_skub + +/obj/item/storage/box/stickers/anti_skub/PopulateContents() + for(var/i in 1 to 4) + new /obj/item/sticker/anti_skub(src) + +/obj/item/storage/box/pinpointer_pairs + name = "pinpointer pair box" + +/obj/item/storage/box/pinpointer_pairs/PopulateContents() + var/obj/item/pinpointer/pair/A = new(src) + var/obj/item/pinpointer/pair/B = new(src) + + A.other_pair = B + B.other_pair = A + +/obj/item/storage/box/heretic_box + name = "box of pierced realities" + desc = "A box containing toys resembling pierced realities." + +/obj/item/storage/box/heretic_box/PopulateContents() + for(var/i in 1 to rand(1,4)) + new /obj/item/toy/reality_pierce(src) diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm index 649f89a7c35..dc710870c56 100644 --- a/code/game/objects/items/storage/briefcase.dm +++ b/code/game/objects/items/storage/briefcase.dm @@ -19,7 +19,7 @@ storage_type = /datum/storage/briefcase /// The path of the folder that gets spawned in New() - var/folder_path = /obj/item/folder + var/folder_path = /obj/item/folder /obj/item/storage/briefcase/PopulateContents() new /obj/item/pen(src) @@ -86,6 +86,17 @@ . = ..() AddComponent(/datum/component/lockable_storage) +/// Base container used for gimmick disks. +/obj/item/storage/briefcase/secure/digital_storage + name = "digi-case" + desc = "It's made of AUTHENTIC digital leather and has a price-tag still attached. Its owner must be a real professional." + icon_state = "secure" + base_icon_state = "secure" + inhand_icon_state = "sec-case" + +/obj/item/storage/briefcase/secure/digital_storage/PopulateContents() + return + ///Syndie variant of Secure Briefcase. Contains space cash, slightly more robust. /obj/item/storage/briefcase/secure/syndie force = 15 @@ -96,8 +107,6 @@ new /obj/item/stack/spacecash/c1000(src) /// A briefcase that contains various sought-after spoils -/obj/item/storage/briefcase/secure/riches - /obj/item/storage/briefcase/secure/riches/PopulateContents() new /obj/item/clothing/suit/armor/vest(src) new /obj/item/gun/ballistic/automatic/pistol(src) @@ -115,3 +124,43 @@ new /obj/item/pillow/random(src) new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/tank/internals/emergency_oxygen(src) + +//Briefcase item that contains the launchpad. +/obj/item/storage/briefcase/launchpad + var/obj/machinery/launchpad/briefcase/pad + +/obj/item/storage/briefcase/launchpad/Initialize(mapload) + pad = new(null, src) //spawns pad in nullspace to hide it from briefcase contents + . = ..() + +/obj/item/storage/briefcase/launchpad/Destroy() + if(!QDELETED(pad)) + qdel(pad) + pad = null + return ..() + +/obj/item/storage/briefcase/launchpad/PopulateContents() + new /obj/item/pen(src) + new /obj/item/launchpad_remote(src, pad) + +/obj/item/storage/briefcase/launchpad/attack_self(mob/user) + if(!isturf(user.loc)) //no setting up in a locker + return + add_fingerprint(user) + user.visible_message(span_notice("[user] starts setting down [src]..."), span_notice("You start setting up [pad]...")) + if(do_after(user, 3 SECONDS, target = user)) + pad.forceMove(get_turf(src)) + pad.update_indicator() + pad.closed = FALSE + user.transferItemToLoc(src, pad, TRUE) + atom_storage.close_all() + +/obj/item/storage/briefcase/launchpad/tool_act(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/launchpad_remote)) + return ..() + var/obj/item/launchpad_remote/remote = tool + if(remote.pad == WEAKREF(src.pad)) + return ..() + remote.pad = WEAKREF(src.pad) + to_chat(user, span_notice("You link [pad] to [remote].")) + return ITEM_INTERACT_BLOCKING diff --git a/code/game/objects/items/storage/dufflebags.dm b/code/game/objects/items/storage/dufflebags.dm new file mode 100644 index 00000000000..48ec7498c11 --- /dev/null +++ b/code/game/objects/items/storage/dufflebags.dm @@ -0,0 +1,406 @@ +/obj/item/storage/backpack/duffelbag + name = "duffel bag" + desc = "A large duffel bag for holding extra things." + icon_state = "duffel" + inhand_icon_state = "duffel" + actions_types = list(/datum/action/item_action/zipper) + action_slots = ALL + storage_type = /datum/storage/duffel + // How much to slow you down if your bag isn't zipped up + var/zip_slowdown = 1 + /// If this bag is zipped (contents hidden) up or not + /// Starts enabled so you're forced to interact with it to "get" it + var/zipped_up = TRUE + // How much time it takes to zip up (close) the duffelbag + var/zip_up_duration = 0.5 SECONDS + // Audio played during zipup + var/zip_up_sfx = 'sound/items/zip/zip_up.ogg' + // How much time it takes to unzip the duffel + var/unzip_duration = 2.1 SECONDS + // Audio played during unzip + var/unzip_sfx = 'sound/items/zip/un_zip.ogg' + +/obj/item/storage/backpack/duffelbag/Initialize(mapload) + . = ..() + set_zipper(TRUE) + +/obj/item/storage/backpack/duffelbag/update_desc(updates) + . = ..() + desc = "[initial(desc)]
[zipped_up ? "It's zipped up, preventing you from accessing its contents." : "It's unzipped, and harder to move in."]" + +/obj/item/storage/backpack/duffelbag/attack_self(mob/user, modifiers) + if(loc != user) // God fuck TK + return ..() + if(zipped_up) + return attack_hand(user, modifiers) + else + return attack_hand_secondary(user, modifiers) + +/obj/item/storage/backpack/duffelbag/attack_self_secondary(mob/user, modifiers) + attack_self(user, modifiers) + return ..() + +// If we're zipped, click to unzip +/obj/item/storage/backpack/duffelbag/attack_hand(mob/user, list/modifiers) + if(loc != user) + // Hacky, but please don't be cringe yeah? + atom_storage.silent = TRUE + . = ..() + atom_storage.silent = initial(atom_storage.silent) + return + if(!zipped_up) + return ..() + + balloon_alert(user, "unzipping...") + playsound(src, unzip_sfx, 100, FALSE) + var/datum/callback/can_unzip = CALLBACK(src, PROC_REF(zipper_matches), TRUE) + if(!do_after(user, unzip_duration, src, extra_checks = can_unzip)) + user.balloon_alert(user, "unzip failed!") + return + balloon_alert(user, "unzipped") + set_zipper(FALSE) + return TRUE + +// Vis versa +/obj/item/storage/backpack/duffelbag/attack_hand_secondary(mob/user, list/modifiers) + if(loc != user) + return ..() + if(zipped_up) + return SECONDARY_ATTACK_CALL_NORMAL + + balloon_alert(user, "zipping...") + playsound(src, zip_up_sfx, 100, FALSE) + var/datum/callback/can_zip = CALLBACK(src, PROC_REF(zipper_matches), FALSE) + if(!do_after(user, zip_up_duration, src, extra_checks = can_zip)) + user.balloon_alert(user, "zip failed!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + balloon_alert(user, "zipped") + set_zipper(TRUE) + return SECONDARY_ATTACK_CONTINUE_CHAIN + +/// Checks to see if the zipper matches the passed in state +/// Returns true if so, false otherwise +/obj/item/storage/backpack/duffelbag/proc/zipper_matches(matching_value) + return zipped_up == matching_value + +/obj/item/storage/backpack/duffelbag/proc/set_zipper(new_zip) + zipped_up = new_zip + SEND_SIGNAL(src, COMSIG_DUFFEL_ZIP_CHANGE, new_zip) + if(zipped_up) + slowdown = initial(slowdown) + atom_storage.set_locked(STORAGE_SOFT_LOCKED) + atom_storage.display_contents = FALSE + else + slowdown = zip_slowdown + atom_storage.set_locked(STORAGE_NOT_LOCKED) + atom_storage.display_contents = TRUE + + if(isliving(loc)) + var/mob/living/wearer = loc + wearer.update_equipment_speed_mods() + +/obj/item/storage/backpack/duffelbag/cursed + name = "living duffel bag" + desc = "A cursed clown duffel bag that hungers for food of any kind. A warning label suggests that it eats food inside. \ + If that food happens to be a horribly ruined mess or the chef scrapped out of the microwave, or poisoned in some way, \ + then it might have negative effects on the bag..." + icon_state = "duffel-curse" + inhand_icon_state = "duffel-curse" + zip_slowdown = 2 + max_integrity = 100 + +/obj/item/storage/backpack/duffelbag/cursed/Initialize(mapload) + . = ..() + AddComponent(/datum/component/curse_of_hunger, add_dropdel = TRUE) + +/obj/item/storage/backpack/duffelbag/captain + name = "captain's duffel bag" + desc = "A large duffel bag for holding extra captainly goods." + icon_state = "duffel-captain" + inhand_icon_state = "duffel-captain" + +/obj/item/storage/backpack/duffelbag/med + name = "medical duffel bag" + desc = "A large duffel bag for holding extra medical supplies." + icon_state = "duffel-medical" + inhand_icon_state = "duffel-med" + +/obj/item/storage/backpack/duffelbag/coroner + name = "coroner duffel bag" + desc = "A large duffel bag for holding large amounts of organs at once." + icon_state = "duffel-coroner" + inhand_icon_state = "duffel-coroner" + +/obj/item/storage/backpack/duffelbag/explorer + name = "explorer duffel bag" + desc = "A large duffel bag for holding extra exotic treasures." + icon_state = "duffel-explorer" + inhand_icon_state = "duffel-explorer" + +/obj/item/storage/backpack/duffelbag/hydroponics + name = "hydroponic's duffel bag" + desc = "A large duffel bag for holding extra gardening tools." + icon_state = "duffel-hydroponics" + inhand_icon_state = "duffel-hydroponics" + +/obj/item/storage/backpack/duffelbag/chemistry + name = "chemistry duffel bag" + desc = "A large duffel bag for holding extra chemical substances." + icon_state = "duffel-chemistry" + inhand_icon_state = "duffel-chemistry" + +/obj/item/storage/backpack/duffelbag/genetics + name = "geneticist's duffel bag" + desc = "A large duffel bag for holding extra genetic mutations." + icon_state = "duffel-genetics" + inhand_icon_state = "duffel-genetics" + +/obj/item/storage/backpack/duffelbag/science + name = "scientist's duffel bag" + desc = "A large duffel bag for holding extra scientific components." + icon_state = "duffel-science" + inhand_icon_state = "duffel-sci" + +/obj/item/storage/backpack/duffelbag/virology + name = "virologist's duffel bag" + desc = "A large duffel bag for holding extra viral bottles." + icon_state = "duffel-virology" + inhand_icon_state = "duffel-virology" + +/obj/item/storage/backpack/duffelbag/sec + name = "security duffel bag" + desc = "A large duffel bag for holding extra security supplies and ammunition." + icon_state = "duffel-security" + inhand_icon_state = "duffel-sec" + +/obj/item/storage/backpack/duffelbag/sec/surgery + name = "surgical duffel bag" + desc = "A large duffel bag for holding extra supplies - this one has a material inlay with space for various sharp-looking tools." + +/obj/item/storage/backpack/duffelbag/sec/surgery/PopulateContents() + new /obj/item/scalpel(src) + new /obj/item/hemostat(src) + new /obj/item/retractor(src) + new /obj/item/circular_saw(src) + new /obj/item/bonesetter(src) + new /obj/item/surgicaldrill(src) + new /obj/item/cautery(src) + new /obj/item/surgical_drapes(src) + new /obj/item/clothing/suit/toggle/labcoat/hospitalgown(src) //SKYRAT EDIT ADDITION + new /obj/item/clothing/mask/surgical(src) + new /obj/item/blood_filter(src) + +/obj/item/storage/backpack/duffelbag/engineering + name = "industrial duffel bag" + desc = "A large duffel bag for holding extra tools and supplies." + icon_state = "duffel-engineering" + inhand_icon_state = "duffel-eng" + resistance_flags = FIRE_PROOF + +/obj/item/storage/backpack/duffelbag/drone + name = "drone duffel bag" + desc = "A large duffel bag for holding tools and hats." + icon_state = "duffel-drone" + inhand_icon_state = "duffel-drone" + resistance_flags = FIRE_PROOF + +/obj/item/storage/backpack/duffelbag/drone/PopulateContents() + new /obj/item/screwdriver(src) + new /obj/item/wrench(src) + new /obj/item/weldingtool(src) + new /obj/item/crowbar(src) + new /obj/item/stack/cable_coil(src) + new /obj/item/wirecutters(src) + new /obj/item/multitool(src) + +/obj/item/storage/backpack/duffelbag/clown + name = "clown's duffel bag" + desc = "A large duffel bag for holding lots of funny gags!" + icon_state = "duffel-clown" + inhand_icon_state = "duffel-clown" + +/obj/item/storage/backpack/duffelbag/clown/cream_pie/PopulateContents() + for(var/i in 1 to 10) + new /obj/item/food/pie/cream(src) + +/obj/item/storage/backpack/fireproof + resistance_flags = FIRE_PROOF + +/obj/item/storage/backpack/duffelbag/syndie + name = "tactical duffel bag" // BUBBER EDIT CHANGE: Just a normal bag. Original: name = "suspicious looking duffel bag" + desc = "A large duffel bag for holding extra tactical supplies." // BUBBER EDIT CHANGE: Just a normal bag. Original: desc = "A large duffel bag for holding extra tactical supplies. It contains an oiled plastitanium zipper for maximum speed tactical zipping, and is better balanced on your back than an average duffelbag. Can hold two bulky items!" + icon_state = "duffel-syndie" + inhand_icon_state = "duffel-syndieammo" + storage_type = /datum/storage/duffel/syndicate + resistance_flags = FIRE_PROOF + // Less slowdown while unzipped. Still bulky, but it won't halve your movement speed in an active combat situation. + zip_slowdown = 0.3 + // Faster unzipping. Utilizes the same noise as zipping up to fit the unzip duration. + unzip_duration = 0.5 SECONDS + unzip_sfx = 'sound/items/zip/zip_up.ogg' + + // BUBBER EDIT ADDITION BEGIN: Just a normal bag. + special_desc_requirement = EXAMINE_CHECK_SYNDICATE + special_desc = "This duffel bag has the Syndicate logo stiched on the inside. It appears to be made from lighter yet sturdier materials, and features an oiled plastitanium zipper for maximum speed tactical zipping." + // BUBBER EDIT ADDITION END: Just a normal bag. + +/obj/item/storage/backpack/duffelbag/syndie/hitman + desc = "A large duffel bag for holding extra things. There is a Nanotrasen logo on the back." + icon_state = "duffel-syndieammo" + inhand_icon_state = "duffel-syndieammo" + +/obj/item/storage/backpack/duffelbag/syndie/hitman/PopulateContents() + new /obj/item/clothing/under/costume/buttondown/slacks/service(src) + new /obj/item/clothing/neck/tie/red/hitman(src) + new /obj/item/clothing/accessory/waistcoat(src) + new /obj/item/clothing/suit/toggle/lawyer/black(src) + new /obj/item/clothing/shoes/laceup(src) + new /obj/item/clothing/gloves/color/black(src) + new /obj/item/clothing/glasses/sunglasses(src) + new /obj/item/clothing/head/fedora(src) + +/obj/item/storage/backpack/duffelbag/syndie/med + name = "medical duffel bag" + desc = "A large duffel bag for holding extra tactical medical supplies." + icon_state = "duffel-syndiemed" + inhand_icon_state = "duffel-syndiemed" + +/obj/item/storage/backpack/duffelbag/syndie/surgery + name = "surgery duffel bag" + desc = "A large duffel bag for holding extra supplies - this one has a material inlay with space for various sharp-looking tools." // BUBBER EDIT CHANGE: Just a normal bag. Original: desc = "A suspicious looking duffel bag for holding surgery tools." + icon_state = "duffel-syndiemed" + inhand_icon_state = "duffel-syndiemed" + + // BUBBER EDIT ADDITION BEGIN: Just a normal bag. + special_desc_requirement = EXAMINE_CHECK_SYNDICATE + special_desc = "This duffel bag has the Syndicate logo stiched on the inside. It appears to be made from lighter yet sturdier materials." + // BUBBER EDIT ADDITION END: Just a normal bag. + +/obj/item/storage/backpack/duffelbag/syndie/surgery/PopulateContents() + new /obj/item/scalpel/advanced(src) + new /obj/item/retractor/advanced(src) + new /obj/item/cautery/advanced(src) + new /obj/item/surgical_drapes(src) + new /obj/item/reagent_containers/medigel/sterilizine(src) + new /obj/item/bonesetter(src) + new /obj/item/blood_filter(src) + new /obj/item/stack/medical/bone_gel(src) + new /obj/item/stack/sticky_tape/surgical(src) + new /obj/item/emergency_bed(src) + new /obj/item/clothing/suit/jacket/straight_jacket(src) + new /obj/item/clothing/mask/muzzle(src) + new /obj/item/mmi/syndie(src) + +/obj/item/storage/backpack/duffelbag/syndie/ammo + name = "ammunition duffel bag" + desc = "A large duffel bag for holding extra weapons ammunition and supplies." + icon_state = "duffel-syndieammo" + inhand_icon_state = "duffel-syndieammo" + +/obj/item/storage/backpack/duffelbag/syndie/ammo/mech + desc = "A large duffel bag, packed to the brim with various exosuit ammo." + +/obj/item/storage/backpack/duffelbag/syndie/ammo/mech/PopulateContents() + new /obj/item/mecha_ammo/scattershot(src) + new /obj/item/mecha_ammo/scattershot(src) + new /obj/item/mecha_ammo/scattershot(src) + new /obj/item/mecha_ammo/scattershot(src) + new /obj/item/storage/belt/utility/syndicate(src) + +/obj/item/storage/backpack/duffelbag/syndie/ammo/mauler + desc = "A large duffel bag, packed to the brim with various exosuit ammo." + +/obj/item/storage/backpack/duffelbag/syndie/ammo/mauler/PopulateContents() + new /obj/item/mecha_ammo/lmg(src) + new /obj/item/mecha_ammo/lmg(src) + new /obj/item/mecha_ammo/lmg(src) + new /obj/item/mecha_ammo/scattershot(src) + new /obj/item/mecha_ammo/scattershot(src) + new /obj/item/mecha_ammo/scattershot(src) + new /obj/item/mecha_ammo/missiles_srm(src) + new /obj/item/mecha_ammo/missiles_srm(src) + new /obj/item/mecha_ammo/missiles_srm(src) + +/obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle + desc = "A large duffel bag containing a medical equipment, a Donksoft LMG, a big jumbo box of riot darts, and a magboot MODsuit module." + +/obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle/PopulateContents() + new /obj/item/mod/module/magboot(src) + new /obj/item/storage/medkit/tactical/premium(src) + new /obj/item/gun/ballistic/automatic/l6_saw/toy(src) + new /obj/item/ammo_box/foambox/riot(src) + +/obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle + desc = "A large duffel bag containing deadly chemicals, a handheld chem sprayer, Bioterror foam grenade, a Donksoft assault rifle, box of riot grade darts, a dart pistol, and a box of syringes." + +/obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle/PopulateContents() + new /obj/item/reagent_containers/spray/chemsprayer/bioterror(src) + new /obj/item/storage/box/syndie_kit/chemical(src) + new /obj/item/gun/syringe/syndicate(src) + new /obj/item/gun/ballistic/automatic/c20r/toy(src) + new /obj/item/storage/box/syringes(src) + new /obj/item/ammo_box/foambox/riot(src) + new /obj/item/grenade/chem_grenade/bioterrorfoam(src) + if(prob(5)) + new /obj/item/food/pizza/pineapple(src) + +/obj/item/storage/backpack/duffelbag/syndie/c4/PopulateContents() + for(var/i in 1 to 10) + new /obj/item/grenade/c4(src) + +/obj/item/storage/backpack/duffelbag/syndie/x4/PopulateContents() + for(var/i in 1 to 3) + new /obj/item/grenade/c4/x4(src) + +/obj/item/storage/backpack/duffelbag/syndie/firestarter + desc = "A large duffel bag containing a New Russian pyro backpack sprayer, Elite MODsuit, a Stechkin APS pistol, minibomb, ammo, and other equipment." + +/obj/item/storage/backpack/duffelbag/syndie/firestarter/PopulateContents() + new /obj/item/clothing/under/syndicate/soviet(src) + new /obj/item/mod/control/pre_equipped/elite/flamethrower(src) + new /obj/item/gun/ballistic/automatic/pistol/aps(src) + new /obj/item/ammo_box/magazine/m9mm_aps/fire(src) + new /obj/item/ammo_box/magazine/m9mm_aps/fire(src) + new /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka(src) + new /obj/item/reagent_containers/hypospray/medipen/stimulants(src) + new /obj/item/grenade/syndieminibomb(src) + +// For ClownOps. +/obj/item/storage/backpack/duffelbag/clown/syndie + storage_type = /datum/storage/duffel/syndicate + +/obj/item/storage/backpack/duffelbag/clown/syndie/PopulateContents() + new /obj/item/modular_computer/pda/clown(src) + new /obj/item/clothing/under/rank/civilian/clown(src) + new /obj/item/clothing/shoes/clown_shoes(src) + new /obj/item/clothing/mask/gas/clown_hat(src) + new /obj/item/bikehorn(src) + new /obj/item/implanter/sad_trombone(src) + +/obj/item/storage/backpack/henchmen + name = "wings" + desc = "Granted to the henchmen who deserve it. This probably doesn't include you." + icon_state = "henchmen" + inhand_icon_state = null + +/obj/item/storage/backpack/duffelbag/cops + name = "police bag" + desc = "A large duffel bag for holding extra police gear." + +/obj/item/storage/backpack/duffelbag/mining_conscript + name = "mining conscription kit" + desc = "A duffel bag containing everything a crewmember needs to support a shaft miner in the field." + icon_state = "duffel-explorer" + inhand_icon_state = "duffel-explorer" + +/obj/item/storage/backpack/duffelbag/mining_conscript/PopulateContents() + new /obj/item/clothing/glasses/meson(src) + new /obj/item/t_scanner/adv_mining_scanner/lesser(src) + new /obj/item/storage/bag/ore(src) + new /obj/item/clothing/suit/hooded/explorer(src) + new /obj/item/encryptionkey/headset_mining(src) + new /obj/item/clothing/mask/gas/explorer(src) + new /obj/item/card/id/advanced/mining(src) + new /obj/item/gun/energy/recharge/kinetic_accelerator(src) + new /obj/item/knife/combat/survival(src) + new /obj/item/flashlight/seclite(src) diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index c5df43a220b..194408fd718 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -22,6 +22,17 @@ register_context() +///screentips for lockboxes +/obj/item/storage/lockbox/add_context(atom/source, list/context, obj/item/held_item, mob/user) + if(!held_item) + return NONE + if(src.broken) + return NONE + if(!held_item.GetID()) + return NONE + context[SCREENTIP_CONTEXT_LMB] = atom_storage.locked ? "Unlock with ID" : "Lock with ID" + return CONTEXTUAL_SCREENTIP_SET + /obj/item/storage/lockbox/tool_act(mob/living/user, obj/item/tool, list/modifiers) var/obj/item/card/card = tool.GetID() if(isnull(card)) @@ -255,13 +266,78 @@ balloon_alert(user, "incorrect bank account!") return FALSE -///screentips for lockboxes -/obj/item/storage/lockbox/add_context(atom/source, list/context, obj/item/held_item, mob/user) - if(!held_item) - return NONE - if(src.broken) - return NONE - if(!held_item.GetID()) - return NONE - context[SCREENTIP_CONTEXT_LMB] = atom_storage.locked ? "Unlock with ID" : "Lock with ID" - return CONTEXTUAL_SCREENTIP_SET +/obj/item/storage/lockbox/dueling + name = "dueling pistol case" + desc = "Let's solve this like gentlespacemen." + icon_state = "medalbox+l" + inhand_icon_state = "syringe_kit" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + w_class = WEIGHT_CLASS_NORMAL + req_access = list(ACCESS_CAPTAIN) + icon_locked = "medalbox+l" + icon_closed = "medalbox" + icon_broken = "medalbox+b" + base_icon_state = "medalbox" + icon_open = "medalboxopen" + storage_type = /datum/storage/lockbox/dueling + +/obj/item/storage/lockbox/dueling/PopulateContents() + . = ..() + var/obj/item/gun/energy/dueling/gun_A = new(src) + var/obj/item/gun/energy/dueling/gun_B = new(src) + new /datum/duel(gun_A, gun_B) + +/obj/item/storage/lockbox/bitrunning + name = "base class curiosity" + desc = "Talk to a coder." + req_access = list(ACCESS_INACCESSIBLE) + icon_state = "bitrunning+l" + inhand_icon_state = "bitrunning" + base_icon_state = "bitrunning" + icon_locked = "bitrunning+l" + icon_closed = "bitrunning" + icon_broken = "bitrunning+b" + icon_open = "bitrunning" + +/obj/item/storage/lockbox/bitrunning/encrypted + name = "encrypted curiosity" + desc = "Needs to be decrypted at the safehouse to be opened." + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + /// Path for the loot we are assigned + var/loot_path + +/obj/item/storage/lockbox/bitrunning/encrypted/emag_act(mob/user, obj/item/card/emag/emag_card) + return FALSE + +/obj/item/storage/lockbox/bitrunning/decrypted + name = "decrypted curiosity" + desc = "Compiled from the virtual domain. An extra reward of a successful bitrunner." + storage_type = /datum/storage/lockbox/bitrunning_decrypted + + /// What virtual domain did we come from. + var/datum/lazy_template/virtual_domain/source_domain + +/obj/item/storage/lockbox/bitrunning/decrypted/Initialize( + mapload, + datum/lazy_template/virtual_domain/completed_domain, + ) + + if(isnull(completed_domain)) + log_runtime("Decrypted curiosity was created with no source domain.") + return INITIALIZE_HINT_QDEL + + if(!istype(completed_domain, /datum/lazy_template/virtual_domain)) // Check if this is a proper virtual domain before doing anything with it + log_runtime("Decrypted curiosity was created with an invalid source domain. [completed_domain.name] ([completed_domain.type]).") + return INITIALIZE_HINT_QDEL + + source_domain = completed_domain + + . = ..() + + icon_state = icon_closed + playsound(src, 'sound/effects/magic/blink.ogg', 50, TRUE) + +/obj/item/storage/lockbox/bitrunning/decrypted/PopulateContents() + var/choice = SSbitrunning.pick_secondary_loot(source_domain) + new choice(src) diff --git a/code/game/objects/items/storage/pillbottles.dm b/code/game/objects/items/storage/pillbottles.dm index 0c9cc4d0620..9da9abf0c80 100644 --- a/code/game/objects/items/storage/pillbottles.dm +++ b/code/game/objects/items/storage/pillbottles.dm @@ -16,216 +16,177 @@ drop_sound = 'sound/items/handling/pill_bottle_place.ogg' storage_type = /datum/storage/pillbottle + ///Number of pills to spawn + VAR_PROTECTED/spawn_count + ///Pill type to spawn + VAR_PROTECTED/obj/item/reagent_containers/applicator/pill/spawn_type + /obj/item/storage/pill_bottle/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is trying to get the cap off [src]! It looks like [user.p_theyre()] trying to commit suicide!")) return TOXLOSS +/obj/item/storage/pill_bottle/PopulateContents() + SHOULD_NOT_OVERRIDE(TRUE) + + if(!spawn_count) + return + + for(var/i in 1 to spawn_count) + new spawn_type(src) + /obj/item/storage/pill_bottle/multiver name = "bottle of multiver pills" desc = "Contains pills used to counter toxins." - -/obj/item/storage/pill_bottle/multiver/PopulateContents() - for(var/i in 1 to 7) - new /obj/item/reagent_containers/applicator/pill/multiver(src) + spawn_count = 7 + spawn_type = /obj/item/reagent_containers/applicator/pill/multiver /obj/item/storage/pill_bottle/multiver/less - -/obj/item/storage/pill_bottle/multiver/less/PopulateContents() - for(var/i in 1 to 3) - new /obj/item/reagent_containers/applicator/pill/multiver(src) + spawn_count = 3 /obj/item/storage/pill_bottle/epinephrine name = "bottle of epinephrine pills" desc = "Contains pills used to stabilize patients." - -/obj/item/storage/pill_bottle/epinephrine/PopulateContents() - for(var/i in 1 to 7) - new /obj/item/reagent_containers/applicator/pill/epinephrine(src) + spawn_count = 7 + spawn_type = /obj/item/reagent_containers/applicator/pill/epinephrine /obj/item/storage/pill_bottle/mutadone name = "bottle of mutadone pills" desc = "Contains pills used to treat genetic abnormalities." - -/obj/item/storage/pill_bottle/mutadone/PopulateContents() - for(var/i in 1 to 7) - new /obj/item/reagent_containers/applicator/pill/mutadone(src) + spawn_count = 7 + spawn_type = /obj/item/reagent_containers/applicator/pill/mutadone /obj/item/storage/pill_bottle/potassiodide name = "bottle of potassium iodide pills" desc = "Contains pills used to reduce radiation damage." - -/obj/item/storage/pill_bottle/potassiodide/PopulateContents() - for(var/i in 1 to 3) - new /obj/item/reagent_containers/applicator/pill/potassiodide(src) + spawn_count = 3 + spawn_type = /obj/item/reagent_containers/applicator/pill/potassiodide /obj/item/storage/pill_bottle/probital name = "bottle of probital pills" desc = "Contains pills used to treat brute damage. The tag in the bottle states 'Eat before ingesting, may cause fatigue'." - -/obj/item/storage/pill_bottle/probital/PopulateContents() - for(var/i in 1 to 4) - new /obj/item/reagent_containers/applicator/pill/probital(src) + spawn_count = 4 + spawn_type = /obj/item/reagent_containers/applicator/pill/probital /obj/item/storage/pill_bottle/iron name = "bottle of iron pills" desc = "Contains pills used to reduce blood loss slowly. The tag in the bottle states 'Only take one each five minutes'." - -/obj/item/storage/pill_bottle/iron/PopulateContents() - for(var/i in 1 to 4) - new /obj/item/reagent_containers/applicator/pill/iron(src) + spawn_count = 4 + spawn_type = /obj/item/reagent_containers/applicator/pill/iron /obj/item/storage/pill_bottle/mannitol name = "bottle of mannitol pills" desc = "Contains pills used to treat brain damage." - -/obj/item/storage/pill_bottle/mannitol/PopulateContents() - for(var/i in 1 to 7) - new /obj/item/reagent_containers/applicator/pill/mannitol(src) + spawn_count = 7 + spawn_type = /obj/item/reagent_containers/applicator/pill/mannitol //Contains 4 pills instead of 7, and 5u pills instead of 50u (50u pills heal 250 brain damage, 5u pills heal 25) /obj/item/storage/pill_bottle/mannitol/braintumor desc = "Contains diluted pills used to treat brain tumor symptoms. Take one when feeling lightheaded." - -/obj/item/storage/pill_bottle/mannitol/braintumor/PopulateContents() - for(var/i in 1 to 4) - new /obj/item/reagent_containers/applicator/pill/mannitol/braintumor(src) + spawn_count = 4 + spawn_type = /obj/item/reagent_containers/applicator/pill/mannitol/braintumor /obj/item/storage/pill_bottle/stimulant name = "bottle of stimulant pills" desc = "Guaranteed to give you that extra burst of energy during a long shift!" - -/obj/item/storage/pill_bottle/stimulant/PopulateContents() - for(var/i in 1 to 5) - new /obj/item/reagent_containers/applicator/pill/stimulant(src) + spawn_count = 5 + spawn_type = /obj/item/reagent_containers/applicator/pill/stimulant /obj/item/storage/pill_bottle/sansufentanyl name = "bottle of experimental medication" desc = "A bottle of pills developed by Interdyne Pharmaceuticals. They're used to treat Hereditary Manifold Sickness." - -/obj/item/storage/pill_bottle/sansufentanyl/PopulateContents() - for(var/i in 1 to 6) - new /obj/item/reagent_containers/applicator/pill/sansufentanyl(src) + spawn_count = 6 + spawn_type = /obj/item/reagent_containers/applicator/pill/sansufentanyl /obj/item/storage/pill_bottle/mining name = "bottle of patches" desc = "Contains patches used to treat brute and burn damage." - -/obj/item/storage/pill_bottle/mining/PopulateContents() - new /obj/item/reagent_containers/applicator/patch/aiuri(src) - for(var/i in 1 to 3) - new /obj/item/reagent_containers/applicator/patch/libital(src) + spawn_count = 3 + spawn_type = /obj/item/reagent_containers/applicator/patch/libital /obj/item/storage/pill_bottle/zoom name = "suspicious pill bottle" desc = "The label is pretty old and almost unreadable, you recognize some chemical compounds." - -/obj/item/storage/pill_bottle/zoom/PopulateContents() - for(var/i in 1 to 5) - new /obj/item/reagent_containers/applicator/pill/zoom(src) + spawn_count = 5 + spawn_type = /obj/item/reagent_containers/applicator/pill/zoom /obj/item/storage/pill_bottle/happy name = "suspicious pill bottle" desc = "There is a smiley on the top." - -/obj/item/storage/pill_bottle/happy/PopulateContents() - for(var/i in 1 to 5) - new /obj/item/reagent_containers/applicator/pill/happy(src) + spawn_count = 5 + spawn_type = /obj/item/reagent_containers/applicator/pill/happy /obj/item/storage/pill_bottle/lsd name = "suspicious pill bottle" desc = "There is a crude drawing which could be either a mushroom, or a deformed moon." - -/obj/item/storage/pill_bottle/lsd/PopulateContents() - for(var/i in 1 to 5) - new /obj/item/reagent_containers/applicator/pill/lsd(src) + spawn_count = 5 + spawn_type = /obj/item/reagent_containers/applicator/pill/lsd /obj/item/storage/pill_bottle/aranesp name = "suspicious pill bottle" desc = "The label has 'fuck disablers' hastily scrawled in black marker." - -/obj/item/storage/pill_bottle/aranesp/PopulateContents() - for(var/i in 1 to 5) - new /obj/item/reagent_containers/applicator/pill/aranesp(src) + spawn_count = 5 + spawn_type = /obj/item/reagent_containers/applicator/pill/aranesp /obj/item/storage/pill_bottle/psicodine name = "bottle of psicodine pills" desc = "Contains pills used to treat mental distress and traumas." - -/obj/item/storage/pill_bottle/psicodine/PopulateContents() - for(var/i in 1 to 7) - new /obj/item/reagent_containers/applicator/pill/psicodine(src) + spawn_count = 7 + spawn_type = /obj/item/reagent_containers/applicator/pill/psicodine /obj/item/storage/pill_bottle/penacid name = "bottle of pentetic acid pills" desc = "Contains pills to expunge radiation and toxins." - -/obj/item/storage/pill_bottle/penacid/PopulateContents() - for(var/i in 1 to 3) - new /obj/item/reagent_containers/applicator/pill/penacid(src) - + spawn_count = 3 + spawn_type = /obj/item/reagent_containers/applicator/pill/penacid /obj/item/storage/pill_bottle/neurine name = "bottle of neurine pills" desc = "Contains pills to treat non-severe mental traumas." - -/obj/item/storage/pill_bottle/neurine/PopulateContents() - for(var/i in 1 to 5) - new /obj/item/reagent_containers/applicator/pill/neurine(src) + spawn_count = 5 + spawn_type = /obj/item/reagent_containers/applicator/pill/neurine /obj/item/storage/pill_bottle/maintenance_pill name = "bottle of maintenance pills" desc = "An old pill bottle. It smells musty." + spawn_type = /obj/item/reagent_containers/applicator/pill/maintenance /obj/item/storage/pill_bottle/maintenance_pill/Initialize(mapload) + if(!spawn_count) + spawn_count = rand(1,7) . = ..() var/obj/item/reagent_containers/applicator/pill/P = locate() in src name = "bottle of [P.name]s" -/obj/item/storage/pill_bottle/maintenance_pill/PopulateContents() - for(var/i in 1 to rand(1,7)) - new /obj/item/reagent_containers/applicator/pill/maintenance(src) - -/obj/item/storage/pill_bottle/maintenance_pill/full/PopulateContents() - for(var/i in 1 to 7) - new /obj/item/reagent_containers/applicator/pill/maintenance(src) +/obj/item/storage/pill_bottle/maintenance_pill/full + spawn_count = 7 ///////////////////////////////////////// Psychologist inventory pillbottles /obj/item/storage/pill_bottle/happinesspsych name = "happiness pills" desc = "Contains pills used as a last resort means to temporarily stabilize depression and anxiety. WARNING: side effects may include slurred speech, drooling, and severe addiction." - -/obj/item/storage/pill_bottle/happinesspsych/PopulateContents() - for(var/i in 1 to 5) - new /obj/item/reagent_containers/applicator/pill/happinesspsych(src) + spawn_count = 5 + spawn_type = /obj/item/reagent_containers/applicator/pill/happinesspsych /obj/item/storage/pill_bottle/lsdpsych name = "mindbreaker toxin pills" desc = "!FOR THERAPEUTIC USE ONLY! Contains pills used to alleviate the symptoms of Reality Dissociation Syndrome." - -/obj/item/storage/pill_bottle/lsdpsych/PopulateContents() - for(var/i in 1 to 5) - new /obj/item/reagent_containers/applicator/pill/lsdpsych(src) + spawn_count = 5 + spawn_type = /obj/item/reagent_containers/applicator/pill/lsdpsych /obj/item/storage/pill_bottle/paxpsych name = "pax pills" desc = "Contains pills used to temporarily pacify patients that are deemed a harm to themselves or others." - -/obj/item/storage/pill_bottle/paxpsych/PopulateContents() - for(var/i in 1 to 5) - new /obj/item/reagent_containers/applicator/pill/paxpsych(src) + spawn_count = 5 + spawn_type = /obj/item/reagent_containers/applicator/pill/paxpsych /obj/item/storage/pill_bottle/naturalbait name = "freshness jar" desc = "Full of natural fish bait." - -/obj/item/storage/pill_bottle/naturalbait/PopulateContents() - for(var/i in 1 to 7) - new /obj/item/food/bait/natural(src) + spawn_count = 7 + spawn_type = /obj/item/food/bait/natural /obj/item/storage/pill_bottle/ondansetron name = "ondansetron patches" desc = "A bottle containing patches of ondansetron, a drug used to treat nausea and vomiting. May cause drowsiness." - -/obj/item/storage/pill_bottle/ondansetron/PopulateContents() - for(var/i in 1 to 5) - new /obj/item/reagent_containers/applicator/patch/ondansetron(src) + spawn_count = 5 + spawn_type = /obj/item/reagent_containers/applicator/patch/ondansetron diff --git a/code/game/objects/items/storage/sixpack.dm b/code/game/objects/items/storage/sixpack.dm index 0fd0f202c35..773327cd87f 100644 --- a/code/game/objects/items/storage/sixpack.dm +++ b/code/game/objects/items/storage/sixpack.dm @@ -37,3 +37,38 @@ /obj/item/storage/cans/sixbeer/PopulateContents() for(var/i in 1 to 6) new /obj/item/reagent_containers/cup/soda_cans/beer(src) + +/obj/item/storage/cans/sixgamerdrink + name = "gamer drink bottle ring" + desc = "Holds six gamer drink cans. Remember to recycle when you're done!" + + /// Pool of gamer drinks tm we may add from + var/list/gamer_drink_options = list( + /obj/item/reagent_containers/cup/soda_cans/pwr_game = 55, + /obj/item/reagent_containers/cup/soda_cans/space_mountain_wind = 15, + /obj/item/reagent_containers/cup/soda_cans/monkey_energy = 15, + /obj/item/reagent_containers/cup/soda_cans/volt_energy = 10, + /obj/item/reagent_containers/cup/soda_cans/thirteenloko = 5, + ) + +/obj/item/storage/cans/sixgamerdrink/PopulateContents() + for(var/i in 1 to 6) + var/obj/item/chosen_gamer_drink = pick_weight(gamer_drink_options) + new chosen_gamer_drink(src) + +/obj/item/storage/cans/sixenergydrink + name = "energy drink bottle ring" + desc = "Holds six energy drink cans. Remember to recycle when you're done!" + + /// Pool of energy drinks tm we may add from + var/list/energy_drink_options = list( + /obj/item/reagent_containers/cup/soda_cans/space_mountain_wind = 50, + /obj/item/reagent_containers/cup/soda_cans/monkey_energy = 30, + /obj/item/reagent_containers/cup/soda_cans/volt_energy = 15, + /obj/item/reagent_containers/cup/soda_cans/thirteenloko = 5, + ) + +/obj/item/storage/cans/sixenergydrink/PopulateContents() + for(var/i in 1 to 6) + var/obj/item/chosen_energy_drink = pick_weight(energy_drink_options) + new chosen_energy_drink(src) diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm deleted file mode 100644 index 7d6e19ac9e2..00000000000 --- a/code/game/objects/items/storage/toolbox.dm +++ /dev/null @@ -1,707 +0,0 @@ -/obj/item/storage/toolbox - name = "toolbox" - desc = "Danger. Very robust." - icon = 'icons/obj/storage/toolbox.dmi' - icon_state = "toolbox_default" - inhand_icon_state = "toolbox_default" - lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi' - obj_flags = CONDUCTS_ELECTRICITY - force = 13 - throwforce = 13 - throw_speed = 2 - throw_range = 7 - demolition_mod = 1.25 - w_class = WEIGHT_CLASS_BULKY - custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*5) - attack_verb_continuous = list("robusts") - attack_verb_simple = list("robust") - hitsound = 'sound/items/weapons/smash.ogg' - drop_sound = 'sound/items/handling/toolbox/toolbox_drop.ogg' - pickup_sound = 'sound/items/handling/toolbox/toolbox_pickup.ogg' - material_flags = MATERIAL_EFFECTS | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS - wound_bonus = 5 - storage_type = /datum/storage/toolbox - - var/latches = "single_latch" - var/has_latches = TRUE - /// How many interactions are we currently performing - var/current_interactions = 0 - /// Items we should not interact with when left clicking - var/static/list/lmb_exception_typecache = typecacheof(list( - /obj/structure/table, - /obj/structure/rack, - /obj/structure/closet, - /obj/machinery/disposal, - )) - -/obj/item/storage/toolbox/Initialize(mapload) - . = ..() - if(has_latches) - if(prob(10)) - latches = "double_latch" - if(prob(1)) - latches = "triple_latch" - if(prob(0.1)) - latches = "quad_latch" // like winning the lottery, but worse - update_appearance() - AddElement(/datum/element/falling_hazard, damage = force, wound_bonus = wound_bonus, hardhat_safety = TRUE, crushes = FALSE, impact_sound = hitsound) - -/obj/item/storage/toolbox/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - if (user.combat_mode || !user.has_hand_for_held_index(user.get_inactive_hand_index())) - return NONE - - if (is_type_in_typecache(interacting_with, lmb_exception_typecache) && !LAZYACCESS(modifiers, RIGHT_CLICK)) - return NONE - - if (current_interactions) - var/obj/item/other_tool = user.get_inactive_held_item() - if (!istype(other_tool)) // what even - return NONE - INVOKE_ASYNC(src, PROC_REF(use_tool_on), interacting_with, user, modifiers, other_tool) - return ITEM_INTERACT_SUCCESS - - if (user.get_inactive_held_item()) - user.balloon_alert(user, "hands busy!") - return ITEM_INTERACT_BLOCKING - - var/list/item_radial = list() - for (var/obj/item/tool in atom_storage.real_location) - if(is_type_in_list(tool, GLOB.tool_items)) - item_radial[tool] = tool.appearance - - if (!length(item_radial)) - return NONE - - playsound(user, 'sound/items/handling/toolbox/toolbox_open.ogg', 50) - var/obj/item/picked_item = show_radial_menu(user, interacting_with, item_radial, require_near = TRUE) - if (!picked_item) - return ITEM_INTERACT_BLOCKING - - playsound(user, 'sound/items/handling/toolbox/toolbox_rustle.ogg', 50) - if (!user.put_in_inactive_hand(picked_item)) - return ITEM_INTERACT_BLOCKING - - atom_storage.animate_parent() - if (istype(picked_item, /obj/item/weldingtool)) - var/obj/item/weldingtool/welder = picked_item - if (!welder.welding) - welder.attack_self(user) - - if (istype(picked_item, /obj/item/spess_knife)) - picked_item.attack_self(user) - - INVOKE_ASYNC(src, PROC_REF(use_tool_on), interacting_with, user, modifiers, picked_item) - return ITEM_INTERACT_SUCCESS - -/obj/item/storage/toolbox/proc/use_tool_on(atom/interacting_with, mob/living/user, list/modifiers, obj/item/picked_tool) - current_interactions += 1 - picked_tool.melee_attack_chain(user, interacting_with, modifiers) - current_interactions -= 1 - - if (QDELETED(picked_tool) || picked_tool.loc != user || !user.CanReach(picked_tool)) - current_interactions = 0 - return - - if (current_interactions) - return - - if (istype(picked_tool, /obj/item/weldingtool)) - var/obj/item/weldingtool/welder = picked_tool - if (welder.welding) - welder.attack_self(user) - - atom_storage.attempt_insert(picked_tool, user) - -/obj/item/storage/toolbox/update_overlays() - . = ..() - if(has_latches) - . += latches - -/obj/item/storage/toolbox/suicide_act(mob/living/user) - user.visible_message(span_suicide("[user] robusts [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) - return BRUTELOSS - -/obj/item/storage/toolbox/emergency - name = "emergency toolbox" - icon_state = "red" - inhand_icon_state = "toolbox_red" - material_flags = NONE - throw_speed = 3 // red ones go faster - -/obj/item/storage/toolbox/emergency/PopulateContents() - new /obj/item/crowbar/red(src) - new /obj/item/weldingtool/mini(src) - new /obj/item/extinguisher/mini(src) - switch(rand(1,3)) - if(1) - new /obj/item/flashlight(src) - if(2) - new /obj/item/flashlight/glowstick(src) - if(3) - new /obj/item/flashlight/flare(src) - new /obj/item/radio/off(src) - -/obj/item/storage/toolbox/emergency/old - name = "rusty red toolbox" - icon_state = "toolbox_red_old" - has_latches = FALSE - material_flags = NONE - -/obj/item/storage/toolbox/mechanical - name = "mechanical toolbox" - icon_state = "blue" - inhand_icon_state = "toolbox_blue" - material_flags = NONE - /// If FALSE, someone with a ensouled soulstone can sacrifice a spirit to change the sprite of this toolbox. - var/has_soul = FALSE - -/obj/item/storage/toolbox/mechanical/PopulateContents() - new /obj/item/screwdriver(src) - new /obj/item/wrench(src) - new /obj/item/weldingtool(src) - new /obj/item/crowbar(src) - new /obj/item/analyzer(src) - new /obj/item/wirecutters(src) - -/obj/item/storage/toolbox/mechanical/old - name = "rusty blue toolbox" - icon_state = "toolbox_blue_old" - has_latches = FALSE - has_soul = TRUE - -/obj/item/storage/toolbox/mechanical/old/heirloom - name = "toolbox" //this will be named "X family toolbox" - desc = "It's seen better days." - force = 5 - w_class = WEIGHT_CLASS_NORMAL - storage_type = /datum/storage/toolbox/heirloom - -/obj/item/storage/toolbox/mechanical/old/heirloom/PopulateContents() - return - -// version of below that isn't a traitor item -/obj/item/storage/toolbox/mechanical/old/cleaner - name = "old blue toolbox" - icon_state = "oldtoolboxclean" - icon_state = "toolbox_blue_old" - -/obj/item/storage/toolbox/mechanical/old/clean // the assistant traitor toolbox, damage scales with TC inside - name = "toolbox" - desc = "An old, blue toolbox, it looks robust." - icon_state = "oldtoolboxclean" - inhand_icon_state = "toolbox_blue" - has_latches = FALSE - force = 19 - throwforce = 22 - -/obj/item/storage/toolbox/mechanical/old/clean/proc/calc_damage() - var/power = 0 - for (var/obj/item/stack/telecrystal/stored_crystals in get_all_contents()) - power += (stored_crystals.amount / 2) - force = initial(force) + power - throwforce = initial(throwforce) + power - -/obj/item/storage/toolbox/mechanical/old/clean/attack(mob/target, mob/living/user) - calc_damage() - ..() - -/obj/item/storage/toolbox/mechanical/old/clean/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - calc_damage() - ..() - -/obj/item/storage/toolbox/mechanical/old/clean/PopulateContents() - new /obj/item/screwdriver(src) - new /obj/item/wrench(src) - new /obj/item/weldingtool(src) - new /obj/item/crowbar(src) - new /obj/item/wirecutters(src) - new /obj/item/multitool(src) - new /obj/item/clothing/gloves/color/yellow(src) - -/obj/item/storage/toolbox/electrical - name = "electrical toolbox" - icon_state = "yellow" - inhand_icon_state = "toolbox_yellow" - material_flags = NONE - -/obj/item/storage/toolbox/electrical/PopulateContents() - var/pickedcolor = pick(GLOB.cable_colors) - new /obj/item/screwdriver(src) - new /obj/item/wirecutters(src) - new /obj/item/t_scanner(src) - new /obj/item/crowbar(src) - var/obj/item/stack/cable_coil/new_cable_one = new(src, MAXCOIL) - new_cable_one.set_cable_color(pickedcolor) - var/obj/item/stack/cable_coil/new_cable_two = new(src, MAXCOIL) - new_cable_two.set_cable_color(pickedcolor) - if(prob(5)) - new /obj/item/clothing/gloves/color/yellow(src) - else - var/obj/item/stack/cable_coil/new_cable_three = new(src, MAXCOIL) - new_cable_three.set_cable_color(pickedcolor) - -/obj/item/storage/toolbox/syndicate - name = "tactical toolbox" //SKYRAT EDIT - icon_state = "syndicate" - inhand_icon_state = "toolbox_syndi" - force = 15 - throwforce = 18 - material_flags = NONE - special_desc_requirement = EXAMINE_CHECK_SYNDICATE // Skyrat edit - special_desc = "A toolbox manufactured by the Syndicate containing extra tactical tools. Made of more robust materials than the average toolbox." // Skyrat edit - storage_type = /datum/storage/toolbox/syndicate - -/obj/item/storage/toolbox/syndicate/PopulateContents() - new /obj/item/screwdriver/nuke(src) - new /obj/item/wrench(src) - new /obj/item/weldingtool/largetank(src) - new /obj/item/crowbar/red(src) - new /obj/item/wirecutters(src, "red") - new /obj/item/multitool(src) - new /obj/item/clothing/gloves/combat(src) - -/obj/item/storage/toolbox/drone - name = "mechanical toolbox" - icon_state = "blue" - inhand_icon_state = "toolbox_blue" - material_flags = NONE - -/obj/item/storage/toolbox/drone/PopulateContents() - var/pickedcolor = pick("red","yellow","green","blue","pink","orange","cyan","white") - new /obj/item/screwdriver(src) - new /obj/item/wrench(src) - new /obj/item/weldingtool(src) - new /obj/item/crowbar(src) - new /obj/item/stack/cable_coil(src,MAXCOIL,pickedcolor) - new /obj/item/wirecutters(src) - new /obj/item/multitool(src) - -/obj/item/storage/toolbox/artistic - name = "artistic toolbox" - desc = "A toolbox painted bright green. Why anyone would store art supplies in a toolbox is beyond you, but it has plenty of extra space." - icon_state = "green" - inhand_icon_state = "toolbox_green" - w_class = WEIGHT_CLASS_GIGANTIC //Holds more than a regular toolbox! - material_flags = NONE - storage_type = /datum/storage/toolbox/artistic - -/obj/item/storage/toolbox/artistic/PopulateContents() - new /obj/item/storage/crayons(src) - new /obj/item/toy/crayon/spraycan(src) - new /obj/item/toy/crayon/spraycan(src) - new /obj/item/paint_palette(src) - new /obj/item/paint/anycolor(src) - new /obj/item/paint/anycolor(src) - new /obj/item/paint/anycolor(src) - -/obj/item/storage/toolbox/crafter - name = "crafter toolbox" - desc = "A toolbox painted hot pink. Full of crafting supplies!" - icon_state = "pink" - inhand_icon_state = "toolbox_pink" - w_class = WEIGHT_CLASS_GIGANTIC //Holds more than a regular toolbox! - material_flags = NONE - -/obj/item/storage/toolbox/crafter/Initialize(mapload) - . = ..() - atom_storage.max_total_storage = 20 - atom_storage.max_slots = 11 - -/obj/item/storage/toolbox/crafter/PopulateContents() - new /obj/item/storage/crayons(src) - new /obj/item/camera(src) - new /obj/item/camera_film(src) - new /obj/item/chisel(src) - new /obj/item/stack/pipe_cleaner_coil/red(src) - new /obj/item/stack/pipe_cleaner_coil/yellow(src) - new /obj/item/stack/pipe_cleaner_coil/blue(src) - new /obj/item/stack/pipe_cleaner_coil/green(src) - new /obj/item/stack/pipe_cleaner_coil/pink(src) - new /obj/item/stack/pipe_cleaner_coil/orange(src) - new /obj/item/stack/pipe_cleaner_coil/cyan(src) - new /obj/item/stack/pipe_cleaner_coil/white(src) - new /obj/item/stack/pipe_cleaner_coil/brown(src) - -/obj/item/storage/toolbox/medical - name = "medical toolbox" - desc = "A toolbox painted soft white and light blue. This is getting ridiculous." - icon_state = "medical" - inhand_icon_state = "toolbox_medical" - attack_verb_continuous = list("treats", "surgeries", "tends", "tends wounds on") - attack_verb_simple = list("treat", "surgery", "tend", "tend wounds on") - w_class = WEIGHT_CLASS_BULKY - material_flags = NONE - force = 5 // its for healing - wound_bonus = 25 // wounds are medical right? - /// Tray we steal the og contents from. - var/obj/item/surgery_tray/tray_type = /obj/item/surgery_tray - -/obj/item/storage/toolbox/medical/PopulateContents() - atom_storage.max_slots = 0 - atom_storage.max_total_storage = 0 - - var/atom/fake_tray = new tray_type(null) - for(var/obj/item/tool in fake_tray) - tool.forceMove(src) - atom_storage.max_slots += 1 - atom_storage.max_total_storage += tool.w_class - - qdel(fake_tray) - -/obj/item/storage/toolbox/medical/full - tray_type = /obj/item/surgery_tray/full - -/obj/item/storage/toolbox/medical/coroner - name = "coroner toolbox" - desc = "A toolbox painted soft white and dark grey. This is getting beyond ridiculous." - icon_state = "coroner" - inhand_icon_state = "toolbox_coroner" - attack_verb_continuous = list("dissects", "autopsies", "corones") - attack_verb_simple = list("dissect", "autopsy", "corone") - w_class = WEIGHT_CLASS_BULKY - material_flags = NONE - force = 17 // it's not for healing - tray_type = /obj/item/surgery_tray/full/morgue - -/obj/item/storage/toolbox/medical/coroner/Initialize(mapload) - . = ..() - AddElement(/datum/element/bane, mob_biotypes = MOB_UNDEAD, damage_multiplier = 1) //Just in case one of the tennants get uppity - -/obj/item/storage/toolbox/ammobox - name = "ammo canister" - desc = "A metal canister designed to hold ammunition" - icon_state = "ammobox" - inhand_icon_state = "ammobox" - lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi' - has_latches = FALSE - drop_sound = 'sound/items/handling/ammobox_drop.ogg' - pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' - var/ammo_to_spawn - -/obj/item/storage/toolbox/ammobox/PopulateContents() - if(!isnull(ammo_to_spawn)) - for(var/i in 1 to 6) - new ammo_to_spawn(src) - -/obj/item/storage/toolbox/ammobox/strilka310 - name = ".310 Strilka ammo box (Surplus?)" - desc = "It contains a few clips. Goddamn, this thing smells awful. \ - Has this been sitting in a warehouse for the last several centuries?" - ammo_to_spawn = /obj/item/ammo_box/strilka310 - -/obj/item/storage/toolbox/ammobox/strilka310/surplus - ammo_to_spawn = /obj/item/ammo_box/strilka310/surplus - -/obj/item/storage/toolbox/ammobox/wt550m9 - name = "4.6x30mm ammo box" - ammo_to_spawn = /obj/item/ammo_box/magazine/wt550m9 - -/obj/item/storage/toolbox/ammobox/wt550m9ap - name = "4.6x30mm AP ammo box" - ammo_to_spawn = /obj/item/ammo_box/magazine/wt550m9/wtap - -//repairbot assembly -/obj/item/storage/toolbox/tool_act(mob/living/user, obj/item/tool, list/modifiers) - if(!istype(tool, /obj/item/assembly/prox_sensor)) - return ..() - var/static/list/allowed_toolbox = list( - /obj/item/storage/toolbox/artistic, - /obj/item/storage/toolbox/crafter, - /obj/item/storage/toolbox/electrical, - /obj/item/storage/toolbox/emergency, - /obj/item/storage/toolbox/mechanical, - /obj/item/storage/toolbox/syndicate, - ) - - if(!is_type_in_list(src, allowed_toolbox) && (type != /obj/item/storage/toolbox)) - return ITEM_INTERACT_BLOCKING - if(contents.len >= 1) - balloon_alert(user, "not empty!") - return ITEM_INTERACT_BLOCKING - var/static/list/toolbox_colors = list( - /obj/item/storage/toolbox = "#445eb3", - /obj/item/storage/toolbox/emergency = "#445eb3", - /obj/item/storage/toolbox/electrical = "#b77931", - /obj/item/storage/toolbox/artistic = "#378752", - /obj/item/storage/toolbox/crafter = "#9D3282", - /obj/item/storage/toolbox/syndicate = "#3d3d3d", - ) - var/obj/item/bot_assembly/repairbot/repair = new - repair.toolbox = type - var/new_color = toolbox_colors[type] || "#445eb3" - repair.set_color(new_color) - user.put_in_hands(repair) - repair.update_appearance() - repair.balloon_alert(user, "sensor added!") - qdel(tool) - qdel(src) - return ITEM_INTERACT_SUCCESS - -/obj/item/storage/toolbox/haunted - name = "old toolbox" - custom_materials = list(/datum/material/hauntium = SMALL_MATERIAL_AMOUNT*5) - -/obj/item/storage/toolbox/guncase - name = "gun case" - desc = "A weapon's case. Has a blood-red 'S' stamped on the cover." - icon = 'icons/obj/storage/case.dmi' - icon_state = "infiltrator_case" - lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi' - inhand_icon_state = "infiltrator_case" - has_latches = FALSE - storage_type = /datum/storage/toolbox/guncase - var/weapon_to_spawn = /obj/item/gun/ballistic/automatic/pistol - var/extra_to_spawn = /obj/item/ammo_box/magazine/m9mm - -/obj/item/storage/toolbox/guncase/PopulateContents() - new weapon_to_spawn (src) - for(var/i in 1 to 3) - new extra_to_spawn (src) - -/obj/item/storage/toolbox/guncase/traitor - name = "makarov gun case" - desc = "A weapon's case. Has a blood-red 'S' stamped on the cover. There seems to be a strange switch along the side inside a plastic flap." - icon_state = "pistol_case" - base_icon_state = "pistol_case" - // What ammo box do we spawn in our case? - var/ammo_box_to_spawn = /obj/item/ammo_box/c9mm - // Timer for the bomb in the case. - var/explosion_timer - // Whether or not our case is exploding. Used for determining sprite changes. - var/currently_exploding = FALSE - -/obj/item/storage/toolbox/guncase/traitor/Initialize(mapload) - . = ..() - register_context() - -/obj/item/storage/toolbox/guncase/traitor/examine(mob/user) - . = ..() - . += span_notice("Activate the Evidence Disposal Explosive using Alt-Right-Click.") - -/obj/item/storage/toolbox/guncase/traitor/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = ..() - - context[SCREENTIP_CONTEXT_ALT_RMB] = "Activate Evidence Disposal Explosive" - return CONTEXTUAL_SCREENTIP_SET - -/obj/item/storage/toolbox/guncase/traitor/PopulateContents() - new weapon_to_spawn (src) - for(var/i in 1 to 2) - new extra_to_spawn (src) - new ammo_box_to_spawn(src) - -/obj/item/storage/toolbox/guncase/traitor/update_icon_state() - . = ..() - if(currently_exploding) - icon_state = "[base_icon_state]_exploding" - else - icon_state = "[base_icon_state]" - -/obj/item/storage/toolbox/guncase/traitor/click_alt_secondary(mob/user) - . = ..() - if(currently_exploding) - user.balloon_alert(user, "already exploding!") - return - - var/i_dont_even_think_once_about_blowing_stuff_up = tgui_alert(user, "Would you like to activate the evidence disposal bomb now?", "BYE BYE", list("Yes","No")) - - if(i_dont_even_think_once_about_blowing_stuff_up != "Yes" || currently_exploding || QDELETED(user) || QDELETED(src) || user.can_perform_action(src, NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING)) - return - - explosion_timer = addtimer(CALLBACK(src, PROC_REF(think_fast_chucklenuts)), 5 SECONDS, (TIMER_UNIQUE|TIMER_OVERRIDE)) - to_chat(user, span_warning("You prime [src]'s evidence disposal bomb!")) - log_bomber(user, "has activated a", src, "for detonation") - playsound(src, 'sound/items/weapons/armbomb.ogg', 50, TRUE) - currently_exploding = TRUE - update_appearance() - -/// proc to handle our detonation -/obj/item/storage/toolbox/guncase/traitor/proc/think_fast_chucklenuts() - explosion(src, devastation_range = 0, heavy_impact_range = 0, light_impact_range = 2, explosion_cause = src) - qdel(src) - -/obj/item/storage/toolbox/guncase/traitor/ammunition - name = "makarov 9mm magazine case" - weapon_to_spawn = /obj/item/ammo_box/magazine/m9mm - -/obj/item/storage/toolbox/guncase/traitor/donksoft - name = "\improper Donksoft riot pistol gun case" - weapon_to_spawn = /obj/item/gun/ballistic/automatic/pistol/toy/riot/clandestine - extra_to_spawn = /obj/item/ammo_box/magazine/toy/pistol/riot - ammo_box_to_spawn = /obj/item/ammo_box/foambox/riot - -/obj/item/storage/toolbox/guncase/traitor/ammunition/donksoft - name = "\improper Donksoft riot pistol magazine case" - weapon_to_spawn = /obj/item/ammo_box/magazine/toy/pistol/riot - extra_to_spawn = /obj/item/ammo_box/magazine/toy/pistol/riot - ammo_box_to_spawn = /obj/item/ammo_box/foambox/riot - -/obj/item/storage/toolbox/guncase/bulldog - name = "bulldog gun case" - weapon_to_spawn = /obj/item/gun/ballistic/shotgun/bulldog - extra_to_spawn = /obj/item/ammo_box/magazine/m12g - -/obj/item/storage/toolbox/guncase/c20r - name = "c-20r gun case" - weapon_to_spawn = /obj/item/gun/ballistic/automatic/c20r - extra_to_spawn = /obj/item/ammo_box/magazine/smgm45 - -/obj/item/storage/toolbox/guncase/smartgun - name = "adielle smartgun case" - weapon_to_spawn = /obj/item/gun/ballistic/automatic/smartgun - extra_to_spawn = /obj/item/ammo_box/magazine/smartgun - -/obj/item/storage/toolbox/guncase/clandestine - name = "clandestine gun case" - weapon_to_spawn = /obj/item/gun/ballistic/automatic/pistol/clandestine - extra_to_spawn = /obj/item/ammo_box/magazine/m10mm - -/obj/item/storage/toolbox/guncase/m90gl - name = "m-90gl gun case" - weapon_to_spawn = /obj/item/gun/ballistic/automatic/m90 - extra_to_spawn = /obj/item/ammo_box/magazine/m223 - -/obj/item/storage/toolbox/guncase/m90gl/PopulateContents() - new weapon_to_spawn (src) - for(var/i in 1 to 2) - new extra_to_spawn (src) - new /obj/item/ammo_box/a40mm/rubber (src) - -/obj/item/storage/toolbox/guncase/rocketlauncher - name = "rocket launcher gun case" - weapon_to_spawn = /obj/item/gun/ballistic/rocketlauncher - extra_to_spawn = /obj/item/ammo_box/rocket - -/obj/item/storage/toolbox/guncase/rocketlauncher/PopulateContents() - new weapon_to_spawn (src) - new extra_to_spawn (src) - -/obj/item/storage/toolbox/guncase/revolver - name = "revolver gun case" - weapon_to_spawn = /obj/item/gun/ballistic/revolver/badass/nuclear - extra_to_spawn = /obj/item/ammo_box/a357 - -/obj/item/storage/toolbox/guncase/sword_and_board - name = "energy sword and shield weapon case" - weapon_to_spawn = /obj/item/melee/energy/sword - extra_to_spawn = /obj/item/shield/energy - -/obj/item/storage/toolbox/guncase/sword_and_board/PopulateContents() - new weapon_to_spawn (src) - new extra_to_spawn (src) - new /obj/item/clothing/head/costume/knight (src) - -/obj/item/storage/toolbox/guncase/cqc - name = "\improper CQC equipment case" - weapon_to_spawn = /obj/item/book/granter/martial/cqc - extra_to_spawn = /obj/item/storage/box/syndie_kit/imp_stealth - -/obj/item/storage/toolbox/guncase/cqc/PopulateContents() - new weapon_to_spawn (src) - new extra_to_spawn (src) - new /obj/item/clothing/head/costume/snakeeater (src) - new /obj/item/storage/fancy/cigarettes/cigpack_syndicate (src) - -/obj/item/clothing/head/costume/snakeeater - name = "strange bandana" - desc = "A bandana. It seems to have a little carp embroidered on the inside, as well as the kanji '魚'." - icon_state = "snake_eater" - inhand_icon_state = null - clothing_traits = list(TRAIT_FISH_EATER) - -/obj/item/clothing/head/costume/knight - name = "fake medieval helmet" - desc = "A classic metal helmet. Though, this one seems to be very obviously fake..." - icon = 'icons/obj/clothing/head/helmet.dmi' - worn_icon = 'icons/mob/clothing/head/helmet.dmi' - icon_state = "knight_green" - inhand_icon_state = "knight_helmet" - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT - flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH - dog_fashion = null - -/obj/item/storage/toolbox/guncase/doublesword - name = "double-bladed energy sword weapon case" - weapon_to_spawn = /obj/item/dualsaber - extra_to_spawn = /obj/item/soap/syndie - storage_type = /datum/storage/toolbox/guncase/doublesword - -/obj/item/storage/toolbox/guncase/doublesword/PopulateContents() - new weapon_to_spawn (src) - new extra_to_spawn (src) - new /obj/item/mod/module/noslip (src) - new /obj/item/reagent_containers/hypospray/medipen/methamphetamine (src) - new /obj/item/clothing/under/rank/prisoner/nosensor (src) - -/obj/item/storage/toolbox/guncase/soviet - name = "ancient gun case" - desc = "A weapon's case. Has the symbol of the Third Soviet Union stamped on the side." - icon_state = "sakhno_case" - inhand_icon_state = "sakhno_case" - weapon_to_spawn = /obj/effect/spawner/random/sakhno - extra_to_spawn = /obj/effect/spawner/random/sakhno/ammo - -/obj/item/storage/toolbox/guncase/monkeycase - name = "monkey gun case" - desc = "Everything a monkey needs to truly go ape-shit. There's a paw-shaped hand scanner lock on the front of the case." - -/obj/item/storage/toolbox/guncase/monkeycase/Initialize(mapload) - . = ..() - atom_storage.set_locked(STORAGE_SOFT_LOCKED) - -/obj/item/storage/toolbox/guncase/monkeycase/attack_self(mob/user, modifiers) - if(!monkey_check(user)) - return - return ..() - -/obj/item/storage/toolbox/guncase/monkeycase/attack_self_secondary(mob/user, modifiers) - attack_self(user, modifiers) - return - -/obj/item/storage/toolbox/guncase/monkeycase/attack_hand(mob/user, list/modifiers) - if(!monkey_check(user)) - return - return ..() - -/obj/item/storage/toolbox/guncase/monkeycase/proc/monkey_check(mob/user) - if(atom_storage.locked == STORAGE_NOT_LOCKED) - return TRUE - - if(is_simian(user)) - atom_storage.locked = STORAGE_NOT_LOCKED - to_chat(user, span_notice("You place your paw on the paw scanner, and hear a soft click as [src] unlocks!")) - playsound(src, 'sound/items/click.ogg', 25, TRUE) - return TRUE - to_chat(user, span_warning("You put your hand on the hand scanner, and it rejects it with an angry chimpanzee screech!")) - playsound(src, SFX_SCREECH, 75, TRUE) - return FALSE - -/obj/item/storage/toolbox/guncase/monkeycase/PopulateContents() - switch(rand(1, 3)) - if(1) - // Uzi with a boxcutter. - new /obj/item/gun/ballistic/automatic/mini_uzi/chimpgun(src) - new /obj/item/ammo_box/magazine/uzim9mm(src) - new /obj/item/ammo_box/magazine/uzim9mm(src) - new /obj/item/boxcutter/extended(src) - if(2) - // Thompson with a boxcutter. - new /obj/item/gun/ballistic/automatic/tommygun/chimpgun(src) - new /obj/item/ammo_box/magazine/tommygunm45(src) - new /obj/item/ammo_box/magazine/tommygunm45(src) - new /obj/item/boxcutter/extended(src) - if(3) - // M1911 with a switchblade and an extra banana bomb. - new /obj/item/gun/ballistic/automatic/pistol/m1911/chimpgun(src) - new /obj/item/ammo_box/magazine/m45(src) - new /obj/item/ammo_box/magazine/m45(src) - new /obj/item/switchblade/extended(src) - new /obj/item/food/grown/banana/bunch/monkeybomb(src) - - // Banana bomb! Basically a tiny flashbang for monkeys. - new /obj/item/food/grown/banana/bunch/monkeybomb(src) - // Somewhere to store it all. - new /obj/item/storage/backpack/messenger(src) diff --git a/code/game/objects/items/storage/toolboxes/_toolbox.dm b/code/game/objects/items/storage/toolboxes/_toolbox.dm new file mode 100644 index 00000000000..1a078bebec8 --- /dev/null +++ b/code/game/objects/items/storage/toolboxes/_toolbox.dm @@ -0,0 +1,160 @@ +/obj/item/storage/toolbox + name = "toolbox" + desc = "Danger. Very robust." + icon = 'icons/obj/storage/toolbox.dmi' + icon_state = "toolbox_default" + inhand_icon_state = "toolbox_default" + lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi' + obj_flags = CONDUCTS_ELECTRICITY + force = 13 + throwforce = 13 + throw_speed = 2 + throw_range = 7 + demolition_mod = 1.25 + w_class = WEIGHT_CLASS_BULKY + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*5) + attack_verb_continuous = list("robusts") + attack_verb_simple = list("robust") + hitsound = 'sound/items/weapons/smash.ogg' + drop_sound = 'sound/items/handling/toolbox/toolbox_drop.ogg' + pickup_sound = 'sound/items/handling/toolbox/toolbox_pickup.ogg' + material_flags = MATERIAL_EFFECTS | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS + wound_bonus = 5 + storage_type = /datum/storage/toolbox + + var/latches = "single_latch" + var/has_latches = TRUE + /// How many interactions are we currently performing + var/current_interactions = 0 + /// Items we should not interact with when left clicking + var/static/list/lmb_exception_typecache = typecacheof(list( + /obj/structure/table, + /obj/structure/rack, + /obj/structure/closet, + /obj/machinery/disposal, + )) + +/obj/item/storage/toolbox/Initialize(mapload) + . = ..() + if(has_latches) + if(prob(10)) + latches = "double_latch" + if(prob(1)) + latches = "triple_latch" + if(prob(0.1)) + latches = "quad_latch" // like winning the lottery, but worse + update_appearance() + AddElement(/datum/element/falling_hazard, damage = force, wound_bonus = wound_bonus, hardhat_safety = TRUE, crushes = FALSE, impact_sound = hitsound) + +/obj/item/storage/toolbox/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if (user.combat_mode || !user.has_hand_for_held_index(user.get_inactive_hand_index())) + return NONE + + if (is_type_in_typecache(interacting_with, lmb_exception_typecache) && !LAZYACCESS(modifiers, RIGHT_CLICK)) + return NONE + + if (current_interactions) + var/obj/item/other_tool = user.get_inactive_held_item() + if (!istype(other_tool)) // what even + return NONE + INVOKE_ASYNC(src, PROC_REF(use_tool_on), interacting_with, user, modifiers, other_tool) + return ITEM_INTERACT_SUCCESS + + if (user.get_inactive_held_item()) + user.balloon_alert(user, "hands busy!") + return ITEM_INTERACT_BLOCKING + + var/list/item_radial = list() + for (var/obj/item/tool in atom_storage.real_location) + if(is_type_in_list(tool, GLOB.tool_items)) + item_radial[tool] = tool.appearance + + if (!length(item_radial)) + return NONE + + playsound(user, 'sound/items/handling/toolbox/toolbox_open.ogg', 50) + var/obj/item/picked_item = show_radial_menu(user, interacting_with, item_radial, require_near = TRUE) + if (!picked_item) + return ITEM_INTERACT_BLOCKING + + playsound(user, 'sound/items/handling/toolbox/toolbox_rustle.ogg', 50) + if (!user.put_in_inactive_hand(picked_item)) + return ITEM_INTERACT_BLOCKING + + atom_storage.animate_parent() + if (istype(picked_item, /obj/item/weldingtool)) + var/obj/item/weldingtool/welder = picked_item + if (!welder.welding) + welder.attack_self(user) + + if (istype(picked_item, /obj/item/spess_knife)) + picked_item.attack_self(user) + + INVOKE_ASYNC(src, PROC_REF(use_tool_on), interacting_with, user, modifiers, picked_item) + return ITEM_INTERACT_SUCCESS + +/obj/item/storage/toolbox/proc/use_tool_on(atom/interacting_with, mob/living/user, list/modifiers, obj/item/picked_tool) + current_interactions += 1 + picked_tool.melee_attack_chain(user, interacting_with, modifiers) + current_interactions -= 1 + + if (QDELETED(picked_tool) || picked_tool.loc != user || !user.CanReach(picked_tool)) + current_interactions = 0 + return + + if (current_interactions) + return + + if (istype(picked_tool, /obj/item/weldingtool)) + var/obj/item/weldingtool/welder = picked_tool + if (welder.welding) + welder.attack_self(user) + + atom_storage.attempt_insert(picked_tool, user) + +/obj/item/storage/toolbox/update_overlays() + . = ..() + if(has_latches) + . += latches + +/obj/item/storage/toolbox/suicide_act(mob/living/user) + user.visible_message(span_suicide("[user] robusts [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) + return BRUTELOSS + +//repairbot assembly +/obj/item/storage/toolbox/tool_act(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/assembly/prox_sensor)) + return ..() + var/static/list/allowed_toolbox = list( + /obj/item/storage/toolbox/artistic, + /obj/item/storage/toolbox/crafter, + /obj/item/storage/toolbox/electrical, + /obj/item/storage/toolbox/emergency, + /obj/item/storage/toolbox/mechanical, + /obj/item/storage/toolbox/syndicate, + ) + + if(!is_type_in_list(src, allowed_toolbox) && (type != /obj/item/storage/toolbox)) + return ITEM_INTERACT_BLOCKING + if(contents.len >= 1) + balloon_alert(user, "not empty!") + return ITEM_INTERACT_BLOCKING + var/static/list/toolbox_colors = list( + /obj/item/storage/toolbox = "#445eb3", + /obj/item/storage/toolbox/emergency = "#445eb3", + /obj/item/storage/toolbox/electrical = "#b77931", + /obj/item/storage/toolbox/artistic = "#378752", + /obj/item/storage/toolbox/crafter = "#9D3282", + /obj/item/storage/toolbox/syndicate = "#3d3d3d", + ) + var/obj/item/bot_assembly/repairbot/repair = new + repair.toolbox = type + var/new_color = toolbox_colors[type] || "#445eb3" + repair.set_color(new_color) + user.put_in_hands(repair) + repair.update_appearance() + repair.balloon_alert(user, "sensor added!") + qdel(tool) + qdel(src) + return ITEM_INTERACT_SUCCESS diff --git a/code/game/objects/items/storage/toolboxes/emergency.dm b/code/game/objects/items/storage/toolboxes/emergency.dm new file mode 100644 index 00000000000..fe71f84f82b --- /dev/null +++ b/code/game/objects/items/storage/toolboxes/emergency.dm @@ -0,0 +1,25 @@ +/obj/item/storage/toolbox/emergency + name = "emergency toolbox" + icon_state = "red" + inhand_icon_state = "toolbox_red" + material_flags = NONE + throw_speed = 3 // red ones go faster + +/obj/item/storage/toolbox/emergency/PopulateContents() + new /obj/item/crowbar/red(src) + new /obj/item/weldingtool/mini(src) + new /obj/item/extinguisher/mini(src) + switch(rand(1,3)) + if(1) + new /obj/item/flashlight(src) + if(2) + new /obj/item/flashlight/glowstick(src) + if(3) + new /obj/item/flashlight/flare(src) + new /obj/item/radio/off(src) + +/obj/item/storage/toolbox/emergency/old + name = "rusty red toolbox" + icon_state = "toolbox_red_old" + has_latches = FALSE + material_flags = NONE diff --git a/code/game/objects/items/storage/toolboxes/fishing.dm b/code/game/objects/items/storage/toolboxes/fishing.dm new file mode 100644 index 00000000000..884649be939 --- /dev/null +++ b/code/game/objects/items/storage/toolboxes/fishing.dm @@ -0,0 +1,53 @@ + +/obj/item/storage/toolbox/fishing + name = "fishing toolbox" + desc = "Contains everything you need for your fishing trip." + icon_state = "teal" + inhand_icon_state = "toolbox_teal" + material_flags = NONE + custom_price = PAYCHECK_CREW * 3 + storage_type = /datum/storage/toolbox/fishing + + ///How much holding this affects fishing difficulty + var/fishing_modifier = -4 + +/obj/item/storage/toolbox/fishing/Initialize(mapload) + . = ..() + AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier, ITEM_SLOT_HANDS) + +/obj/item/storage/toolbox/fishing/PopulateContents() + new /obj/item/bait_can/worm(src) + new /obj/item/fishing_rod/unslotted(src) + new /obj/item/fishing_hook(src) + new /obj/item/fishing_line(src) + new /obj/item/paper/paperslip/fishing_tip(src) + +/obj/item/storage/toolbox/fishing/small + name = "compact fishing toolbox" + desc = "Contains everything you need for your fishing trip. Except for the bait." + w_class = WEIGHT_CLASS_NORMAL + force = 5 + throwforce = 5 + storage_type = /datum/storage/toolbox/fishing/small + +/obj/item/storage/toolbox/fishing/small/PopulateContents() + new /obj/item/fishing_rod/unslotted(src) + new /obj/item/fishing_hook(src) + new /obj/item/fishing_line(src) + new /obj/item/paper/paperslip/fishing_tip(src) + +/obj/item/storage/toolbox/fishing/master + name = "super fishing toolbox" + desc = "Contains (almost) EVERYTHING you need for your fishing trip." + icon_state = "gold" + inhand_icon_state = "toolbox_gold" + fishing_modifier = -10 + +/obj/item/storage/toolbox/fishing/master/PopulateContents() + new /obj/item/fishing_rod/telescopic/master(src) + new /obj/item/storage/box/fishing_hooks/master(src) + new /obj/item/storage/box/fishing_lines/master(src) + new /obj/item/bait_can/super_baits(src) + new /obj/item/reagent_containers/cup/fish_feed(src) + new /obj/item/aquarium_kit(src) + new /obj/item/fish_analyzer(src) diff --git a/code/game/objects/items/storage/toolboxes/mechanical.dm b/code/game/objects/items/storage/toolboxes/mechanical.dm new file mode 100644 index 00000000000..a818d620da2 --- /dev/null +++ b/code/game/objects/items/storage/toolboxes/mechanical.dm @@ -0,0 +1,70 @@ +/obj/item/storage/toolbox/mechanical + name = "mechanical toolbox" + icon_state = "blue" + inhand_icon_state = "toolbox_blue" + material_flags = NONE + /// If FALSE, someone with a ensouled soulstone can sacrifice a spirit to change the sprite of this toolbox. + var/has_soul = FALSE + +/obj/item/storage/toolbox/mechanical/PopulateContents() + new /obj/item/screwdriver(src) + new /obj/item/wrench(src) + new /obj/item/weldingtool(src) + new /obj/item/crowbar(src) + new /obj/item/analyzer(src) + new /obj/item/wirecutters(src) + +/obj/item/storage/toolbox/mechanical/old + name = "rusty blue toolbox" + icon_state = "toolbox_blue_old" + has_latches = FALSE + has_soul = TRUE + +/obj/item/storage/toolbox/mechanical/old/heirloom + name = "toolbox" //this will be named "X family toolbox" + desc = "It's seen better days." + force = 5 + w_class = WEIGHT_CLASS_NORMAL + storage_type = /datum/storage/toolbox/heirloom + +/obj/item/storage/toolbox/mechanical/old/heirloom/PopulateContents() + return + +// version of below that isn't a traitor item +/obj/item/storage/toolbox/mechanical/old/cleaner + name = "old blue toolbox" + icon_state = "oldtoolboxclean" + icon_state = "toolbox_blue_old" + +/obj/item/storage/toolbox/mechanical/old/clean // the assistant traitor toolbox, damage scales with TC inside + name = "toolbox" + desc = "An old, blue toolbox, it looks robust." + icon_state = "oldtoolboxclean" + inhand_icon_state = "toolbox_blue" + has_latches = FALSE + force = 19 + throwforce = 22 + +/obj/item/storage/toolbox/mechanical/old/clean/proc/calc_damage() + var/power = 0 + for (var/obj/item/stack/telecrystal/stored_crystals in get_all_contents()) + power += (stored_crystals.amount / 2) + force = initial(force) + power + throwforce = initial(throwforce) + power + +/obj/item/storage/toolbox/mechanical/old/clean/attack(mob/target, mob/living/user) + calc_damage() + ..() + +/obj/item/storage/toolbox/mechanical/old/clean/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + calc_damage() + ..() + +/obj/item/storage/toolbox/mechanical/old/clean/PopulateContents() + new /obj/item/screwdriver(src) + new /obj/item/wrench(src) + new /obj/item/weldingtool(src) + new /obj/item/crowbar(src) + new /obj/item/wirecutters(src) + new /obj/item/multitool(src) + new /obj/item/clothing/gloves/color/yellow(src) diff --git a/code/game/objects/items/storage/toolboxes/medical.dm b/code/game/objects/items/storage/toolboxes/medical.dm new file mode 100644 index 00000000000..0c9323212b6 --- /dev/null +++ b/code/game/objects/items/storage/toolboxes/medical.dm @@ -0,0 +1,44 @@ +/obj/item/storage/toolbox/medical + name = "medical toolbox" + desc = "A toolbox painted soft white and light blue. This is getting ridiculous." + icon_state = "medical" + inhand_icon_state = "toolbox_medical" + attack_verb_continuous = list("treats", "surgeries", "tends", "tends wounds on") + attack_verb_simple = list("treat", "surgery", "tend", "tend wounds on") + w_class = WEIGHT_CLASS_BULKY + material_flags = NONE + force = 5 // its for healing + wound_bonus = 25 // wounds are medical right? + /// Tray we steal the og contents from. + var/obj/item/surgery_tray/tray_type = /obj/item/surgery_tray + +/obj/item/storage/toolbox/medical/PopulateContents() + atom_storage.max_slots = 0 + atom_storage.max_total_storage = 0 + + var/atom/fake_tray = new tray_type(null) + for(var/obj/item/tool in fake_tray) + tool.forceMove(src) + atom_storage.max_slots += 1 + atom_storage.max_total_storage += tool.w_class + + qdel(fake_tray) + +/obj/item/storage/toolbox/medical/full + tray_type = /obj/item/surgery_tray/full + +/obj/item/storage/toolbox/medical/coroner + name = "coroner toolbox" + desc = "A toolbox painted soft white and dark grey. This is getting beyond ridiculous." + icon_state = "coroner" + inhand_icon_state = "toolbox_coroner" + attack_verb_continuous = list("dissects", "autopsies", "corones") + attack_verb_simple = list("dissect", "autopsy", "corone") + w_class = WEIGHT_CLASS_BULKY + material_flags = NONE + force = 17 // it's not for healing + tray_type = /obj/item/surgery_tray/full/morgue + +/obj/item/storage/toolbox/medical/coroner/Initialize(mapload) + . = ..() + AddElement(/datum/element/bane, mob_biotypes = MOB_UNDEAD, damage_multiplier = 1) //Just in case one of the tennants get uppity diff --git a/code/game/objects/items/storage/toolboxes/misc.dm b/code/game/objects/items/storage/toolboxes/misc.dm new file mode 100644 index 00000000000..f8701079bd0 --- /dev/null +++ b/code/game/objects/items/storage/toolboxes/misc.dm @@ -0,0 +1,62 @@ + +/obj/item/storage/toolbox/drone + name = "mechanical toolbox" + icon_state = "blue" + inhand_icon_state = "toolbox_blue" + material_flags = NONE + +/obj/item/storage/toolbox/drone/PopulateContents() + var/pickedcolor = pick("red","yellow","green","blue","pink","orange","cyan","white") + new /obj/item/screwdriver(src) + new /obj/item/wrench(src) + new /obj/item/weldingtool(src) + new /obj/item/crowbar(src) + new /obj/item/stack/cable_coil(src,MAXCOIL,pickedcolor) + new /obj/item/wirecutters(src) + new /obj/item/multitool(src) + +/obj/item/storage/toolbox/artistic + name = "artistic toolbox" + desc = "A toolbox painted bright green. Why anyone would store art supplies in a toolbox is beyond you, but it has plenty of extra space." + icon_state = "green" + inhand_icon_state = "toolbox_green" + w_class = WEIGHT_CLASS_GIGANTIC //Holds more than a regular toolbox! + material_flags = NONE + storage_type = /datum/storage/toolbox/artistic + +/obj/item/storage/toolbox/artistic/PopulateContents() + new /obj/item/storage/crayons(src) + new /obj/item/toy/crayon/spraycan(src) + new /obj/item/toy/crayon/spraycan(src) + new /obj/item/paint_palette(src) + new /obj/item/paint/anycolor(src) + new /obj/item/paint/anycolor(src) + new /obj/item/paint/anycolor(src) + +/obj/item/storage/toolbox/haunted + name = "old toolbox" + custom_materials = list(/datum/material/hauntium = SMALL_MATERIAL_AMOUNT*5) + +/obj/item/storage/toolbox/crafter + name = "crafter toolbox" + desc = "A toolbox painted hot pink. Full of crafting supplies!" + icon_state = "pink" + inhand_icon_state = "toolbox_pink" + w_class = WEIGHT_CLASS_GIGANTIC //Holds more than a regular toolbox! + material_flags = NONE + storage_type = /datum/storage/toolbox/crafter + +/obj/item/storage/toolbox/crafter/PopulateContents() + new /obj/item/storage/crayons(src) + new /obj/item/camera(src) + new /obj/item/camera_film(src) + new /obj/item/chisel(src) + new /obj/item/stack/pipe_cleaner_coil/red(src) + new /obj/item/stack/pipe_cleaner_coil/yellow(src) + new /obj/item/stack/pipe_cleaner_coil/blue(src) + new /obj/item/stack/pipe_cleaner_coil/green(src) + new /obj/item/stack/pipe_cleaner_coil/pink(src) + new /obj/item/stack/pipe_cleaner_coil/orange(src) + new /obj/item/stack/pipe_cleaner_coil/cyan(src) + new /obj/item/stack/pipe_cleaner_coil/white(src) + new /obj/item/stack/pipe_cleaner_coil/brown(src) diff --git a/code/game/objects/items/storage/toolboxes/service.dm b/code/game/objects/items/storage/toolboxes/service.dm new file mode 100644 index 00000000000..a12195cb5ea --- /dev/null +++ b/code/game/objects/items/storage/toolboxes/service.dm @@ -0,0 +1,21 @@ +/obj/item/storage/toolbox/electrical + name = "electrical toolbox" + icon_state = "yellow" + inhand_icon_state = "toolbox_yellow" + material_flags = NONE + +/obj/item/storage/toolbox/electrical/PopulateContents() + var/pickedcolor = pick(GLOB.cable_colors) + new /obj/item/screwdriver(src) + new /obj/item/wirecutters(src) + new /obj/item/t_scanner(src) + new /obj/item/crowbar(src) + var/obj/item/stack/cable_coil/new_cable_one = new(src, MAXCOIL) + new_cable_one.set_cable_color(pickedcolor) + var/obj/item/stack/cable_coil/new_cable_two = new(src, MAXCOIL) + new_cable_two.set_cable_color(pickedcolor) + if(prob(5)) + new /obj/item/clothing/gloves/color/yellow(src) + else + var/obj/item/stack/cable_coil/new_cable_three = new(src, MAXCOIL) + new_cable_three.set_cable_color(pickedcolor) diff --git a/code/game/objects/items/storage/toolboxes/weapons.dm b/code/game/objects/items/storage/toolboxes/weapons.dm new file mode 100644 index 00000000000..dd9ff07a3a2 --- /dev/null +++ b/code/game/objects/items/storage/toolboxes/weapons.dm @@ -0,0 +1,344 @@ + +/obj/item/storage/toolbox/syndicate + name = "tactical toolbox" // BUBBER EDIT CHANGE: Just a normal toolbox. Original: name = "suspicious looking toolbox" + icon_state = "syndicate" + inhand_icon_state = "toolbox_syndi" + force = 15 + throwforce = 18 + material_flags = NONE + storage_type = /datum/storage/toolbox/syndicate + + // BUBBER EDIT ADDITION BEGIN: Just a normal toolbox. + special_desc_requirement = EXAMINE_CHECK_SYNDICATE + special_desc = "A toolbox manufactured by the Syndicate containing extra tactical tools. Made of more robust materials than the average toolbox." + // BUBBER EDIT ADDITION END: Just a normal toolbox. + +/obj/item/storage/toolbox/syndicate/PopulateContents() + new /obj/item/screwdriver/nuke(src) + new /obj/item/wrench(src) + new /obj/item/weldingtool/largetank(src) + new /obj/item/crowbar/red(src) + new /obj/item/wirecutters(src, "red") + new /obj/item/multitool(src) + new /obj/item/clothing/gloves/combat(src) + + +/obj/item/storage/toolbox/ammobox + name = "ammo canister" + desc = "A metal canister designed to hold ammunition" + icon_state = "ammobox" + inhand_icon_state = "ammobox" + lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi' + has_latches = FALSE + drop_sound = 'sound/items/handling/ammobox_drop.ogg' + pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + var/ammo_to_spawn + +/obj/item/storage/toolbox/ammobox/PopulateContents() + if(!isnull(ammo_to_spawn)) + for(var/i in 1 to 6) + new ammo_to_spawn(src) + +/obj/item/storage/toolbox/ammobox/strilka310 + name = ".310 Strilka ammo box (Surplus?)" + desc = "It contains a few clips. Goddamn, this thing smells awful. \ + Has this been sitting in a warehouse for the last several centuries?" + ammo_to_spawn = /obj/item/ammo_box/strilka310 + +/obj/item/storage/toolbox/ammobox/strilka310/surplus + ammo_to_spawn = /obj/item/ammo_box/strilka310/surplus + +/obj/item/storage/toolbox/ammobox/wt550m9 + name = "4.6x30mm ammo box" + ammo_to_spawn = /obj/item/ammo_box/magazine/wt550m9 + +/obj/item/storage/toolbox/ammobox/wt550m9ap + name = "4.6x30mm AP ammo box" + ammo_to_spawn = /obj/item/ammo_box/magazine/wt550m9/wtap + + +/obj/item/storage/toolbox/guncase + name = "gun case" + desc = "A weapon's case. Has a blood-red 'S' stamped on the cover." + icon = 'icons/obj/storage/case.dmi' + icon_state = "infiltrator_case" + lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi' + inhand_icon_state = "infiltrator_case" + has_latches = FALSE + storage_type = /datum/storage/toolbox/guncase + var/weapon_to_spawn = /obj/item/gun/ballistic/automatic/pistol + var/extra_to_spawn = /obj/item/ammo_box/magazine/m9mm + +/obj/item/storage/toolbox/guncase/PopulateContents() + new weapon_to_spawn (src) + for(var/i in 1 to 3) + new extra_to_spawn (src) + +/obj/item/storage/toolbox/guncase/traitor + name = "makarov gun case" + desc = "A weapon's case. Has a blood-red 'S' stamped on the cover. There seems to be a strange switch along the side inside a plastic flap." + icon_state = "pistol_case" + base_icon_state = "pistol_case" + // What ammo box do we spawn in our case? + var/ammo_box_to_spawn = /obj/item/ammo_box/c9mm + // Timer for the bomb in the case. + var/explosion_timer + // Whether or not our case is exploding. Used for determining sprite changes. + var/currently_exploding = FALSE + +/obj/item/storage/toolbox/guncase/traitor/Initialize(mapload) + . = ..() + register_context() + +/obj/item/storage/toolbox/guncase/traitor/examine(mob/user) + . = ..() + . += span_notice("Activate the Evidence Disposal Explosive using Alt-Right-Click.") + +/obj/item/storage/toolbox/guncase/traitor/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + + context[SCREENTIP_CONTEXT_ALT_RMB] = "Activate Evidence Disposal Explosive" + return CONTEXTUAL_SCREENTIP_SET + +/obj/item/storage/toolbox/guncase/traitor/PopulateContents() + new weapon_to_spawn (src) + for(var/i in 1 to 2) + new extra_to_spawn (src) + new ammo_box_to_spawn(src) + +/obj/item/storage/toolbox/guncase/traitor/update_icon_state() + . = ..() + if(currently_exploding) + icon_state = "[base_icon_state]_exploding" + else + icon_state = "[base_icon_state]" + +/obj/item/storage/toolbox/guncase/traitor/click_alt_secondary(mob/user) + . = ..() + if(currently_exploding) + user.balloon_alert(user, "already exploding!") + return + + var/i_dont_even_think_once_about_blowing_stuff_up = tgui_alert(user, "Would you like to activate the evidence disposal bomb now?", "BYE BYE", list("Yes","No")) + + if(i_dont_even_think_once_about_blowing_stuff_up != "Yes" || currently_exploding || QDELETED(user) || QDELETED(src) || user.can_perform_action(src, NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING)) + return + + explosion_timer = addtimer(CALLBACK(src, PROC_REF(think_fast_chucklenuts)), 5 SECONDS, (TIMER_UNIQUE|TIMER_OVERRIDE)) + to_chat(user, span_warning("You prime [src]'s evidence disposal bomb!")) + log_bomber(user, "has activated a", src, "for detonation") + playsound(src, 'sound/items/weapons/armbomb.ogg', 50, TRUE) + currently_exploding = TRUE + update_appearance() + +/// proc to handle our detonation +/obj/item/storage/toolbox/guncase/traitor/proc/think_fast_chucklenuts() + explosion(src, devastation_range = 0, heavy_impact_range = 0, light_impact_range = 2, explosion_cause = src) + qdel(src) + +/obj/item/storage/toolbox/guncase/traitor/ammunition + name = "makarov 9mm magazine case" + weapon_to_spawn = /obj/item/ammo_box/magazine/m9mm + +/obj/item/storage/toolbox/guncase/traitor/donksoft + name = "\improper Donksoft riot pistol gun case" + weapon_to_spawn = /obj/item/gun/ballistic/automatic/pistol/toy/riot/clandestine + extra_to_spawn = /obj/item/ammo_box/magazine/toy/pistol/riot + ammo_box_to_spawn = /obj/item/ammo_box/foambox/riot + +/obj/item/storage/toolbox/guncase/traitor/ammunition/donksoft + name = "\improper Donksoft riot pistol magazine case" + weapon_to_spawn = /obj/item/ammo_box/magazine/toy/pistol/riot + extra_to_spawn = /obj/item/ammo_box/magazine/toy/pistol/riot + ammo_box_to_spawn = /obj/item/ammo_box/foambox/riot + +/obj/item/storage/toolbox/guncase/bulldog + name = "bulldog gun case" + weapon_to_spawn = /obj/item/gun/ballistic/shotgun/bulldog + extra_to_spawn = /obj/item/ammo_box/magazine/m12g + +/obj/item/storage/toolbox/guncase/c20r + name = "c-20r gun case" + weapon_to_spawn = /obj/item/gun/ballistic/automatic/c20r + extra_to_spawn = /obj/item/ammo_box/magazine/smgm45 + +/obj/item/storage/toolbox/guncase/smartgun + name = "adielle smartgun case" + weapon_to_spawn = /obj/item/gun/ballistic/automatic/smartgun + extra_to_spawn = /obj/item/ammo_box/magazine/smartgun + +/obj/item/storage/toolbox/guncase/clandestine + name = "clandestine gun case" + weapon_to_spawn = /obj/item/gun/ballistic/automatic/pistol/clandestine + extra_to_spawn = /obj/item/ammo_box/magazine/m10mm + +/obj/item/storage/toolbox/guncase/m90gl + name = "m-90gl gun case" + weapon_to_spawn = /obj/item/gun/ballistic/automatic/m90 + extra_to_spawn = /obj/item/ammo_box/magazine/m223 + +/obj/item/storage/toolbox/guncase/m90gl/PopulateContents() + new weapon_to_spawn (src) + for(var/i in 1 to 2) + new extra_to_spawn (src) + new /obj/item/ammo_box/a40mm/rubber (src) + +/obj/item/storage/toolbox/guncase/rocketlauncher + name = "rocket launcher gun case" + weapon_to_spawn = /obj/item/gun/ballistic/rocketlauncher + extra_to_spawn = /obj/item/ammo_box/rocket + +/obj/item/storage/toolbox/guncase/rocketlauncher/PopulateContents() + new weapon_to_spawn (src) + new extra_to_spawn (src) + +/obj/item/storage/toolbox/guncase/revolver + name = "revolver gun case" + weapon_to_spawn = /obj/item/gun/ballistic/revolver/badass/nuclear + extra_to_spawn = /obj/item/ammo_box/a357 + +/obj/item/storage/toolbox/guncase/sword_and_board + name = "energy sword and shield weapon case" + weapon_to_spawn = /obj/item/melee/energy/sword + extra_to_spawn = /obj/item/shield/energy + +/obj/item/storage/toolbox/guncase/sword_and_board/PopulateContents() + new weapon_to_spawn (src) + new extra_to_spawn (src) + new /obj/item/clothing/head/costume/knight (src) + +/obj/item/storage/toolbox/guncase/cqc + name = "\improper CQC equipment case" + weapon_to_spawn = /obj/item/book/granter/martial/cqc + extra_to_spawn = /obj/item/storage/box/syndie_kit/imp_stealth + +/obj/item/storage/toolbox/guncase/cqc/PopulateContents() + new weapon_to_spawn (src) + new extra_to_spawn (src) + new /obj/item/clothing/head/costume/snakeeater (src) + new /obj/item/storage/fancy/cigarettes/cigpack_syndicate (src) + +/obj/item/storage/toolbox/guncase/doublesword + name = "double-bladed energy sword weapon case" + weapon_to_spawn = /obj/item/dualsaber + extra_to_spawn = /obj/item/soap/syndie + storage_type = /datum/storage/toolbox/guncase/doublesword + +/obj/item/storage/toolbox/guncase/doublesword/PopulateContents() + new weapon_to_spawn (src) + new extra_to_spawn (src) + new /obj/item/mod/module/noslip (src) + new /obj/item/reagent_containers/hypospray/medipen/methamphetamine (src) + new /obj/item/clothing/under/rank/prisoner/nosensor (src) + +/obj/item/storage/toolbox/guncase/soviet + name = "ancient gun case" + desc = "A weapon's case. Has the symbol of the Third Soviet Union stamped on the side." + icon_state = "sakhno_case" + inhand_icon_state = "sakhno_case" + weapon_to_spawn = /obj/effect/spawner/random/sakhno + extra_to_spawn = /obj/effect/spawner/random/sakhno/ammo + +/obj/item/storage/toolbox/guncase/monkeycase + name = "monkey gun case" + desc = "Everything a monkey needs to truly go ape-shit. There's a paw-shaped hand scanner lock on the front of the case." + storage_type = /datum/storage/toolbox/guncase/monkey + +/obj/item/storage/toolbox/guncase/monkeycase/attack_self(mob/user, modifiers) + if(!monkey_check(user)) + return + return ..() + +/obj/item/storage/toolbox/guncase/monkeycase/attack_self_secondary(mob/user, modifiers) + attack_self(user, modifiers) + return + +/obj/item/storage/toolbox/guncase/monkeycase/attack_hand(mob/user, list/modifiers) + if(!monkey_check(user)) + return + return ..() + +/obj/item/storage/toolbox/guncase/monkeycase/proc/monkey_check(mob/user) + if(atom_storage.locked == STORAGE_NOT_LOCKED) + return TRUE + + if(is_simian(user)) + atom_storage.locked = STORAGE_NOT_LOCKED + to_chat(user, span_notice("You place your paw on the paw scanner, and hear a soft click as [src] unlocks!")) + playsound(src, 'sound/items/click.ogg', 25, TRUE) + return TRUE + to_chat(user, span_warning("You put your hand on the hand scanner, and it rejects it with an angry chimpanzee screech!")) + playsound(src, SFX_SCREECH, 75, TRUE) + return FALSE + +/obj/item/storage/toolbox/guncase/monkeycase/PopulateContents() + switch(rand(1, 3)) + if(1) + // Uzi with a boxcutter. + new /obj/item/gun/ballistic/automatic/mini_uzi/chimpgun(src) + new /obj/item/ammo_box/magazine/uzim9mm(src) + new /obj/item/ammo_box/magazine/uzim9mm(src) + new /obj/item/boxcutter/extended(src) + if(2) + // Thompson with a boxcutter. + new /obj/item/gun/ballistic/automatic/tommygun/chimpgun(src) + new /obj/item/ammo_box/magazine/tommygunm45(src) + new /obj/item/ammo_box/magazine/tommygunm45(src) + new /obj/item/boxcutter/extended(src) + if(3) + // M1911 with a switchblade and an extra banana bomb. + new /obj/item/gun/ballistic/automatic/pistol/m1911/chimpgun(src) + new /obj/item/ammo_box/magazine/m45(src) + new /obj/item/ammo_box/magazine/m45(src) + new /obj/item/switchblade/extended(src) + new /obj/item/food/grown/banana/bunch/monkeybomb(src) + + // Banana bomb! Basically a tiny flashbang for monkeys. + new /obj/item/food/grown/banana/bunch/monkeybomb(src) + // Somewhere to store it all. + new /obj/item/storage/backpack/messenger(src) + +/obj/item/storage/toolbox/emergency/turret + desc = "You feel a strange urge to hit this with a wrench." + +/obj/item/storage/toolbox/emergency/turret/PopulateContents() + new /obj/item/screwdriver(src) + new /obj/item/wrench/combat(src) + new /obj/item/weldingtool(src) + new /obj/item/crowbar(src) + new /obj/item/analyzer(src) + new /obj/item/wirecutters(src) + +/obj/item/storage/toolbox/emergency/turret/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/wrench/combat)) + return NONE + if(!user.combat_mode) + return NONE + if(!tool.toolspeed) + return ITEM_INTERACT_BLOCKING + balloon_alert(user, "constructing...") + if(!tool.use_tool(src, user, 2 SECONDS, volume = 20)) + return ITEM_INTERACT_BLOCKING + + balloon_alert(user, "constructed!") + user.visible_message( + span_danger("[user] bashes [src] with [tool]!"), + span_danger("You bash [src] with [tool]!"), + null, + COMBAT_MESSAGE_RANGE, + ) + + playsound(src, 'sound/items/tools/drill_use.ogg', 80, TRUE, -1) + var/obj/machinery/porta_turret/syndicate/toolbox/turret = new(get_turf(loc)) + set_faction(turret, user) + turret.toolbox = src + forceMove(turret) + return ITEM_INTERACT_SUCCESS + +/obj/item/storage/toolbox/emergency/turret/proc/set_faction(obj/machinery/porta_turret/turret, mob/user) + turret.faction = list("[REF(user)]") + +/obj/item/storage/toolbox/emergency/turret/nukie/set_faction(obj/machinery/porta_turret/turret, mob/user) + turret.faction = list(ROLE_SYNDICATE) diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index ea9add17f0f..1c179bb1495 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -576,13 +576,6 @@ Final word of caution: the technology involved is experimental in nature. Although many years of research have allowed us to prevent leaving your organs behind, it simply cannot account for all of the liquid in your body. "} -/obj/item/storage/box/syndie_kit/syndicate_teleporter - name = "syndicate teleporter kit" - -/obj/item/storage/box/syndie_kit/syndicate_teleporter/PopulateContents() - new /obj/item/syndicate_teleporter(src) - new /obj/item/paper/syndicate_teleporter(src) - /obj/effect/temp_visual/teleport_abductor/syndi_teleporter duration = 5 diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 0dac794f43b..5fd3378a98d 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1550,14 +1550,6 @@ icon_state = "pierced_illusion" item_flags = NO_PIXEL_RANDOM_DROP -/obj/item/storage/box/heretic_box - name = "box of pierced realities" - desc = "A box containing toys resembling pierced realities." - -/obj/item/storage/box/heretic_box/PopulateContents() - for(var/i in 1 to rand(1,4)) - new /obj/item/toy/reality_pierce(src) - /obj/item/toy/foamfinger name = "foam finger" desc = "root for the home team! wait, does this station even have a sports team?" diff --git a/code/modules/admin/verbs/anonymousnames.dm b/code/modules/admin/verbs/anonymousnames.dm index 21924288467..ae08790a57d 100644 --- a/code/modules/admin/verbs/anonymousnames.dm +++ b/code/modules/admin/verbs/anonymousnames.dm @@ -194,54 +194,6 @@ GLOBAL_DATUM(current_anonymous_theme, /datum/anonymous_theme) /datum/anonymous_theme/wizards/anonymous_ai_name(is_ai = FALSE) return "Crystallized Knowledge [is_ai ? "Nexus" : "Sliver"] +[rand(1,99)]" //Could two people roll the same number? Yeah, probably. Do I CARE? Nawww -/obj/item/storage/box/wizard_kit - name = "Generic Wizard Cosplay Kit" - -/obj/item/storage/box/wizard_kit/PopulateContents() - new /obj/item/clothing/head/wizard(src) - new /obj/item/clothing/suit/wizrobe(src) - new /obj/item/clothing/shoes/sandal(src) - -/obj/item/storage/box/wizard_kit/red - name = "Evocation Wizard Cosplay Kit" - -/obj/item/storage/box/wizard_kit/red/PopulateContents() - new /obj/item/clothing/head/wizard/red(src) - new /obj/item/clothing/suit/wizrobe/red(src) - new /obj/item/clothing/shoes/sandal(src) - -/obj/item/storage/box/wizard_kit/yellow - name = "Translocation Wizard Cosplay Kit" - -/obj/item/storage/box/wizard_kit/yellow/PopulateContents() - new /obj/item/clothing/head/wizard/yellow(src) - new /obj/item/clothing/suit/wizrobe/yellow(src) - new /obj/item/clothing/shoes/sandal(src) - -/obj/item/storage/box/wizard_kit/magusred - name = "Conjuration Wizard Cosplay Kit" - -/obj/item/storage/box/wizard_kit/yellow/PopulateContents() - new /obj/item/clothing/head/wizard/magus(src) - new /obj/item/clothing/suit/wizrobe/magusred(src) - new /obj/item/clothing/shoes/sandal(src) - -/obj/item/storage/box/wizard_kit/magusblue - name = "Transmutation Wizard Cosplay Kit" - -/obj/item/storage/box/wizard_kit/yellow/PopulateContents() - new /obj/item/clothing/head/wizard/magus(src) - new /obj/item/clothing/suit/wizrobe/magusblue(src) - new /obj/item/clothing/shoes/sandal(src) - -/obj/item/storage/box/wizard_kit/black - name = "Necromancy Wizard Cosplay Kit" - -/obj/item/storage/box/wizard_kit/black/PopulateContents() - new /obj/item/clothing/head/wizard/black(src) - new /obj/item/clothing/suit/wizrobe/black(src) - new /obj/item/clothing/shoes/sandal(src) - /datum/anonymous_theme/spider_clan name = "Spider Clan" diff --git a/code/modules/antagonists/traitor/contractor/contractor_items.dm b/code/modules/antagonists/traitor/contractor/contractor_items.dm index 90c495358f2..8d1dbf99e44 100644 --- a/code/modules/antagonists/traitor/contractor/contractor_items.dm +++ b/code/modules/antagonists/traitor/contractor/contractor_items.dm @@ -7,15 +7,6 @@ has_owner = TRUE ignore_suit_sensor_level = TRUE -/obj/item/storage/box/contractor/fulton_extraction - name = "Fulton Extraction Kit" - icon_state = "syndiebox" - illustration = "writing_syndie" - -/obj/item/storage/box/contractor/fulton_extraction/PopulateContents() - new /obj/item/extraction_pack/syndicate(src) - new /obj/item/fulton_core(src) - /obj/item/paper/contractor_guide name = "Contractor Guide" default_raw_text = {"Welcome agent, congratulations on your new position as contractor. On top of your already assigned objectives,\ diff --git a/code/modules/bitrunning/objects/gimmick_disks/_gimmick_disk.dm b/code/modules/bitrunning/objects/gimmick_disks/_gimmick_disk.dm index 2580d8620c7..8722b1ad27f 100644 --- a/code/modules/bitrunning/objects/gimmick_disks/_gimmick_disk.dm +++ b/code/modules/bitrunning/objects/gimmick_disks/_gimmick_disk.dm @@ -100,16 +100,3 @@ return return_flags - -/** - * Base container used for gimmick disks. - */ -/obj/item/storage/briefcase/secure/digital_storage - name = "digi-case" - desc = "It's made of AUTHENTIC digital leather and has a price-tag still attached. Its owner must be a real professional." - icon_state = "secure" - base_icon_state = "secure" - inhand_icon_state = "sec-case" - -/obj/item/storage/briefcase/secure/digital_storage/PopulateContents() - return diff --git a/code/modules/bitrunning/objects/gimmick_disks/dungeon_disk.dm b/code/modules/bitrunning/objects/gimmick_disks/dungeon_disk.dm index 559c7f022df..1a90072c884 100644 --- a/code/modules/bitrunning/objects/gimmick_disks/dungeon_disk.dm +++ b/code/modules/bitrunning/objects/gimmick_disks/dungeon_disk.dm @@ -104,45 +104,6 @@ var/our_amount = rand(20, 50) reagents.add_reagent(our_reagent, our_amount) -/obj/item/storage/box/alchemist_basic_chems - name = "box of alchemical bases" - desc = "Contains a set of basic reagents, for all your potion-making needs! If only you labeled them." - illustration = "beaker" - -/obj/item/storage/box/alchemist_basic_chems/PopulateContents() - for(var/i in 1 to 7) - if(prob(1)) - new /obj/item/reagent_containers/cup/glass/coffee(src) - continue - new /obj/item/reagent_containers/cup/bottle/alchemist_basic(src) - -/obj/item/storage/box/alchemist_random_chems - name = "box of potions" - desc = "An especially fancy box to keep your finished potions safe." - icon_state = "syndiebox" - illustration = "beaker" - -/obj/item/storage/box/alchemist_random_chems/PopulateContents() - for(var/i in 1 to 7) - if(prob(1)) - new /obj/item/reagent_containers/cup/glass/coffee(src) - continue - new /obj/item/reagent_containers/cup/bottle/alchemist_random(src) - -/obj/item/storage/box/alchemist_chemistry_kit - name = "box of alchemy tools" - desc = "Contains everything needed for the up and coming chemistry student to enact hazardous chemical mishaps in the comfort of their own home." - -/obj/item/storage/box/alchemist_chemistry_kit/PopulateContents() - new /obj/item/reagent_containers/cup/mortar(src) - new /obj/item/pestle(src) - new /obj/item/lighter/skull(src) - new /obj/item/ph_booklet(src) - new /obj/item/thermometer(src) - new /obj/item/storage/test_tube_rack/full(src) - new /obj/item/reagent_containers/cup/glass/coffee(src) - - /datum/bitrunning_gimmick/rogue name = "Rogue" @@ -169,15 +130,6 @@ /obj/item/bedsheet/black/rogue_cape name = "cape of DARKNESS" -/obj/item/storage/belt/fannypack/black/rogue - name = "fannypack of ULTIMATE DESPAIR" - -/obj/item/storage/belt/fannypack/black/rogue/PopulateContents() - new /obj/item/food/drug/saturnx(src) - new /obj/item/reagent_containers/cup/blastoff_ampoule(src) - new /obj/item/reagent_containers/hypospray/medipen/methamphetamine(src) - - /datum/bitrunning_gimmick/healer name = "Healer" diff --git a/code/modules/bitrunning/objects/gimmick_disks/sports_disk.dm b/code/modules/bitrunning/objects/gimmick_disks/sports_disk.dm index 556a1bf4414..ff70679e667 100644 --- a/code/modules/bitrunning/objects/gimmick_disks/sports_disk.dm +++ b/code/modules/bitrunning/objects/gimmick_disks/sports_disk.dm @@ -41,24 +41,6 @@ /obj/item/storage/cans/sixenergydrink, ) -/obj/item/storage/cans/sixenergydrink - name = "energy drink bottle ring" - desc = "Holds six energy drink cans. Remember to recycle when you're done!" - - /// Pool of energy drinks tm we may add from - var/list/energy_drink_options = list( - /obj/item/reagent_containers/cup/soda_cans/space_mountain_wind = 50, - /obj/item/reagent_containers/cup/soda_cans/monkey_energy = 30, - /obj/item/reagent_containers/cup/soda_cans/volt_energy = 15, - /obj/item/reagent_containers/cup/soda_cans/thirteenloko = 5, - ) - -/obj/item/storage/cans/sixenergydrink/PopulateContents() - for(var/i in 1 to 6) - var/obj/item/chosen_energy_drink = pick_weight(energy_drink_options) - new chosen_energy_drink(src) - - /datum/bitrunning_gimmick/archer name = "Archer" @@ -70,15 +52,6 @@ /obj/item/ammo_casing/arrow/holy/blazing, ) -/obj/item/storage/bag/quiver/endless - name = "endless quiver" - desc = "Holds arrows for your bow. A deep digital void is contained within." - storage_type = /datum/storage/bag/quiver/endless - -/obj/item/storage/bag/quiver/endless/PopulateContents() - . = ..() - new arrow_path(src) - /datum/bitrunning_gimmick/fisher name = "Fisher" @@ -107,24 +80,6 @@ /obj/item/storage/cans/sixgamerdrink, ) -/obj/item/storage/cans/sixgamerdrink - name = "gamer drink bottle ring" - desc = "Holds six gamer drink cans. Remember to recycle when you're done!" - - /// Pool of gamer drinks tm we may add from - var/list/gamer_drink_options = list( - /obj/item/reagent_containers/cup/soda_cans/pwr_game = 55, - /obj/item/reagent_containers/cup/soda_cans/space_mountain_wind = 15, - /obj/item/reagent_containers/cup/soda_cans/monkey_energy = 15, - /obj/item/reagent_containers/cup/soda_cans/volt_energy = 10, - /obj/item/reagent_containers/cup/soda_cans/thirteenloko = 5, - ) - -/obj/item/storage/cans/sixgamerdrink/PopulateContents() - for(var/i in 1 to 6) - var/obj/item/chosen_gamer_drink = pick_weight(gamer_drink_options) - new chosen_gamer_drink(src) - /obj/item/modular_computer/laptop/gamer desc = "A high-end laptop often used for metagaming." device_theme = PDA_THEME_TERMINAL diff --git a/code/modules/bitrunning/objects/loot_box.dm b/code/modules/bitrunning/objects/loot_box.dm deleted file mode 100644 index bd23a7c0512..00000000000 --- a/code/modules/bitrunning/objects/loot_box.dm +++ /dev/null @@ -1,53 +0,0 @@ -/obj/item/storage/lockbox/bitrunning - name = "base class curiosity" - desc = "Talk to a coder." - req_access = list(ACCESS_INACCESSIBLE) - icon_state = "bitrunning+l" - inhand_icon_state = "bitrunning" - base_icon_state = "bitrunning" - icon_locked = "bitrunning+l" - icon_closed = "bitrunning" - icon_broken = "bitrunning+b" - icon_open = "bitrunning" - -/obj/item/storage/lockbox/bitrunning/encrypted - name = "encrypted curiosity" - desc = "Needs to be decrypted at the safehouse to be opened." - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - /// Path for the loot we are assigned - var/loot_path - -/obj/item/storage/lockbox/bitrunning/encrypted/emag_act(mob/user, obj/item/card/emag/emag_card) - return FALSE - -/obj/item/storage/lockbox/bitrunning/decrypted - name = "decrypted curiosity" - desc = "Compiled from the virtual domain. An extra reward of a successful bitrunner." - storage_type = /datum/storage/lockbox/bitrunning_decrypted - - /// What virtual domain did we come from. - var/datum/lazy_template/virtual_domain/source_domain - -/obj/item/storage/lockbox/bitrunning/decrypted/Initialize( - mapload, - datum/lazy_template/virtual_domain/completed_domain, - ) - - if(isnull(completed_domain)) - log_runtime("Decrypted curiosity was created with no source domain.") - return INITIALIZE_HINT_QDEL - - if(!istype(completed_domain, /datum/lazy_template/virtual_domain)) // Check if this is a proper virtual domain before doing anything with it - log_runtime("Decrypted curiosity was created with an invalid source domain. [completed_domain.name] ([completed_domain.type]).") - return INITIALIZE_HINT_QDEL - - source_domain = completed_domain - - . = ..() - - icon_state = icon_closed - playsound(src, 'sound/effects/magic/blink.ogg', 50, TRUE) - -/obj/item/storage/lockbox/bitrunning/decrypted/PopulateContents() - var/choice = SSbitrunning.pick_secondary_loot(source_domain) - new choice(src) diff --git a/code/modules/clothing/head/costume.dm b/code/modules/clothing/head/costume.dm index a9a70101afb..c7e1777fc9c 100644 --- a/code/modules/clothing/head/costume.dm +++ b/code/modules/clothing/head/costume.dm @@ -208,3 +208,22 @@ desc = "A delicate hairpin normally paired with traditional clothing" icon_state = "hairpin_fancy" inhand_icon_state = "hairpin_fancy" + + +/obj/item/clothing/head/costume/snakeeater + name = "strange bandana" + desc = "A bandana. It seems to have a little carp embroidered on the inside, as well as the kanji '魚'." + icon_state = "snake_eater" + inhand_icon_state = null + clothing_traits = list(TRAIT_FISH_EATER) + +/obj/item/clothing/head/costume/knight + name = "fake medieval helmet" + desc = "A classic metal helmet. Though, this one seems to be very obviously fake..." + icon = 'icons/obj/clothing/head/helmet.dmi' + worn_icon = 'icons/mob/clothing/head/helmet.dmi' + icon_state = "knight_green" + inhand_icon_state = "knight_helmet" + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT + flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH + dog_fashion = null diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm index 030d2e6c25a..8c4427d3961 100644 --- a/code/modules/detectivework/evidence.dm +++ b/code/modules/detectivework/evidence.dm @@ -72,11 +72,3 @@ span_hear("You hear someone rustle around in a plastic bag, and remove something.")) playsound(src,'sound/items/evidence_bag/evidence_bag_unzip.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, ignore_walls = FALSE) atom_storage.remove_all() - -/obj/item/storage/box/evidence - name = "evidence bag box" - desc = "A box claiming to contain evidence bags." - -/obj/item/storage/box/evidence/PopulateContents() - for(var/i in 1 to 6) - new /obj/item/evidencebag(src) diff --git a/code/modules/events/shuttle_loan/shuttle_loan_items.dm b/code/modules/events/shuttle_loan/shuttle_loan_items.dm index 14257a6a80b..729e15cad46 100644 --- a/code/modules/events/shuttle_loan/shuttle_loan_items.dm +++ b/code/modules/events/shuttle_loan/shuttle_loan_items.dm @@ -1,9 +1,3 @@ - -/obj/item/storage/belt/fannypack/yellow/bee_terrorist/PopulateContents() - new /obj/item/grenade/c4 (src) - new /obj/item/reagent_containers/applicator/pill/cyanide(src) - new /obj/item/grenade/chem_grenade/facid(src) - /obj/item/paper/fluff/bee_objectives name = "Objectives of a Bee Liberation Front Operative" default_raw_text = "Objective #1. Liberate all bees on the NT transport vessel 2416/B. Success!
Objective #2. Escape alive. Failed." diff --git a/code/modules/fishing/aquarium/aquarium_kit.dm b/code/modules/fishing/aquarium/aquarium_kit.dm index 71be9a10f56..1360cc089d4 100644 --- a/code/modules/fishing/aquarium/aquarium_kit.dm +++ b/code/modules/fishing/aquarium/aquarium_kit.dm @@ -183,13 +183,3 @@ desc = "A very small plastic treaure chest, with nothing inside. You could put this in an aquarium, and it'll look like very small pirates hid treasure in there. Wouldn't that be nice?" icon_state = "treasure" layer_mode = AQUARIUM_LAYER_MODE_BOTTOM - -/obj/item/storage/box/aquarium_props - name = "aquarium props box" - desc = "All you need to make your aquarium look good." - illustration = "fish" - custom_price = PAYCHECK_LOWER - -/obj/item/storage/box/aquarium_props/PopulateContents() - for(var/prop_type in subtypesof(/obj/item/aquarium_prop)) - new prop_type(src) diff --git a/code/modules/fishing/fishing_equipment.dm b/code/modules/fishing/fishing_equipment.dm index 86eefe72461..d19ed599669 100644 --- a/code/modules/fishing/fishing_equipment.dm +++ b/code/modules/fishing/fishing_equipment.dm @@ -324,93 +324,6 @@ var/mob/living/living_target = target living_target.apply_status_effect(/datum/status_effect/grouped/hooked/jaws, rod.fishing_line) -/obj/item/storage/toolbox/fishing - name = "fishing toolbox" - desc = "Contains everything you need for your fishing trip." - icon_state = "teal" - inhand_icon_state = "toolbox_teal" - material_flags = NONE - custom_price = PAYCHECK_CREW * 3 - storage_type = /datum/storage/toolbox/fishing - - ///How much holding this affects fishing difficulty - var/fishing_modifier = -4 - -/obj/item/storage/toolbox/fishing/Initialize(mapload) - . = ..() - - AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier, ITEM_SLOT_HANDS) - -/obj/item/storage/toolbox/fishing/PopulateContents() - new /obj/item/bait_can/worm(src) - new /obj/item/fishing_rod/unslotted(src) - new /obj/item/fishing_hook(src) - new /obj/item/fishing_line(src) - new /obj/item/paper/paperslip/fishing_tip(src) - -/obj/item/storage/toolbox/fishing/small - name = "compact fishing toolbox" - desc = "Contains everything you need for your fishing trip. Except for the bait." - w_class = WEIGHT_CLASS_NORMAL - force = 5 - throwforce = 5 - storage_type = /datum/storage/toolbox/fishing/small - -/obj/item/storage/toolbox/fishing/small/PopulateContents() - new /obj/item/fishing_rod/unslotted(src) - new /obj/item/fishing_hook(src) - new /obj/item/fishing_line(src) - new /obj/item/paper/paperslip/fishing_tip(src) - -/obj/item/storage/toolbox/fishing/master - name = "super fishing toolbox" - desc = "Contains (almost) EVERYTHING you need for your fishing trip." - icon_state = "gold" - inhand_icon_state = "toolbox_gold" - fishing_modifier = -10 - -/obj/item/storage/toolbox/fishing/master/PopulateContents() - new /obj/item/fishing_rod/telescopic/master(src) - new /obj/item/storage/box/fishing_hooks/master(src) - new /obj/item/storage/box/fishing_lines/master(src) - new /obj/item/bait_can/super_baits(src) - new /obj/item/reagent_containers/cup/fish_feed(src) - new /obj/item/aquarium_kit(src) - new /obj/item/fish_analyzer(src) - -/obj/item/storage/box/fishing_hooks - name = "fishing hook set" - illustration = "fish" - custom_price = PAYCHECK_CREW * 2 - -/obj/item/storage/box/fishing_hooks/PopulateContents() - new /obj/item/fishing_hook/magnet(src) - new /obj/item/fishing_hook/shiny(src) - new /obj/item/fishing_hook/weighted(src) - -/obj/item/storage/box/fishing_hooks/master - -/obj/item/storage/box/fishing_hooks/master/PopulateContents() - . = ..() - new /obj/item/fishing_hook/stabilized(src) - new /obj/item/fishing_hook/jaws(src) - -/obj/item/storage/box/fishing_lines - name = "fishing line set" - illustration = "fish" - custom_price = PAYCHECK_CREW * 2 - -/obj/item/storage/box/fishing_lines/PopulateContents() - new /obj/item/fishing_line/bouncy(src) - new /obj/item/fishing_line/reinforced(src) - new /obj/item/fishing_line/cloaked(src) - -/obj/item/storage/box/fishing_lines/master - -/obj/item/storage/box/fishing_lines/master/PopulateContents() - . = ..() - new /obj/item/fishing_line/auto_reel(src) - ///Used to give the average player info about fishing stuff that's unknown to many. /obj/item/paper/paperslip/fishing_tip name = "fishing tip" @@ -420,34 +333,6 @@ default_raw_text = pick(GLOB.fishing_tips) return ..() -///From the fishing mystery box. It's basically a lazarus and a few bottles of strange reagents. -/obj/item/storage/box/fish_revival_kit - name = "fish revival kit" - desc = "Become a fish doctor today. A label on the side indicates that fish require two to ten reagent units to be splashed onto them for revival, depending on size." - illustration = "fish" - -/obj/item/storage/box/fish_revival_kit/PopulateContents() - new /obj/item/lazarus_injector(src) - new /obj/item/reagent_containers/cup/bottle/fishy_reagent(src) - new /obj/item/reagent_containers/cup(src) //to splash the reagents on the fish. - new /obj/item/storage/fish_case(src) - new /obj/item/storage/fish_case(src) - -/obj/item/storage/box/fishing_lures - name = "fishing lures set" - desc = "A small tackle box containing all the fishing lures you will ever need to curb randomness." - icon_state = "plasticbox" - foldable_result = null - illustration = "fish" - custom_price = PAYCHECK_CREW * 9 - storage_type = /datum/storage/box/fishing_lures - -/obj/item/storage/box/fishing_lures/PopulateContents() - new /obj/item/paper/lures_instructions(src) - var/list/typesof = subtypesof(/obj/item/fishing_lure) - for(var/type in typesof) - new type (src) - /obj/item/paper/lures_instructions name = "instructions paper" icon_state = "slipfull" diff --git a/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm b/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm index bc36823ebc8..419d25d6517 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm @@ -89,14 +89,6 @@ GLOBAL_VAR_INIT(fscpassword, generate_password()) . = ..() AddComponent(/datum/component/gps, "Old Encrypted Signal") -/obj/item/storage/box/firingpins/syndicate - name = "box of syndicate firing pins" - desc = "A box full of special syndicate firing pins which allow only syndicate operatives to use weapons with those firing pins." - -/obj/item/storage/box/firingpins/syndicate/PopulateContents() - for(var/i in 1 to 5) - new /obj/item/firing_pin/implant/pindicate(src) - /////////// AI Laws /obj/item/ai_module/core/full/cybersun diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm deleted file mode 100644 index 99e7b802f15..00000000000 --- a/code/modules/mining/money_bag.dm +++ /dev/null @@ -1,35 +0,0 @@ -/*****************************Money bag********************************/ - -/obj/item/storage/bag/money - name = "money bag" - desc = "A bag for storing your profits." - icon_state = "moneybag" - worn_icon_state = "moneybag" - force = 10 - throwforce = 0 - resistance_flags = FLAMMABLE - max_integrity = 100 - w_class = WEIGHT_CLASS_BULKY - storage_type = /datum/storage/bag/money - -/obj/item/storage/bag/money/Initialize(mapload) - . = ..() - if(prob(20)) - icon_state = "moneybagalt" - -/obj/item/storage/bag/money/vault/PopulateContents() - new /obj/item/coin/silver(src) - new /obj/item/coin/silver(src) - new /obj/item/coin/silver(src) - new /obj/item/coin/silver(src) - new /obj/item/coin/gold(src) - new /obj/item/coin/gold(src) - new /obj/item/coin/adamantine(src) - -///Used in the dutchmen pirate shuttle. -/obj/item/storage/bag/money/dutchmen/PopulateContents() - for(var/iteration in 1 to 9) - new /obj/item/coin/silver/doubloon(src) - for(var/iteration in 1 to 9) - new /obj/item/coin/gold/doubloon(src) - new /obj/item/coin/adamantine/doubloon(src) diff --git a/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm b/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm deleted file mode 100644 index 165a26a24bc..00000000000 --- a/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm +++ /dev/null @@ -1,33 +0,0 @@ - -/obj/item/storage/bag/quiver - name = "quiver" - desc = "Holds arrows for your bow. Good, because while pocketing arrows is possible, it surely can't be pleasant." - icon = 'icons/obj/weapons/bows/quivers.dmi' - icon_state = "quiver" - inhand_icon_state = null - worn_icon_state = "harpoon_quiver" - storage_type = /datum/storage/bag/quiver - - /// type of arrow the quivel should hold - var/arrow_path = /obj/item/ammo_casing/arrow - -/obj/item/storage/bag/quiver/lesser - storage_type = /datum/storage/bag/quiver/less - -/obj/item/storage/bag/quiver/full/PopulateContents() - . = ..() - for(var/i in 1 to 10) - new arrow_path(src) - -/obj/item/storage/bag/quiver/holy - name = "divine quiver" - desc = "Holds arrows for your divine bow, where they wait to find their target." - icon_state = "holyquiver" - inhand_icon_state = "holyquiver" - worn_icon_state = "holyquiver" - arrow_path = /obj/item/ammo_casing/arrow/holy - -/obj/item/storage/bag/quiver/holy/PopulateContents() - . = ..() - for(var/i in 1 to 10) - new arrow_path(src) diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm index 844c8064e86..b531d96d221 100644 --- a/code/modules/projectiles/guns/energy/dueling.dm +++ b/code/modules/projectiles/guns/energy/dueling.dm @@ -352,29 +352,6 @@ B.dismember() qdel(B) -//Storage case. -/obj/item/storage/lockbox/dueling - name = "dueling pistol case" - desc = "Let's solve this like gentlespacemen." - icon_state = "medalbox+l" - inhand_icon_state = "syringe_kit" - lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - w_class = WEIGHT_CLASS_NORMAL - req_access = list(ACCESS_CAPTAIN) - icon_locked = "medalbox+l" - icon_closed = "medalbox" - icon_broken = "medalbox+b" - base_icon_state = "medalbox" - icon_open = "medalboxopen" - storage_type = /datum/storage/lockbox/dueling - -/obj/item/storage/lockbox/dueling/PopulateContents() - . = ..() - var/obj/item/gun/energy/dueling/gun_A = new(src) - var/obj/item/gun/energy/dueling/gun_B = new(src) - new /datum/duel(gun_A, gun_B) - #undef DUEL_IDLE #undef DUEL_PREPARATION #undef DUEL_READY diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm index d604344ba98..69e5afa8af6 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm @@ -358,15 +358,3 @@ if(prob(60/severity)) to_chat(owner, span_warning("Your breathing tube suddenly closes!")) owner.losebreath += 2 - -//BOX O' IMPLANTS - -/obj/item/storage/box/cyber_implants - name = "boxed cybernetic implants" - desc = "A sleek, sturdy box." - icon_state = "cyber_implants" - -/obj/item/storage/box/cyber_implants/PopulateContents() - new /obj/item/autosurgeon/syndicate/xray_eyes(src) - new /obj/item/autosurgeon/syndicate/anti_stun(src) - new /obj/item/autosurgeon/syndicate/reviver(src) diff --git a/code/modules/vehicles/mecha/mecha_control_console.dm b/code/modules/vehicles/mecha/mecha_control_console.dm index 51797f28f23..e8ce25b0ba1 100644 --- a/code/modules/vehicles/mecha/mecha_control_console.dm +++ b/code/modules/vehicles/mecha/mecha_control_console.dm @@ -149,16 +149,3 @@ name = "exosuit AI control beacon" desc = "A device used to transmit exosuit data. Also allows active AI units to take control of said exosuit." ai_beacon = TRUE - -/obj/item/storage/box/mechabeacons - name = "exosuit tracking beacons" - -/obj/item/storage/box/mechabeacons/PopulateContents() - ..() - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) diff --git a/tgstation.dme b/tgstation.dme index 2ab84bddd03..901457f78c9 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2878,6 +2878,7 @@ #include "code\game\objects\items\storage\basket.dm" #include "code\game\objects\items\storage\belt.dm" #include "code\game\objects\items\storage\briefcase.dm" +#include "code\game\objects\items\storage\dufflebags.dm" #include "code\game\objects\items\storage\fancy.dm" #include "code\game\objects\items\storage\garment.dm" #include "code\game\objects\items\storage\holsters.dm" @@ -2886,21 +2887,30 @@ #include "code\game\objects\items\storage\pillbottles.dm" #include "code\game\objects\items\storage\sixpack.dm" #include "code\game\objects\items\storage\storage.dm" -#include "code\game\objects\items\storage\toolbox.dm" #include "code\game\objects\items\storage\uplink_kits.dm" #include "code\game\objects\items\storage\wallets.dm" #include "code\game\objects\items\storage\boxes\_boxes.dm" #include "code\game\objects\items\storage\boxes\cargo_boxes.dm" #include "code\game\objects\items\storage\boxes\clothes_boxes.dm" #include "code\game\objects\items\storage\boxes\engineering_boxes.dm" +#include "code\game\objects\items\storage\boxes\fishing_boxes.dm" #include "code\game\objects\items\storage\boxes\flat_boxes.dm" #include "code\game\objects\items\storage\boxes\food_boxes.dm" #include "code\game\objects\items\storage\boxes\implant_boxes.dm" #include "code\game\objects\items\storage\boxes\job_boxes.dm" #include "code\game\objects\items\storage\boxes\medical_boxes.dm" +#include "code\game\objects\items\storage\boxes\misc.dm" #include "code\game\objects\items\storage\boxes\science_boxes.dm" #include "code\game\objects\items\storage\boxes\security_boxes.dm" #include "code\game\objects\items\storage\boxes\service_boxes.dm" +#include "code\game\objects\items\storage\toolboxes\_toolbox.dm" +#include "code\game\objects\items\storage\toolboxes\emergency.dm" +#include "code\game\objects\items\storage\toolboxes\fishing.dm" +#include "code\game\objects\items\storage\toolboxes\mechanical.dm" +#include "code\game\objects\items\storage\toolboxes\medical.dm" +#include "code\game\objects\items\storage\toolboxes\misc.dm" +#include "code\game\objects\items\storage\toolboxes\service.dm" +#include "code\game\objects\items\storage\toolboxes\weapons.dm" #include "code\game\objects\items\tanks\jetpack.dm" #include "code\game\objects\items\tanks\tank_types.dm" #include "code\game\objects\items\tanks\tanks.dm" @@ -3824,7 +3834,6 @@ #include "code\modules\bitrunning\objects\hololadder.dm" #include "code\modules\bitrunning\objects\host_monitor.dm" #include "code\modules\bitrunning\objects\landmarks.dm" -#include "code\modules\bitrunning\objects\loot_box.dm" #include "code\modules\bitrunning\objects\loot_crate.dm" #include "code\modules\bitrunning\objects\quantum_console.dm" #include "code\modules\bitrunning\objects\vendor.dm" @@ -4963,7 +4972,6 @@ #include "code\modules\mining\machine_stacking.dm" #include "code\modules\mining\machine_unloading.dm" #include "code\modules\mining\mine_items.dm" -#include "code\modules\mining\money_bag.dm" #include "code\modules\mining\ores_coins.dm" #include "code\modules\mining\satchel_ore_box.dm" #include "code\modules\mining\shelters.dm" @@ -5921,7 +5929,6 @@ #include "code\modules\projectiles\guns\ballistic\toy.dm" #include "code\modules\projectiles\guns\ballistic\bows\_bow.dm" #include "code\modules\projectiles\guns\ballistic\bows\bow_arrows.dm" -#include "code\modules\projectiles\guns\ballistic\bows\bow_quivers.dm" #include "code\modules\projectiles\guns\ballistic\bows\bow_types.dm" #include "code\modules\projectiles\guns\energy\beam_rifle.dm" #include "code\modules\projectiles\guns\energy\crank_guns.dm"