From e858e934f757276e9b93d8caee1358823a639739 Mon Sep 17 00:00:00 2001 From: Paxilmaniac <82386923+Paxilmaniac@users.noreply.github.com> Date: Sun, 26 Nov 2023 14:15:14 -0500 Subject: [PATCH] Deforest Medical Cargo Company Update | Not so free healthcare | Medbay watches in horror as assistants overdose themselves on dollar store medpens (#24771) * injectors of various types * adds a timer to injecting others with the pens * fixes some of the stuff * fixes the do after * replaces the old pens and chems with the new ones in the company * fixes that too * fixes injector icons * gives all of the pens a slight debuff chem so its not all upsides * stack items and prepacked medkits * as usual, bug fixes * makes those names different * stops accidentally overriding multiver pill bottles * sprites for bigger bags, mob sprites soon to come * big medkitted all over the place * removes unused check * should fix tests * removes a single conceptually stupid injector * changes a few thing saround * nerfs pentibinin * adjusts a few of the pens to be a bit better and or worse * fixes the wearable medkits not being to carry the things they spawn with * makes the orange wearable unzip faster and slow down less unzipped * buffs the bags by allowing belt usage * puts the tiny wound analyzers in some of the medkits * lets the splint work on muscle issues, changes the sound a bit * tweaks worn sprites of and gives inhands to wearable medkits * removes debug message * adjusts some numbers and docs * adds some of the kits to cargo so medbay can order in bulk * adds some of the medical stuff to opfor as well * gives all the medkits unique inhands * tweaks a lot of the stuff (pickup sounds wahoo!) * adds a little more to using the instant wound healing kits * adds tox damage to twitch overdose so you cannot become fucking invincbl * makes the comment style more similar across the code * lets the frontier kit be hooked onto belts + owrn sprite for it * makes the bandages not get ruined by bleeds as fast * Update code/__DEFINES/~skyrat_defines/opposing_force_defines.dm Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com> * Update code/__DEFINES/~skyrat_defines/opposing_force_defines.dm Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com> * makes the big surgical kit come stocked * Update modular_skyrat/modules/deforest_medical_items/code/chemicals/demoneye.dm Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com> * reviews for some of demoneye * Update modular_skyrat/modules/deforest_medical_items/code/chemicals/demoneye.dm Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com> * Update modular_skyrat/modules/deforest_medical_items/code/chemicals/demoneye.dm Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com> * makes the demoneye organ damage list static * Update modular_skyrat/modules/deforest_medical_items/code/chemicals/twitch.dm Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com> * more review stuff * reviews for the injectors * Update modular_skyrat/modules/deforest_medical_items/code/storage_items.dm Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com> * Update modular_skyrat/modules/deforest_medical_items/code/storage_items.dm Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com> * updates the civil defense kit's sprite to be a bit better * formats the cargo packs a bit nicer * fixes a slight logic error * fixes an erroneous comment * makes the big surgery kit able to hold, and come with a rollerbed * moves that static list a bit * fixes first responder surgical kit's left inhand * makes the combat surgeon kit not missing sprite when worn * makes the rapid wound fixers actually get used, reworks medkits slightly * messes with the big surgical kit AGAIN * makes demoneye need stable plasma to cook to stop conflicts * Update modular_skyrat/modules/deforest_medical_items/code/storage_items.dm Co-authored-by: sqnztb * Update modular_skyrat/modules/deforest_medical_items/code/storage_items.dm Co-authored-by: sqnztb * Fixes the trait that had to be moved! * fixes demon-eye colors and twitch afterimage length --------- Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com> Co-authored-by: sqnztb Co-authored-by: GoldenAlpharex --- .../~skyrat_defines/opposing_force_defines.dm | 18 +- .../~skyrat_defines/traits/declarations.dm | 3 + code/_globalvars/traits/_traits.dm | 1 + code/_globalvars/traits/admin_tooling.dm | 1 + .../code/armament_datums/deforest_medical.dm | 204 +++++------- .../code/cargo_packs.dm | 31 ++ .../code/chemicals/demoneye.dm | 173 ++++++++++ .../code/chemicals/twitch.dm | 216 ++++++++++++ .../code/healing_stack_items.dm | 178 ++++++++++ .../code/illegal_injectors.dm | 70 ++++ .../deforest_medical_items/code/injectors.dm | 206 ++++++++++++ .../code/storage_items.dm | 314 ++++++++++++++++++ .../code/vulnerable_status_effect.dm | 28 ++ .../icons/inhands/cases_lefthand.dmi | Bin 0 -> 1371 bytes .../icons/inhands/cases_righthand.dmi | Bin 0 -> 1417 bytes .../icons/injectors.dmi | Bin 0 -> 3180 bytes .../icons/stack_items.dmi | Bin 0 -> 1183 bytes .../deforest_medical_items/icons/storage.dmi | Bin 0 -> 2042 bytes .../icons/worn/worn.dmi | Bin 0 -> 1087 bytes .../icons/worn/worn_teshari.dmi | Bin 0 -> 1051 bytes .../opposing_force/code/equipment/gadgets.dm | 19 -- .../opposing_force/code/equipment/medical.dm | 58 ++++ tgstation.dme | 9 + 23 files changed, 1385 insertions(+), 144 deletions(-) create mode 100644 modular_skyrat/modules/deforest_medical_items/code/cargo_packs.dm create mode 100644 modular_skyrat/modules/deforest_medical_items/code/chemicals/demoneye.dm create mode 100644 modular_skyrat/modules/deforest_medical_items/code/chemicals/twitch.dm create mode 100644 modular_skyrat/modules/deforest_medical_items/code/healing_stack_items.dm create mode 100644 modular_skyrat/modules/deforest_medical_items/code/illegal_injectors.dm create mode 100644 modular_skyrat/modules/deforest_medical_items/code/injectors.dm create mode 100644 modular_skyrat/modules/deforest_medical_items/code/storage_items.dm create mode 100644 modular_skyrat/modules/deforest_medical_items/code/vulnerable_status_effect.dm create mode 100644 modular_skyrat/modules/deforest_medical_items/icons/inhands/cases_lefthand.dmi create mode 100644 modular_skyrat/modules/deforest_medical_items/icons/inhands/cases_righthand.dmi create mode 100644 modular_skyrat/modules/deforest_medical_items/icons/injectors.dmi create mode 100644 modular_skyrat/modules/deforest_medical_items/icons/stack_items.dmi create mode 100644 modular_skyrat/modules/deforest_medical_items/icons/storage.dmi create mode 100644 modular_skyrat/modules/deforest_medical_items/icons/worn/worn.dmi create mode 100644 modular_skyrat/modules/deforest_medical_items/icons/worn/worn_teshari.dmi create mode 100644 modular_skyrat/modules/opposing_force/code/equipment/medical.dm diff --git a/code/__DEFINES/~skyrat_defines/opposing_force_defines.dm b/code/__DEFINES/~skyrat_defines/opposing_force_defines.dm index 60030663f7b..c0c67e2a11d 100644 --- a/code/__DEFINES/~skyrat_defines/opposing_force_defines.dm +++ b/code/__DEFINES/~skyrat_defines/opposing_force_defines.dm @@ -61,17 +61,19 @@ // Melee #define OPFOR_EQUIPMENT_CATEGORY_MELEE "13. Melee Weapons" #define OPFOR_EQUIPMENT_CATEGORY_MELEE_STEALTH "14. Stealthy Melee Weapons" +// Medical items +#define OPFOR_EQUIPMENT_CATEGORY_MEDICAL "15. Medical Items" // Gadgets -#define OPFOR_EQUIPMENT_CATEGORY_GADGET "15. Gadgets" -#define OPFOR_EQUIPMENT_CATEGORY_GADGET_STEALTH "16. Stealthy Gadgets" +#define OPFOR_EQUIPMENT_CATEGORY_GADGET "16. Gadgets" +#define OPFOR_EQUIPMENT_CATEGORY_GADGET_STEALTH "17. Stealthy Gadgets" // Bombs -#define OPFOR_EQUIPMENT_CATEGORY_BOMB_CHEM "17. Chemical Grenades" -#define OPFOR_EQUIPMENT_CATEGORY_BOMB_PAYLOAD "18. Dirty Bombs" +#define OPFOR_EQUIPMENT_CATEGORY_BOMB_CHEM "18. Chemical Grenades" +#define OPFOR_EQUIPMENT_CATEGORY_BOMB_PAYLOAD "19. Dirty Bombs" // Spells and scrolls (martial arts) -#define OPFOR_EQUIPMENT_CATEGORY_SPELLS "19. Spells" -#define OPFOR_EQUIPMENT_CATEGORY_SCROLLS "20. Martial Art Scrolls" +#define OPFOR_EQUIPMENT_CATEGORY_SPELLS "20. Spells" +#define OPFOR_EQUIPMENT_CATEGORY_SCROLLS "21. Martial Art Scrolls" // Language and biology -#define OPFOR_EQUIPMENT_CATEGORY_LANGUAGE "21. Language" -#define OPFOR_EQUIPMENT_CATEGORY_ORGANS "22. Organs" +#define OPFOR_EQUIPMENT_CATEGORY_LANGUAGE "22. Language" +#define OPFOR_EQUIPMENT_CATEGORY_ORGANS "23. Organs" // Category for uncategorized items #define OPFOR_EQUIPMENT_CATEGORY_OTHER "Other" diff --git a/code/__DEFINES/~skyrat_defines/traits/declarations.dm b/code/__DEFINES/~skyrat_defines/traits/declarations.dm index 9bda321330e..02fd3f4157a 100644 --- a/code/__DEFINES/~skyrat_defines/traits/declarations.dm +++ b/code/__DEFINES/~skyrat_defines/traits/declarations.dm @@ -88,6 +88,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Trait that was granted by a reagent. #define TRAIT_REAGENT "reagent" +/// Trait source for anything granted by narcotics +#define TRAIT_NARCOTICS "narcotics_given" + /// trait that lets you do flips with a style meter #define TRAIT_STYLISH "stylish" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 9bd3cf35b48..e88ffbee11f 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -587,6 +587,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_MASOCHISM" = TRAIT_MASOCHISM, "TRAIT_MOOD_NOEXAMINE" = TRAIT_MOOD_NOEXAMINE, "TRAIT_MUTANT_IMMUNE" = TRAIT_MUTANT_IMMUNE, + "TRAIT_NARCOTICS" = TRAIT_NARCOTICS, "TRAIT_NEVERBONER" = TRAIT_NEVERBONER, "TRAIT_NIFSOFT" = TRAIT_NIFSOFT, "TRAIT_NIFSOFT_HUD_GRANTER" = TRAIT_NIFSOFT_HUD_GRANTER, diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 164bf0b6f01..c6147516da4 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -307,6 +307,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_MASOCHISM" = TRAIT_MASOCHISM, "TRAIT_MOOD_NOEXAMINE" = TRAIT_MOOD_NOEXAMINE, "TRAIT_MUTANT_IMMUNE" = TRAIT_MUTANT_IMMUNE, + "TRAIT_NARCOTICS" = TRAIT_NARCOTICS, "TRAIT_NEVERBONER" = TRAIT_NEVERBONER, "TRAIT_NIFSOFT" = TRAIT_NIFSOFT, "TRAIT_NIFSOFT_HUD_GRANTER" = TRAIT_NIFSOFT_HUD_GRANTER, diff --git a/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm b/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm index d6e5be0049e..c9bd351f5f2 100644 --- a/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm +++ b/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm @@ -2,110 +2,129 @@ category = DEFOREST_MEDICAL_NAME company_bitflag = CARGO_COMPANY_DEFOREST +// Precompiled first aid kits, ready to go if you don't want to bother getting individual items + +/datum/armament_entry/company_import/deforest/first_aid_kit + subcategory = "First-Aid Kits" + +/datum/armament_entry/company_import/deforest/first_aid_kit/civil_defense + item_type = /obj/item/storage/medkit/civil_defense/stocked + cost = PAYCHECK_COMMAND * 4 + +/datum/armament_entry/company_import/deforest/first_aid_kit/frontier + item_type = /obj/item/storage/medkit/frontier/stocked + cost = PAYCHECK_COMMAND * 5 + +/datum/armament_entry/company_import/deforest/first_aid_kit/combat_surgeon + item_type = /obj/item/storage/medkit/combat_surgeon/stocked + cost = PAYCHECK_COMMAND * 6 + +/datum/armament_entry/company_import/deforest/first_aid_kit/first_responder + item_type = /obj/item/storage/backpack/duffelbag/deforest_surgical/stocked + cost = PAYCHECK_COMMAND * 10 + +/datum/armament_entry/company_import/deforest/first_aid_kit/orange_satchel + item_type = /obj/item/storage/backpack/duffelbag/deforest_medkit/stocked + cost = PAYCHECK_COMMAND * 15 + // Basic first aid supplies like gauze, sutures, mesh, so on /datum/armament_entry/company_import/deforest/first_aid subcategory = "First-Aid Consumables" -/datum/armament_entry/company_import/deforest/first_aid/gauze - item_type = /obj/item/stack/medical/gauze/twelve - cost = PAYCHECK_LOWER -/datum/armament_entry/company_import/deforest/first_aid/bruise_pack - item_type = /obj/item/stack/medical/bruise_pack - cost = PAYCHECK_LOWER - -/datum/armament_entry/company_import/deforest/first_aid/ointment - item_type = /obj/item/stack/medical/ointment +/datum/armament_entry/company_import/deforest/first_aid/coagulant + item_type = /obj/item/stack/medical/suture/coagulant cost = PAYCHECK_LOWER -/datum/armament_entry/company_import/deforest/first_aid/suture - item_type = /obj/item/stack/medical/suture +/datum/armament_entry/company_import/deforest/first_aid/red_sun + item_type = /obj/item/stack/medical/ointment/red_sun cost = PAYCHECK_LOWER -/datum/armament_entry/company_import/deforest/first_aid/mesh - item_type = /obj/item/stack/medical/mesh +/datum/armament_entry/company_import/deforest/first_aid/sterile_gauze + item_type = /obj/item/stack/medical/gauze/sterilized cost = PAYCHECK_LOWER -/datum/armament_entry/company_import/deforest/first_aid/bone_gel - item_type = /obj/item/stack/medical/bone_gel +/datum/armament_entry/company_import/deforest/first_aid/amollin + item_type = /obj/item/storage/pill_bottle/painkiller cost = PAYCHECK_CREW -/datum/armament_entry/company_import/deforest/first_aid/medicated_sutures - item_type = /obj/item/stack/medical/suture/medicated - cost = PAYCHECK_CREW +/datum/armament_entry/company_import/deforest/first_aid/subdermal_splint + item_type = /obj/item/stack/medical/wound_recovery + cost = PAYCHECK_COMMAND * 2 -/datum/armament_entry/company_import/deforest/first_aid/advanced_mesh - item_type = /obj/item/stack/medical/mesh/advanced - cost = PAYCHECK_CREW +/datum/armament_entry/company_import/deforest/first_aid/rapid_coagulant + item_type = /obj/item/stack/medical/wound_recovery/rapid_coagulant + cost = PAYCHECK_COMMAND * 2 + +// Autoinjectors for healing /datum/armament_entry/company_import/deforest/medpens - subcategory = "Autoinjectors" + subcategory = "Medical Autoinjectors" cost = PAYCHECK_COMMAND * 1.5 -/datum/armament_entry/company_import/deforest/medpens/epipen - item_type = /obj/item/reagent_containers/hypospray/medipen +/datum/armament_entry/company_import/deforest/medpens/occuisate + item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/occuisate -/datum/armament_entry/company_import/deforest/medpens/emergency_pen - item_type = /obj/item/reagent_containers/hypospray/medipen/ekit +/datum/armament_entry/company_import/deforest/medpens/morpital + item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/morpital -/datum/armament_entry/company_import/deforest/medpens/blood_loss - item_type = /obj/item/reagent_containers/hypospray/medipen/blood_loss +/datum/armament_entry/company_import/deforest/medpens/lipital + item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/lipital -/datum/armament_entry/company_import/deforest/medpens/atropine - item_type = /obj/item/reagent_containers/hypospray/medipen/atropine +/datum/armament_entry/company_import/deforest/medpens/meridine + item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/meridine -/datum/armament_entry/company_import/deforest/medpens/oxandrolone - item_type = /obj/item/reagent_containers/hypospray/medipen/oxandrolone +/datum/armament_entry/company_import/deforest/medpens/calopine + item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/calopine -/datum/armament_entry/company_import/deforest/medpens/salacid - item_type = /obj/item/reagent_containers/hypospray/medipen/salacid +/datum/armament_entry/company_import/deforest/medpens/coagulants + item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/coagulants -/datum/armament_entry/company_import/deforest/medpens/penacid - item_type = /obj/item/reagent_containers/hypospray/medipen/penacid +/datum/armament_entry/company_import/deforest/medpens/lepoturi + item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/lepoturi -/datum/armament_entry/company_import/deforest/medpens/salbutamol - item_type = /obj/item/reagent_containers/hypospray/medipen/salbutamol +/datum/armament_entry/company_import/deforest/medpens/psifinil + item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/psifinil -// Various chemicals, with a box of syringes to come with +/datum/armament_entry/company_import/deforest/medpens/halobinin + item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/halobinin -/datum/armament_entry/company_import/deforest/medical_chems - subcategory = "Chemical Supplies" +/datum/armament_entry/company_import/deforest/medpens/pentibinin + item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/pentibinin + contraband = TRUE -/datum/armament_entry/company_import/deforest/medical_chems/syringes - item_type = /obj/item/storage/box/syringes - cost = PAYCHECK_LOWER +// Autoinjectors for fighting -/datum/armament_entry/company_import/deforest/medical_chems/epinephrine - item_type = /obj/item/reagent_containers/cup/bottle/epinephrine - cost = PAYCHECK_CREW +/datum/armament_entry/company_import/deforest/medpens_stim + subcategory = "Stimulant Autoinjectors" + cost = PAYCHECK_COMMAND * 2 -/datum/armament_entry/company_import/deforest/medical_chems/mannitol - item_type = /obj/item/reagent_containers/cup/bottle/mannitol - cost = PAYCHECK_CREW +/datum/armament_entry/company_import/deforest/medpens_stim/adrenaline + item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/adrenaline -/datum/armament_entry/company_import/deforest/medical_chems/morphine - item_type = /obj/item/reagent_containers/cup/bottle/morphine - cost = PAYCHECK_CREW +/datum/armament_entry/company_import/deforest/medpens_stim/synephrine + item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/synephrine -/datum/armament_entry/company_import/deforest/medical_chems/multiver - item_type = /obj/item/reagent_containers/cup/bottle/multiver - cost = PAYCHECK_CREW +/datum/armament_entry/company_import/deforest/medpens_stim/krotozine + item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/krotozine -/datum/armament_entry/company_import/deforest/medical_chems/formadehyde - item_type = /obj/item/reagent_containers/cup/bottle/formaldehyde - cost = PAYCHECK_CREW +/datum/armament_entry/company_import/deforest/medpens_stim/aranepaine + item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/aranepaine + contraband = TRUE -/datum/armament_entry/company_import/deforest/medical_chems/potassium_iodide - item_type = /obj/item/reagent_containers/cup/bottle/potass_iodide - cost = PAYCHECK_CREW +/datum/armament_entry/company_import/deforest/medpens_stim/synalvipitol + item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/synalvipitol + contraband = TRUE -/datum/armament_entry/company_import/deforest/medical_chems/atropine - item_type = /obj/item/reagent_containers/cup/bottle/atropine - cost = PAYCHECK_CREW +/datum/armament_entry/company_import/deforest/medpens_stim/twitch + item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/twitch + cost = PAYCHECK_COMMAND * 3 + contraband = TRUE -/datum/armament_entry/company_import/deforest/medical_chems/syriniver - item_type = /obj/item/reagent_containers/cup/bottle/syriniver - cost = PAYCHECK_CREW +/datum/armament_entry/company_import/deforest/medpens_stim/demoneye + item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/demoneye + cost = PAYCHECK_COMMAND * 3 + contraband = TRUE // Equipment, from defibs to scanners to surgical tools @@ -177,52 +196,3 @@ /datum/armament_entry/company_import/deforest/medical_modules/surgical_processor name = "MOD surgical processor module" item_type = /obj/item/mod/module/surgical_processor - -// Various advanced cybernetic organs, organ replacements for the rich - -/datum/armament_entry/company_import/deforest/cyber_organs - subcategory = "Premium Cybernetic Organs" - cost = PAYCHECK_CREW * 3 - -/datum/armament_entry/company_import/deforest/cyber_organs/eyes - name = "shielded cybernetic eyes" - item_type = /obj/item/storage/organbox/advanced_cyber_eyes - -/datum/armament_entry/company_import/deforest/cyber_organs/ears - name = "upgraded cybernetic ears" - item_type = /obj/item/storage/organbox/advanced_cyber_ears - -/datum/armament_entry/company_import/deforest/cyber_organs/heart - name = "upgraded cybernetic heart" - item_type = /obj/item/storage/organbox/advanced_cyber_heart - -/datum/armament_entry/company_import/deforest/cyber_organs/liver - name = "upgraded cybernetic liver" - item_type = /obj/item/storage/organbox/advanced_cyber_liver - -/datum/armament_entry/company_import/deforest/cyber_organs/lungs - name = "upgraded cybernetic lungs" - item_type = /obj/item/storage/organbox/advanced_cyber_lungs - -/datum/armament_entry/company_import/deforest/cyber_organs/stomach - name = "upgraded cybernetic stomach" - item_type = /obj/item/storage/organbox/advanced_cyber_stomach - -/datum/armament_entry/company_import/deforest/cyber_organs/augments - cost = PAYCHECK_COMMAND * 2 - -/datum/armament_entry/company_import/deforest/cyber_organs/augments/nutriment - name = "Nutriment pump implant" - item_type = /obj/item/organ/internal/cyberimp/chest/nutriment - -/datum/armament_entry/company_import/deforest/cyber_organs/augments/reviver - name = "Reviver implant" - item_type = /obj/item/organ/internal/cyberimp/chest/reviver - -/datum/armament_entry/company_import/deforest/cyber_organs/augments/surgery_implant - name = "surgical toolset implant" - item_type = /obj/item/organ/internal/cyberimp/arm/surgery - -/datum/armament_entry/company_import/deforest/cyber_organs/augments/breathing_tube - name = "breathing tube implant" - item_type = /obj/item/organ/internal/cyberimp/mouth/breathing_tube diff --git a/modular_skyrat/modules/deforest_medical_items/code/cargo_packs.dm b/modular_skyrat/modules/deforest_medical_items/code/cargo_packs.dm new file mode 100644 index 00000000000..ab38a07a646 --- /dev/null +++ b/modular_skyrat/modules/deforest_medical_items/code/cargo_packs.dm @@ -0,0 +1,31 @@ +/datum/supply_pack/medical/civil_defense + name = "Civil Defense Medical Kit Crate" + crate_name = "civil defense medical kit crate" + desc = "Contains five civil defense medical kits, small packs of injectors meant to be passed out to the public in case of emergency." + access = ACCESS_MEDICAL + cost = CARGO_CRATE_VALUE * 10 // 2000 + contains = list( + /obj/item/storage/medkit/civil_defense/stocked = 5, + ) + +/datum/supply_pack/medical/frontier_first_aid + name = "Frontier First Aid Crate" + crate_name = "frontier first aid crate" + desc = "Contains two of each of frontier medical kits, and combat surgeon medical kits." + access = ACCESS_MEDICAL + cost = CARGO_CRATE_VALUE * 10 + contains = list( + /obj/item/storage/medkit/frontier/stocked = 2, + /obj/item/storage/medkit/combat_surgeon/stocked = 2, + ) + +/datum/supply_pack/medical/heavy_duty_medical + name = "Heavy Duty Medical Kit Crate" + crate_name = "heavy duty medical kit crate" + desc = "Contains a large satchel medical kit, and a first responder surgical kit." + access = ACCESS_MEDICAL + cost = CARGO_CRATE_VALUE * 10 + contains = list( + /obj/item/storage/backpack/duffelbag/deforest_medkit/stocked, + /obj/item/storage/backpack/duffelbag/deforest_surgical/stocked, + ) diff --git a/modular_skyrat/modules/deforest_medical_items/code/chemicals/demoneye.dm b/modular_skyrat/modules/deforest_medical_items/code/chemicals/demoneye.dm new file mode 100644 index 00000000000..475315bede3 --- /dev/null +++ b/modular_skyrat/modules/deforest_medical_items/code/chemicals/demoneye.dm @@ -0,0 +1,173 @@ +#define CONSTANT_DOSE_SAFE_LIMIT 60 +#define METABOLISM_END_LIMB_DAMAGE 20 + +// Chemical reaction, turns 25 input reagents into 25 output reagents, 10 of those being demoneye +/datum/chemical_reaction/demoneye + results = list( + /datum/reagent/drug/demoneye = 10, + /datum/reagent/impurity/healing/medicine_failure = 10, + /datum/reagent/impurity = 5, + ) + required_reagents = list( + /datum/reagent/medicine/ephedrine = 5, + /datum/reagent/blood = 15, + /datum/reagent/stable_plasma = 5, + ) + mob_react = FALSE + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_ORGAN | REACTION_TAG_DAMAGING + +// Demoneye, a drug that makes you temporarily immune to fear and crit, in exchange for damaging all of your organs and making your veins explode +/datum/reagent/drug/demoneye + name = "DemonEye" + description = "A performance enhancing drug originally developed on mars. \ + A favorite among gangs and other outlaws on the planet, though overuse can cause terrible addiction and bodily damage." + reagent_state = LIQUID + color = "#af00be" + taste_description = "industrial shuttle fuel" + metabolization_rate = 0.65 * REAGENTS_METABOLISM + ph = 7 + overdose_threshold = 15 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + addiction_types = list(/datum/addiction/stimulants = 15) + /// How much time has the drug been in them? + var/constant_dose_time = 0 + /// What the original color of the user's left eye is + var/user_left_eye_color + /// What the original color of the user's right eye is + var/user_right_eye_color + +/datum/reagent/drug/demoneye/on_mob_metabolize(mob/living/carbon/human/our_guy) + . = ..() + + ADD_TRAIT(our_guy, TRAIT_UNNATURAL_RED_GLOWY_EYES, TRAIT_NARCOTICS) + // IM FUCKIN INVINCIBLE + ADD_TRAIT(our_guy, TRAIT_NOSOFTCRIT, TRAIT_NARCOTICS) + ADD_TRAIT(our_guy, TRAIT_NOHARDCRIT, TRAIT_NARCOTICS) + ADD_TRAIT(our_guy, TRAIT_FEARLESS, TRAIT_NARCOTICS) + ADD_TRAIT(our_guy, TRAIT_NUMBED, TRAIT_NARCOTICS) + + user_left_eye_color = our_guy.eye_color_left + user_right_eye_color = our_guy.eye_color_right + + our_guy.eye_color_left = BLOODCULT_EYE + our_guy.eye_color_right = BLOODCULT_EYE + our_guy.update_body() + + our_guy.sound_environment_override = SOUND_ENVIRONMENT_PSYCHOTIC + + if(!our_guy.hud_used) + return + + var/atom/movable/plane_master_controller/game_plane_master_controller = our_guy.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] + + var/static/list/col_filter_red = list(0.7,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1) + + game_plane_master_controller.add_filter("demoneye_filter", 10, color_matrix_filter(col_filter_red, FILTER_COLOR_RGB)) + + game_plane_master_controller.add_filter("demoneye_blur", 1, list("type" = "angular_blur", "size" = 4)) + + for(var/filter in game_plane_master_controller.get_filters("demoneye_blur")) + animate(filter, loop = -1, size = 2, time = 3 SECONDS, easing = ELASTIC_EASING|EASE_OUT, flags = ANIMATION_PARALLEL) + animate(size = 5, time = 3 SECONDS, easing = ELASTIC_EASING|EASE_IN) + + +/datum/reagent/drug/demoneye/on_mob_end_metabolize(mob/living/carbon/human/our_guy) + . = ..() + + REMOVE_TRAIT(our_guy, TRAIT_UNNATURAL_RED_GLOWY_EYES, TRAIT_NARCOTICS) + REMOVE_TRAIT(our_guy, TRAIT_NOSOFTCRIT, TRAIT_NARCOTICS) + REMOVE_TRAIT(our_guy, TRAIT_NOHARDCRIT, TRAIT_NARCOTICS) + REMOVE_TRAIT(our_guy, TRAIT_FEARLESS, TRAIT_NARCOTICS) + REMOVE_TRAIT(our_guy, TRAIT_NUMBED, TRAIT_NARCOTICS) + + our_guy.eye_color_left = user_left_eye_color + our_guy.eye_color_right = user_right_eye_color + our_guy.update_body() + + our_guy.sound_environment_override = NONE + + if(constant_dose_time < CONSTANT_DOSE_SAFE_LIMIT || !our_guy.blood_volume) + our_guy.visible_message( + span_danger("[our_guy]'s eyes fade from their evil looking red back to normal..."), + span_danger("Your vision slowly returns to normal as you lose your unnatural strength...") + ) + else + our_guy.visible_message( + span_danger("[our_guy]'s veins violently explode, spraying blood everywhere!"), + span_danger("Your veins burst from the sheer stress put on them!") + ) + + var/obj/item/bodypart/bodypart = pick(our_guy.bodyparts) + var/datum/wound/slash/flesh/critical/crit_wound = new() + crit_wound.apply_wound(bodypart) + bodypart.receive_damage(brute = METABOLISM_END_LIMB_DAMAGE, wound_bonus = CANT_WOUND) + + new /obj/effect/temp_visual/cleave(our_guy.drop_location()) + + if(overdosed && !our_guy.has_status_effect(/datum/status_effect/vulnerable_to_damage)) + our_guy.apply_status_effect(/datum/status_effect/vulnerable_to_damage) + + if(!our_guy.hud_used) + return + + var/atom/movable/plane_master_controller/game_plane_master_controller = our_guy.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] + + game_plane_master_controller.remove_filter("demoneye_filter") + game_plane_master_controller.remove_filter("demoneye_blur") + + +/datum/reagent/drug/demoneye/on_mob_life(mob/living/carbon/our_guy, seconds_per_tick, times_fired) + . = ..() + + constant_dose_time += seconds_per_tick + + our_guy.add_mood_event("tweaking", /datum/mood_event/stimulant_heavy/sundowner, name) + + our_guy.adjustStaminaLoss(-10 * REM * seconds_per_tick) + our_guy.AdjustSleeping(-20 * REM * seconds_per_tick) + our_guy.adjust_drowsiness(-5 * REM * seconds_per_tick) + + if(SPT_PROB(25, seconds_per_tick)) + our_guy.playsound_local(our_guy, 'sound/effects/singlebeat.ogg', 100, TRUE) + flash_color(our_guy, flash_color = "#ff0000", flash_time = 3 SECONDS) + + if(SPT_PROB(5, seconds_per_tick)) + hurt_that_mans_organs(our_guy, 3, FALSE) + + if(locate(/datum/reagent/drug/twitch) in our_guy.reagents.reagent_list) // Combining this with twitch could cause some heart attack problems + our_guy.ForceContractDisease(new /datum/disease/heart_failure(), FALSE, TRUE) + + +/datum/reagent/drug/demoneye/overdose_process(mob/living/carbon/our_guy, seconds_per_tick, times_fired) + . = ..() + + our_guy.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) + + if(SPT_PROB(10, seconds_per_tick)) + hurt_that_mans_organs(our_guy, 5, TRUE) + + +/// Hurts a random organ, if its 'really_bad' we'll vomit blood too +/datum/reagent/drug/demoneye/proc/hurt_that_mans_organs(mob/living/carbon/our_guy, damage, really_bad = FALSE) + /// List of organs we can randomly damage + var/static/list/organs_we_damage = list( + ORGAN_SLOT_BRAIN, + ORGAN_SLOT_APPENDIX, + ORGAN_SLOT_LUNGS, + ORGAN_SLOT_HEART, + ORGAN_SLOT_LIVER, + ORGAN_SLOT_STOMACH, + ) + if(really_bad) + our_guy.vomit(0, TRUE, FALSE, 1) + our_guy.adjustOrganLoss( + pick(organs_we_damage), + damage, + ) + +// Mood event used by demoneye, because the normal one I just didn't vibe with +/datum/mood_event/stimulant_heavy/sundowner + description = "I'M FUCKING INVINCIBLE!!!!" + +#undef CONSTANT_DOSE_SAFE_LIMIT +#undef METABOLISM_END_LIMB_DAMAGE diff --git a/modular_skyrat/modules/deforest_medical_items/code/chemicals/twitch.dm b/modular_skyrat/modules/deforest_medical_items/code/chemicals/twitch.dm new file mode 100644 index 00000000000..a61382206e7 --- /dev/null +++ b/modular_skyrat/modules/deforest_medical_items/code/chemicals/twitch.dm @@ -0,0 +1,216 @@ +#define CONSTANT_DOSE_SAFE_LIMIT 60 + +#define TWITCH_SCREEN_FILTER "twitch_screen_filter" +#define TWITCH_SCREEN_BLUR "twitch_screen_blur" + +#define TWITCH_BLUR_EFFECT "twitch_dodge_blur" +#define TWITCH_OVERDOSE_BLUR_EFFECT "twitch_overdose_blur" + +// Reaction to make twitch, makes 10u from 17u input reagents +/datum/chemical_reaction/twitch + results = list( + /datum/reagent/drug/twitch = 10, + ) + required_reagents = list( + /datum/reagent/impedrezene = 5, + /datum/reagent/bluespace = 10, + /datum/reagent/consumable/liquidelectricity/enriched = 2, + ) + mob_react = FALSE + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_ORGAN | REACTION_TAG_DAMAGING + +// Twitch drug, makes the takers of it faster and able to dodge bullets while in their system, to potentially bad side effects +/datum/reagent/drug/twitch + name = "TWitch" + description = "A drug originally developed by and for plutonians to assist them during raids. \ + Does not see wide use due to the whole reality-disassociation and heart disease thing afterwards. \ + Can be intentionally overdosed to increase the drug's effects" + reagent_state = LIQUID + color = "#c22a44" + taste_description = "television static" + metabolization_rate = 0.65 * REAGENTS_METABOLISM + ph = 3 + overdose_threshold = 15 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + addiction_types = list(/datum/addiction/stimulants = 20) + /// How much time has the drug been in them? + var/constant_dose_time = 0 + /// What type of span class do we change heard speech to? + var/speech_effect_span + + +/datum/reagent/drug/twitch/on_mob_metabolize(mob/living/our_guy) + . = ..() + + our_guy.add_movespeed_modifier(/datum/movespeed_modifier/reagent/twitch) + our_guy.next_move_modifier -= 0.3 // For the duration of this you move and attack faster + + our_guy.sound_environment_override = SOUND_ENVIRONMENT_DIZZY + + speech_effect_span = "green" + + RegisterSignal(our_guy, COMSIG_MOVABLE_MOVED, PROC_REF(on_movement)) + RegisterSignal(our_guy, COMSIG_MOVABLE_HEAR, PROC_REF(distort_hearing)) + + if(!our_guy.hud_used) + return + + var/atom/movable/plane_master_controller/game_plane_master_controller = our_guy.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] + + var/static/list/col_filter_green = list(0.5,0,0,0, 0,1,0,0, 0,0,0.5,0, 0,0,0,1) + + game_plane_master_controller.add_filter(TWITCH_SCREEN_FILTER, 10, color_matrix_filter(col_filter_green, FILTER_COLOR_RGB)) + + game_plane_master_controller.add_filter(TWITCH_SCREEN_BLUR, 1, list("type" = "radial_blur", "size" = 0.1)) + + for(var/filter in game_plane_master_controller.get_filters("twitch_blur")) + animate(filter, loop = -1, size = 0.2, time = 2 SECONDS, easing = ELASTIC_EASING|EASE_OUT, flags = ANIMATION_PARALLEL) + animate(size = 0.1, time = 6 SECONDS, easing = CIRCULAR_EASING|EASE_IN) + + +/datum/reagent/drug/twitch/on_mob_end_metabolize(mob/living/carbon/our_guy) + . = ..() + + our_guy.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/twitch) + our_guy.next_move_modifier += (overdosed ? 0.5 : 0.3) + + our_guy.sound_environment_override = NONE + + speech_effect_span = "hierophant" + + UnregisterSignal(our_guy, COMSIG_MOVABLE_MOVED) + UnregisterSignal(our_guy, COMSIG_MOVABLE_HEAR) + if(overdosed) + UnregisterSignal(our_guy, COMSIG_ATOM_PRE_BULLET_ACT) + + if(constant_dose_time < CONSTANT_DOSE_SAFE_LIMIT) // Anything less than this and you'll come out fiiiine, aside from a big hit of stamina damage + our_guy.visible_message( + span_danger("[our_guy] suddenly slows from their inhuman speeds, coming back with a wicked nosebleed!"), + span_danger("You suddenly slow back to normal, a stream of blood gushing from your nose!") + ) + our_guy.adjustStaminaLoss(constant_dose_time) + else // Much longer than that however, and you're not gonna have a good day + our_guy.visible_message( + span_danger("[our_guy] suddenly snaps back from their inhumans speeds, coughing up a spray of blood!"), + span_danger("As you snap back to normal speed you cough up a worrying amount of blood. You feel like you've just been run over by a power loader.") + ) + our_guy.spray_blood(our_guy.dir, 2) // The before mentioned coughing up blood + our_guy.emote("cough") + our_guy.adjustStaminaLoss(constant_dose_time) + our_guy.adjustOrganLoss(ORGAN_SLOT_HEART, 0.3 * constant_dose_time) // Basically you might die + + if(!our_guy.hud_used) + return + + var/atom/movable/plane_master_controller/game_plane_master_controller = our_guy.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] + + game_plane_master_controller.remove_filter(TWITCH_SCREEN_FILTER) + game_plane_master_controller.remove_filter(TWITCH_SCREEN_BLUR) + + +/// Leaves an afterimage behind the mob when they move +/datum/reagent/drug/twitch/proc/on_movement(mob/living/carbon/our_guy, atom/old_loc) + SIGNAL_HANDLER + new /obj/effect/temp_visual/decoy/twitch_afterimage(old_loc, our_guy) + + +/// Tries to dodge incoming bullets if we aren't disabled for any reasons +/datum/reagent/drug/twitch/proc/dodge_bullets(mob/living/carbon/human/source, obj/projectile/hitting_projectile, def_zone) + SIGNAL_HANDLER + + if(HAS_TRAIT(source, TRAIT_INCAPACITATED)) + return NONE + source.visible_message( + span_danger("[source] effortlessly dodges [hitting_projectile]!"), + span_userdanger("You effortlessly evade [hitting_projectile]!"), + ) + playsound(source, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE) + source.add_filter(TWITCH_BLUR_EFFECT, 2, gauss_blur_filter(5)) + addtimer(CALLBACK(source, TYPE_PROC_REF(/datum, remove_filter), TWITCH_BLUR_EFFECT), 0.5 SECONDS) + return COMPONENT_BULLET_PIERCED + + +/datum/reagent/drug/twitch/on_mob_life(mob/living/carbon/our_guy, seconds_per_tick, times_fired) + . = ..() + + constant_dose_time += seconds_per_tick + + our_guy.adjustOrganLoss(ORGAN_SLOT_HEART, 0.1 * REM * seconds_per_tick) + + if(locate(/datum/reagent/drug/kronkaine) in our_guy.reagents.reagent_list) // Kronkaine, another heart-straining drug, could cause problems if mixed with this + our_guy.ForceContractDisease(new /datum/disease/adrenal_crisis(), FALSE, TRUE) + + +/datum/reagent/drug/twitch/overdose_start(mob/living/our_guy) + . = ..() + + RegisterSignal(our_guy, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(dodge_bullets)) + + our_guy.next_move_modifier -= 0.2 // Overdosing makes you a liiitle faster but you know has some really bad consequences + + if(!our_guy.hud_used) + return + + var/atom/movable/plane_master_controller/game_plane_master_controller = our_guy.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] + + var/list/col_filter_ourple = list(1,0,0,0, 0,0.5,0,0, 0,0,1,0, 0,0,0,1) + + for(var/filter in game_plane_master_controller.get_filters(TWITCH_SCREEN_FILTER)) + animate(filter, loop = -1, color = col_filter_ourple, time = 4 SECONDS, easing = BOUNCE_EASING) + + +/datum/reagent/drug/twitch/overdose_process(mob/living/carbon/our_guy, seconds_per_tick, times_fired) + . = ..() + + our_guy.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) + + our_guy.adjustOrganLoss(ORGAN_SLOT_HEART, 1 * REM * seconds_per_tick) + our_guy.adjustToxLoss(3, forced = TRUE) + + if(SPT_PROB(5, seconds_per_tick)) + to_chat(our_guy, span_danger("You cough up a splatter of blood!")) + our_guy.spray_blood(our_guy.dir, 1) + our_guy.emote("cough") + + if(SPT_PROB(10, seconds_per_tick)) + our_guy.add_filter(TWITCH_OVERDOSE_BLUR_EFFECT, 2, phase_filter(8)) + addtimer(CALLBACK(our_guy, TYPE_PROC_REF(/datum, remove_filter), TWITCH_OVERDOSE_BLUR_EFFECT), 0.5 SECONDS) + + +/// Changes heard message spans into that defined on the drug earlier +/datum/reagent/drug/twitch/proc/distort_hearing(datum/source, list/hearing_args) + SIGNAL_HANDLER + hearing_args[HEARING_RAW_MESSAGE] = "[hearing_args[HEARING_RAW_MESSAGE]]" + + +/// Cool filter that I'm using for some of this :))) +/proc/phase_filter(size) + . = list("type" = "wave") + .["x"] = 1 + if(!isnull(size)) + .["size"] = size + + +// Temp visual that changes color for that bootleg sandevistan effect +/obj/effect/temp_visual/decoy/twitch_afterimage + duration = 0.75 SECONDS + /// The color matrix it should be at spawn + var/list/matrix_start = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0.1,0.4,0) + /// The color matrix it should be by the time it despawns + var/list/matrix_end = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0.5,0,0) + +/obj/effect/temp_visual/decoy/twitch_afterimage/Initialize(mapload) + . = ..() + color = matrix_start + animate(src, color = matrix_end, time = duration, easing = EASE_OUT) + animate(src, alpha = 0, time = duration, easing = EASE_OUT) + +// Movespeed modifier used by twitch when someone has it in their system +/datum/movespeed_modifier/reagent/twitch + multiplicative_slowdown = -0.4 + +#undef TWITCH_SCREEN_FILTER +#undef TWITCH_SCREEN_BLUR + +#undef TWITCH_BLUR_EFFECT +#undef TWITCH_OVERDOSE_BLUR_EFFECT diff --git a/modular_skyrat/modules/deforest_medical_items/code/healing_stack_items.dm b/modular_skyrat/modules/deforest_medical_items/code/healing_stack_items.dm new file mode 100644 index 00000000000..ab65e0689b8 --- /dev/null +++ b/modular_skyrat/modules/deforest_medical_items/code/healing_stack_items.dm @@ -0,0 +1,178 @@ +#define INSTANT_WOUND_HEAL_STAMINA_DAMAGE 80 +#define INSTANT_WOUND_HEAL_LIMB_DAMAGE 25 + +/obj/item/stack/medical/wound_recovery + name = "subdermal splint applicator" + desc = "A roll flexible material dotted with millions of micro-scale injectors on one side. \ + On application to a body part with a damaged bone structure, nanomachines stored within those \ + injectors will surround the wound and form a subdermal, self healing splint. While convenient \ + for keeping appearances and rapid healing, the nanomachines tend to leave their host particularly \ + vulnerable to new damage for several minutes after application." + icon = 'modular_skyrat/modules/deforest_medical_items/icons/stack_items.dmi' + icon_state = "subsplint" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + inhand_icon_state = "sampler" + gender = PLURAL + singular_name = "subdermal splint applicator" + self_delay = 10 SECONDS + other_delay = 5 SECONDS + novariants = TRUE + max_amount = 3 + amount = 3 + merge_type = /obj/item/stack/medical/wound_recovery + /// The types of wounds that we work on, in list format + var/list/applicable_wounds = list( + /datum/wound/blunt/bone, + /datum/wound/muscle, + ) + /// The sound we play upon successfully treating the wound + var/treatment_sound = 'sound/items/duct_tape_rip.ogg' + +// This is only relevant for the types of wounds defined, we can't work if there are none +/obj/item/stack/medical/wound_recovery/try_heal(mob/living/patient, mob/user, silent) + + if(patient.has_status_effect(/datum/status_effect/vulnerable_to_damage)) + patient.balloon_alert(user, "still recovering from last use!") + return + + var/treatment_delay = (user == patient ? self_delay : other_delay) + + var/obj/item/bodypart/limb = patient.get_bodypart(check_zone(user.zone_selected)) + if(!limb) + patient.balloon_alert(user, "missing limb!") + return + if(!LAZYLEN(limb.wounds)) + patient.balloon_alert(user, "no wounds!") + return + + var/splintable_wound = FALSE + var/datum/wound/woundies + for(var/found_wound in limb.wounds) + woundies = found_wound + if((woundies.wound_flags & ACCEPTS_GAUZE) && is_type_in_list(woundies, applicable_wounds)) + splintable_wound = TRUE + break + if(!splintable_wound) + patient.balloon_alert(user, "can't heal those!") + return + + if(HAS_TRAIT(woundies, TRAIT_WOUND_SCANNED)) + treatment_delay *= 0.5 + if(user == patient) + to_chat(user, span_notice("You keep in mind the indications from the holo-image about your injury, and expertly begin applying [src].")) + else + user.visible_message(span_warning("[user] begins expertly treating the wounds on [patient]'s [limb.plaintext_zone] with [src]..."), span_warning("You begin quickly treating the wounds on [patient]'s [limb.plaintext_zone] with [src], keeping the holo-image indications in mind...")) + else + user.visible_message(span_warning("[user] begins treating the wounds on [patient]'s [limb.plaintext_zone] with [src]..."), span_warning("You begin treating the wounds on [user == patient ? "your" : "[patient]'s"] [limb.plaintext_zone] with [src]...")) + + if(!do_after(user, treatment_delay, target = patient)) + return + + user.visible_message(span_green("[user] applies [src] to [patient]'s [limb.plaintext_zone]."), span_green("You bandage the wounds on [user == patient ? "your" : "[patient]'s"] [limb.plaintext_zone].")) + playsound(patient, treatment_sound, 50, TRUE) + woundies.remove_wound() + if(!HAS_TRAIT(patient, TRAIT_NUMBED)) + patient.emote("scream") + to_chat(patient, span_userdanger("Your [limb.plaintext_zone] burns like hell as the wounds on it are rapidly healed, fuck!")) + patient.add_mood_event("severe_surgery", /datum/mood_event/rapid_wound_healing) + limb.receive_damage(brute = INSTANT_WOUND_HEAL_LIMB_DAMAGE, wound_bonus = CANT_WOUND) + patient.adjustStaminaLoss(INSTANT_WOUND_HEAL_STAMINA_DAMAGE) + patient.apply_status_effect(/datum/status_effect/vulnerable_to_damage) + use(1) + +/datum/mood_event/rapid_wound_healing + description = "That may have healed my wound fast, but if that wasn't one of the worst experiences!\n" + mood_change = -3 + timeout = 5 MINUTES + +// Helps recover bleeding +/obj/item/stack/medical/wound_recovery/rapid_coagulant + name = "rapid coagulant applicator" + singular_name = "rapid coagulant applicator" + desc = "A small device filled with a fast acting coagulant of some type. \ + When used on a bleeding area, will nearly instantly stop all bleeding. \ + This rapid clotting action may result in temporary vulnerability to further \ + damage after application." + icon_state = "clotter" + inhand_icon_state = "implantcase" + applicable_wounds = list( + /datum/wound/slash/flesh, + /datum/wound/pierce/bleed, + ) + merge_type = /obj/item/stack/medical/wound_recovery/rapid_coagulant + +/obj/item/stack/medical/wound_recovery/rapid_coagulant/post_heal_effects(amount_healed, mob/living/carbon/healed_mob, mob/user) + . = ..() + healed_mob.reagents.add_reagent(/datum/reagent/medicine/coagulant/fabricated, 5) + +// Helps recover burn wounds much faster, while not healing much damage directly +/obj/item/stack/medical/ointment/red_sun + name = "red sun balm" + singular_name = "red sun balm" + desc = "A popular brand of ointment for handling anything under the red sun, which tends to be terrible burns. \ + Which red sun may this be referencing? Not even the producers of the balm are sure." + icon = 'modular_skyrat/modules/deforest_medical_items/icons/stack_items.dmi' + icon_state = "balm" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + inhand_icon_state = "bandage" + gender = PLURAL + novariants = TRUE + amount = 12 + max_amount = 12 + self_delay = 4 SECONDS + other_delay = 2 SECONDS + heal_burn = 5 + heal_brute = 5 + flesh_regeneration = 5 + sanitization = 3 + grind_results = list(/datum/reagent/medicine/oxandrolone = 3) + merge_type = /obj/item/stack/medical/ointment/red_sun + +/obj/item/stack/medical/ointment/red_sun/post_heal_effects(amount_healed, mob/living/carbon/healed_mob, mob/user) + . = ..() + healed_mob.reagents.add_reagent(/datum/reagent/medicine/lidocaine, 2) + +// Gauze that are especially good at treating burns, but are terrible splints +/obj/item/stack/medical/gauze/sterilized + name = "sealed aseptic gauze" + singular_name = "sealed aseptic gauze" + desc = "A small roll of elastic material specially treated to be entirely sterile, and sealed in plastic just to be sure. \ + These make excellent treatment against burn wounds, but due to their small nature are sub-par for serving as \ + bone wound wrapping." + icon = 'modular_skyrat/modules/deforest_medical_items/icons/stack_items.dmi' + icon_state = "burndaid" + inhand_icon_state = null + novariants = TRUE + max_amount = 6 + amount = 6 + splint_factor = 1.2 + burn_cleanliness_bonus = 0.1 + merge_type = /obj/item/stack/medical/gauze/sterilized + +/obj/item/stack/medical/gauze/sterilized/post_heal_effects(amount_healed, mob/living/carbon/healed_mob, mob/user) + . = ..() + healed_mob.reagents.add_reagent(/datum/reagent/space_cleaner/sterilizine, 5) + healed_mob.reagents.expose(healed_mob, TOUCH, 1) + +// Works great at sealing bleed wounds, but does little to actually heal them +/obj/item/stack/medical/suture/coagulant + name = "coagulant-F packet" + singular_name = "coagulant-F packet" + desc = "A small packet of fabricated coagulant for bleeding. Not as effective as some \ + other methods of coagulating wounds, but is more effective than plain sutures. \ + The downsides? It repairs less of the actual damage that's there." + icon = 'modular_skyrat/modules/deforest_medical_items/icons/stack_items.dmi' + icon_state = "clotter_slow" + inhand_icon_state = null + novariants = TRUE + amount = 12 + max_amount = 12 + repeating = FALSE + heal_brute = 0 + stop_bleeding = 2 + merge_type = /obj/item/stack/medical/suture/coagulant + +#undef INSTANT_WOUND_HEAL_STAMINA_DAMAGE +#undef INSTANT_WOUND_HEAL_LIMB_DAMAGE diff --git a/modular_skyrat/modules/deforest_medical_items/code/illegal_injectors.dm b/modular_skyrat/modules/deforest_medical_items/code/illegal_injectors.dm new file mode 100644 index 00000000000..0b29b2963fb --- /dev/null +++ b/modular_skyrat/modules/deforest_medical_items/code/illegal_injectors.dm @@ -0,0 +1,70 @@ +// Twitch, because having sandevistans be implants is for losers, just inject it! +/obj/item/reagent_containers/hypospray/medipen/deforest/twitch + name = "TWitch sensory stimulant injector" + desc = "A Deforest branded autoinjector, loaded with 'TWitch' among other reagents. This drug is known to make \ + those who take it 'see faster', whatever that means." + base_icon_state = "twitch" + icon_state = "twitch" + list_reagents = list( + /datum/reagent/drug/twitch = 10, + /datum/reagent/drug/maint/tar = 5, + /datum/reagent/medicine/silibinin = 5, + /datum/reagent/toxin/leadacetate = 5, + ) + +// Demoneye, for when you feel the need to become "fucking invincible" +/obj/item/reagent_containers/hypospray/medipen/deforest/demoneye + name = "DemonEye steroid injector" + desc = "A Deforest branded autoinjector, loaded with 'DemonEye' among other reagents. This drug is known to make \ + those who take it numb to all pains and extremely difficult to kill as a result." + base_icon_state = "demoneye" + icon_state = "demoneye" + list_reagents = list( + /datum/reagent/drug/demoneye = 10, + /datum/reagent/drug/maint/sludge = 10, + /datum/reagent/toxin/leadacetate = 5, + ) + +// Mix of many of the stamina damage regenerating drugs to provide a cocktail no baton could hope to beat +/obj/item/reagent_containers/hypospray/medipen/deforest/aranepaine + name = "aranepaine combat stimulant injector" + desc = "A Deforest branded autoinjector, loaded with a cocktail of drugs to make any who take it nearly \ + immune to exhaustion while its in their system." + base_icon_state = "aranepaine" + icon_state = "aranepaine" + list_reagents = list( + /datum/reagent/drug/aranesp = 5, + /datum/reagent/drug/kronkaine = 5, + /datum/reagent/drug/pumpup = 5, + /datum/reagent/medicine/diphenhydramine = 5, + /datum/reagent/impurity = 5, + ) + +// Nothing inherently illegal, just a potentially very dangerous mix of chems to be able to inject into people +/obj/item/reagent_containers/hypospray/medipen/deforest/pentibinin + name = "pentibinin normalizant injector" + desc = "A Deforest branded autoinjector, loaded with a cocktail of drugs to make any who take it \ + recover from many different types of damages, with many unusual or undocumented side-effects." + base_icon_state = "pentibinin" + icon_state = "pentibinin" + list_reagents = list( + /datum/reagent/medicine/c2/penthrite = 5, + /datum/reagent/medicine/polypyr = 5, + /datum/reagent/medicine/silibinin = 5, + /datum/reagent/medicine/omnizine = 5, + /datum/reagent/inverse/healing/tirimol = 5, + ) + +// Combat stimulant that makes you immune to slowdowns for a bit +/obj/item/reagent_containers/hypospray/medipen/deforest/synalvipitol + name = "synalvipitol muscle stimulant injector" + desc = "A Deforest branded autoinjector, loaded with a cocktail of drugs to make any who take it \ + nearly immune to the slowing effects of silly things like 'being tired' or 'facing muscle failure'." + base_icon_state = "synalvipitol" + icon_state = "synalvipitol" + list_reagents = list( + /datum/reagent/medicine/mine_salve = 5, + /datum/reagent/medicine/synaptizine = 10, + /datum/reagent/medicine/muscle_stimulant = 5, + /datum/reagent/impurity = 5, + ) diff --git a/modular_skyrat/modules/deforest_medical_items/code/injectors.dm b/modular_skyrat/modules/deforest_medical_items/code/injectors.dm new file mode 100644 index 00000000000..7f24f02350a --- /dev/null +++ b/modular_skyrat/modules/deforest_medical_items/code/injectors.dm @@ -0,0 +1,206 @@ +// Pen basetype where the icon is gotten from +/obj/item/reagent_containers/hypospray/medipen/deforest + name = "non-functional Deforest autoinjector" + desc = "A Deforest branded autoinjector, though this one seems to be both empty and non-functional." + icon = 'modular_skyrat/modules/deforest_medical_items/icons/injectors.dmi' + icon_state = "default" + volume = 25 + list_reagents = list() + /// If this pen has a timer for injecting others with, just for safety with some of the drugs in these + var/inject_others_time = 1.5 SECONDS + +/obj/item/reagent_containers/hypospray/medipen/deforest/Initialize(mapload) + . = ..() + amount_per_transfer_from_this = volume + +/obj/item/reagent_containers/hypospray/medipen/deforest/inject(mob/living/affected_mob, mob/user) + if(!reagents.total_volume) + to_chat(user, span_warning("[src] is empty!")) + return FALSE + if(!iscarbon(affected_mob)) + return FALSE + + //Always log attemped injects for admins + var/list/injected = list() + for(var/datum/reagent/injected_reagent in reagents.reagent_list) + injected += injected_reagent.name + var/contained = english_list(injected) + log_combat(user, affected_mob, "attempted to inject", src, "([contained])") + + if((affected_mob != user) && inject_others_time) + affected_mob.visible_message(span_danger("[user] is trying to inject [affected_mob]!"), \ + span_userdanger("[user] is trying to inject something into you!")) + if(!do_after(user, CHEM_INTERACT_DELAY(inject_others_time, user), affected_mob)) + return FALSE + + if(reagents.total_volume && (ignore_flags || affected_mob.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE))) // Ignore flag should be checked first or there will be an error message. + to_chat(affected_mob, span_warning("You feel a tiny prick!")) + to_chat(user, span_notice("You inject [affected_mob] with [src].")) + if(!stealthy) + playsound(affected_mob, 'sound/items/hypospray.ogg', 50, TRUE) + var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) + + if(affected_mob.reagents) + var/trans = 0 + if(!infinite) + trans = reagents.trans_to(affected_mob, amount_per_transfer_from_this, transferred_by = user, methods = INJECT) + else + reagents.expose(affected_mob, INJECT, fraction) + trans = reagents.copy_to(affected_mob, amount_per_transfer_from_this) + to_chat(user, span_notice("[trans] unit\s injected. [reagents.total_volume] unit\s remaining in [src].")) + log_combat(user, affected_mob, "injected", src, "([contained])") + return TRUE + return FALSE + +// Sensory restoration, heals eyes and ears with a bit of impurity +/obj/item/reagent_containers/hypospray/medipen/deforest/occuisate + name = "occuisate sensory restoration injector" + desc = "A Deforest branded autoinjector, loaded with a mix of reagents to restore your vision and hearing to operation." + base_icon_state = "occuisate" + icon_state = "occuisate" + list_reagents = list( + /datum/reagent/medicine/inacusiate = 7, + /datum/reagent/medicine/oculine = 7, + /datum/reagent/impurity/inacusiate = 3, + /datum/reagent/inverse/oculine = 3, + /datum/reagent/toxin/lipolicide = 5, + ) + +// Adrenaline, fills you with determination (and also stimulants) +/obj/item/reagent_containers/hypospray/medipen/deforest/adrenaline + name = "adrenaline injector" + desc = "A Deforest branded autoinjector, loaded with a mix of reagents to intentionally give yourself fight or flight on demand." + base_icon_state = "adrenaline" + icon_state = "adrenaline" + list_reagents = list( + /datum/reagent/medicine/synaptizine = 5, + /datum/reagent/medicine/inaprovaline = 5, + /datum/reagent/determination = 10, + /datum/reagent/toxin/histamine = 5, + ) + +// Morpital, heals a small amount of damage and kills pain for a bit +/obj/item/reagent_containers/hypospray/medipen/deforest/morpital + name = "morpital regenerative stimulant injector" + desc = "A Deforest branded autoinjector, loaded with a mix of reagents to numb pain and repair small amounts of physical damage." + base_icon_state = "morpital" + icon_state = "morpital" + list_reagents = list( + /datum/reagent/medicine/morphine = 5, + /datum/reagent/medicine/omnizine/protozine = 15, + /datum/reagent/toxin/staminatoxin = 5, + ) + +// Lipital, heals more damage than morpital but doesnt work much at higher damages +/obj/item/reagent_containers/hypospray/medipen/deforest/lipital + name = "lipital regenerative stimulant injector" + desc = "A Deforest branded autoinjector, loaded with a mix of reagents to numb pain and repair small amounts of physical damage. \ + Works most effectively against damaged caused by brute attacks." + base_icon_state = "lipital" + icon_state = "lipital" + list_reagents = list( + /datum/reagent/medicine/lidocaine = 5, + /datum/reagent/medicine/omnizine = 5, + /datum/reagent/medicine/c2/probital = 10, + ) + +// Anti-poisoning injector, with a little bit of radiation healing as a treat +/obj/item/reagent_containers/hypospray/medipen/deforest/meridine + name = "meridine antidote injector" + desc = "A Deforest branded autoinjector, loaded with a mix of reagents to serve as antidote to most galactic toxins. \ + A warning sticker notes it should not be used if the patient is physically damaged, as it may cause complications." + base_icon_state = "meridine" + icon_state = "meridine" + list_reagents = list( + /datum/reagent/medicine/ammoniated_mercury = 5, + /datum/reagent/medicine/potass_iodide = 15, + /datum/reagent/nitrous_oxide = 5, + ) + +// Epinephrine and helps a little bit against stuns and stamina damage +/obj/item/reagent_containers/hypospray/medipen/deforest/synephrine + name = "synephrine emergency stimulant injector" + desc = "A Deforest branded autoinjector, loaded with a mix of reagents to stabilize critical condition and recover from stamina deficits." + base_icon_state = "synephrine" + icon_state = "synephrine" + list_reagents = list( + /datum/reagent/medicine/epinephrine = 10, + /datum/reagent/medicine/synaptizine = 5, + /datum/reagent/medicine/synaphydramine = 5, + ) + +// Critical condition stabilizer +/obj/item/reagent_containers/hypospray/medipen/deforest/calopine + name = "calopine emergency stabilizant injector" + desc = "A Deforest branded autoinjector, loaded with a stabilizing mix of reagents to repair critical conditions." + base_icon_state = "calopine" + icon_state = "calopine" + list_reagents = list( + /datum/reagent/medicine/atropine = 10, + /datum/reagent/medicine/coagulant/fabricated = 5, + /datum/reagent/medicine/salbutamol = 5, + /datum/reagent/toxin/staminatoxin = 5, + ) + +// Coagulant, really not a whole lot more +/obj/item/reagent_containers/hypospray/medipen/deforest/coagulants + name = "coagulant-S injector" + desc = "A Deforest branded autoinjector, loaded with a mix of coagulants to prevent and stop bleeding." + base_icon_state = "coagulant" + icon_state = "coagulant" + list_reagents = list( + /datum/reagent/medicine/coagulant = 5, + /datum/reagent/medicine/salglu_solution = 15, + /datum/reagent/impurity = 5, + ) + +// Stimulant centered around ondansetron +/obj/item/reagent_containers/hypospray/medipen/deforest/krotozine + name = "krotozine manipulative stimulant injector" + desc = "A Deforest branded autoinjector, loaded with a mix of stimulants of weak healing agents." + base_icon_state = "krotozine" + icon_state = "krotozine" + list_reagents = list( + /datum/reagent/medicine/ondansetron = 5, + /datum/reagent/drug/kronkaine = 5, + /datum/reagent/medicine/omnizine/protozine = 10, + /datum/reagent/drug/maint/tar = 5, + ) + +// Stuff really good at healing burn stuff and stabilizing temps +/obj/item/reagent_containers/hypospray/medipen/deforest/lepoturi + name = "lepoturi burn treatment injector" + desc = "A Deforest branded autoinjector, loaded with a mix of medicines to rapidly treat burns." + base_icon_state = "lepoturi" + icon_state = "lepoturi" + list_reagents = list( + /datum/reagent/medicine/mine_salve = 5, + /datum/reagent/medicine/leporazine = 5, + /datum/reagent/medicine/c2/lenturi = 10, + /datum/reagent/toxin/staminatoxin = 5, + ) + +// Stabilizes a lot of stats like drowsiness, sanity, dizziness, so on +/obj/item/reagent_containers/hypospray/medipen/deforest/psifinil + name = "psifinil personal recovery injector" + desc = "A Deforest branded autoinjector, loaded with a mix of medicines to remedy many common ailments, such as drowsiness, pain, instability, the like." + base_icon_state = "psifinil" + icon_state = "psifinil" + list_reagents = list( + /datum/reagent/medicine/modafinil = 10, + /datum/reagent/medicine/psicodine = 10, + /datum/reagent/medicine/leporazine = 5, + ) + +// Helps with liver failure and some drugs, also alcohol +/obj/item/reagent_containers/hypospray/medipen/deforest/halobinin + name = "halobinin soberant injector" + desc = "A Deforest branded autoinjector, loaded with a mix of medicines to remedy the effects of liver failure and common drugs." + base_icon_state = "halobinin" + icon_state = "halobinin" + list_reagents = list( + /datum/reagent/medicine/haloperidol = 5, + /datum/reagent/medicine/antihol = 5, + /datum/reagent/medicine/higadrite = 5, + /datum/reagent/medicine/silibinin = 5, + ) diff --git a/modular_skyrat/modules/deforest_medical_items/code/storage_items.dm b/modular_skyrat/modules/deforest_medical_items/code/storage_items.dm new file mode 100644 index 00000000000..d700f5d68b4 --- /dev/null +++ b/modular_skyrat/modules/deforest_medical_items/code/storage_items.dm @@ -0,0 +1,314 @@ +// Bottle of painkiller pills +/obj/item/storage/pill_bottle/painkiller + name = "amollin pill bottle" + desc = "It's an airtight container for storing medication. This one is all-white and has labels for containing amollin, a blend of Miner's Salve and Lidocaine." + icon = 'modular_skyrat/modules/deforest_medical_items/icons/storage.dmi' + icon_state = "painkiller_bottle" + +/obj/item/storage/pill_bottle/painkiller/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/reagent_containers/pill/amollin(src) + +/obj/item/reagent_containers/pill/amollin + name = "amollin pill" + desc = "Neutralizes many common pains and ailments. A blend of Miner's Salve and Lidocaine." + icon_state = "pill9" + list_reagents = list( + /datum/reagent/medicine/mine_salve = 10, + /datum/reagent/medicine/lidocaine = 5, + /datum/reagent/consumable/sugar = 5, + ) + +// Pre-packed civil defense medkit, with items to heal low damages inside +/obj/item/storage/medkit/civil_defense + name = "civil defense medical kit" + icon = 'modular_skyrat/modules/deforest_medical_items/icons/storage.dmi' + icon_state = "poisoning_kit" + lefthand_file = 'modular_skyrat/modules/deforest_medical_items/icons/inhands/cases_lefthand.dmi' + righthand_file = 'modular_skyrat/modules/deforest_medical_items/icons/inhands/cases_righthand.dmi' + inhand_icon_state = "poisoning_kit" + desc = "A small medical kit that can only fit autoinjectors in it, these typically come with supplies to treat low level harm." + w_class = WEIGHT_CLASS_SMALL + drop_sound = 'sound/items/handling/ammobox_drop.ogg' + pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + +/obj/item/storage/medkit/civil_defense/Initialize(mapload) + . = ..() + atom_storage.max_slots = 4 + atom_storage.set_holdable(list( + /obj/item/reagent_containers/hypospray/medipen, + )) + +/obj/item/storage/medkit/civil_defense/stocked + +/obj/item/storage/medkit/civil_defense/stocked/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/hypospray/medipen/deforest/meridine = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/halobinin = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/lipital = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/calopine = 1, + ) + generate_items_inside(items_inside,src) + +// Pre-packed frontier medkit, with supplies to repair most common frontier health issues +/obj/item/storage/medkit/frontier + name = "frontier medical kit" + desc = "A handy roll-top waterproof medkit often seen alongside those on the frontier, where medical support is less than optimal. \ + It has a clip for hooking onto your belt, handy!" + icon = 'modular_skyrat/modules/deforest_medical_items/icons/storage.dmi' + icon_state = "frontier" + lefthand_file = 'modular_skyrat/modules/deforest_medical_items/icons/inhands/cases_lefthand.dmi' + righthand_file = 'modular_skyrat/modules/deforest_medical_items/icons/inhands/cases_righthand.dmi' + inhand_icon_state = "frontier" + worn_icon = 'modular_skyrat/modules/deforest_medical_items/icons/worn/worn.dmi' + worn_icon_teshari = 'modular_skyrat/modules/deforest_medical_items/icons/worn/worn_teshari.dmi' + pickup_sound = 'sound/items/handling/cloth_pickup.ogg' + drop_sound = 'sound/items/handling/cloth_drop.ogg' + slot_flags = ITEM_SLOT_BELT + +/obj/item/storage/medkit/frontier/stocked + +/obj/item/storage/medkit/frontier/stocked/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/hypospray/medipen/deforest/meridine = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/morpital = 1, + /obj/item/stack/medical/ointment = 1, + /obj/item/stack/medical/suture = 1, + /obj/item/stack/medical/suture/coagulant = 1, + /obj/item/stack/medical/gauze/sterilized = 1, + /obj/item/storage/pill_bottle/painkiller = 1, + ) + generate_items_inside(items_inside,src) + +// Pre-packed combat surgeon medkit, with items for fixing more specific injuries and wounds +/obj/item/storage/medkit/combat_surgeon + name = "combat surgeon medical kit" + desc = "A folding kit that is ideally filled with surgical tools and specialized treatment options for many harder-to-treat wounds." + icon = 'modular_skyrat/modules/deforest_medical_items/icons/storage.dmi' + icon_state = "surgeon" + lefthand_file = 'modular_skyrat/modules/deforest_medical_items/icons/inhands/cases_lefthand.dmi' + righthand_file = 'modular_skyrat/modules/deforest_medical_items/icons/inhands/cases_righthand.dmi' + inhand_icon_state = "surgeon" + worn_icon = 'modular_skyrat/modules/deforest_medical_items/icons/worn/worn.dmi' + worn_icon_teshari = 'modular_skyrat/modules/deforest_medical_items/icons/worn/worn_teshari.dmi' + worn_icon_state = "frontier" + pickup_sound = 'sound/items/handling/cloth_pickup.ogg' + drop_sound = 'sound/items/handling/cloth_drop.ogg' + +/obj/item/storage/medkit/combat_surgeon/Initialize(mapload) + . = ..() + atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL + +/obj/item/storage/medkit/combat_surgeon/stocked + +/obj/item/storage/medkit/combat_surgeon/stocked/PopulateContents() + var/static/items_inside = list( + /obj/item/bonesetter = 1, + /obj/item/hemostat = 1, + /obj/item/cautery = 1, + /obj/item/stack/medical/wound_recovery = 1, + /obj/item/stack/medical/wound_recovery/rapid_coagulant = 1, + /obj/item/stack/medical/gauze/sterilized = 1, + /obj/item/healthanalyzer/simple = 1, + ) + generate_items_inside(items_inside,src) + +// Big medical kit that can be worn like a bag, holds a LOT of medical items but works like a duffelbag +/obj/item/storage/backpack/duffelbag/deforest_medkit + name = "satchel medical kit" + desc = "A large orange satchel able to hold just about any piece of small medical equipment you could think of, you can even wear it on your back or belt!" + icon = 'modular_skyrat/modules/deforest_medical_items/icons/storage.dmi' + icon_state = "satchel" + lefthand_file = 'modular_skyrat/modules/deforest_medical_items/icons/inhands/cases_lefthand.dmi' + righthand_file = 'modular_skyrat/modules/deforest_medical_items/icons/inhands/cases_righthand.dmi' + inhand_icon_state = "satchel" + worn_icon = 'modular_skyrat/modules/deforest_medical_items/icons/worn/worn.dmi' + worn_icon_teshari = 'modular_skyrat/modules/deforest_medical_items/icons/worn/worn_teshari.dmi' + equip_sound = 'sound/items/equip/jumpsuit_equip.ogg' + pickup_sound = 'sound/items/handling/cloth_pickup.ogg' + drop_sound = 'sound/items/handling/cloth_drop.ogg' + slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_BELT + storage_type = /datum/storage/duffel/deforest_medkit + zip_slowdown = 0.25 // Most won't notice normally but it'll hurt you if you're a paramedic or in combat + unzip_duration = 1.2 SECONDS + +/obj/item/storage/backpack/duffelbag/deforest_medkit/stocked + +/obj/item/storage/backpack/duffelbag/deforest_medkit/stocked/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/hypospray/medipen/deforest/morpital = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/lepoturi = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/lipital = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/meridine = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/calopine = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/coagulants = 1, + /obj/item/bonesetter = 1, + /obj/item/hemostat = 1, + /obj/item/cautery = 1, + /obj/item/stack/medical/wound_recovery = 1, + /obj/item/stack/medical/wound_recovery/rapid_coagulant = 1, + /obj/item/stack/medical/suture/coagulant = 1, + /obj/item/stack/medical/suture/bloody = 2, + /obj/item/stack/medical/mesh = 2, + /obj/item/stack/medical/gauze/sterilized = 1, + /obj/item/stack/medical/gauze = 1, + /obj/item/stack/medical/ointment/red_sun = 1, + /obj/item/storage/pill_bottle/painkiller = 1, + /obj/item/healthanalyzer/simple = 1, + ) + generate_items_inside(items_inside,src) + +/datum/storage/duffel/deforest_medkit + max_specific_storage = WEIGHT_CLASS_SMALL + max_total_storage = 21 * WEIGHT_CLASS_SMALL + max_slots = 21 + +/datum/storage/duffel/deforest_medkit/New() + . = ..() + + can_hold = typecacheof(list( + /obj/item/bonesetter, + /obj/item/cautery, + /obj/item/clothing/neck/stethoscope, + /obj/item/clothing/mask/breath, + /obj/item/clothing/mask/muzzle, + /obj/item/clothing/mask/surgical, + /obj/item/clothing/suit/toggle/labcoat/skyrat/hospitalgown, + /obj/item/dnainjector, + /obj/item/extinguisher/mini, + /obj/item/flashlight/pen, + /obj/item/geiger_counter, + /obj/item/healthanalyzer, + /obj/item/hemostat, + /obj/item/holosign_creator/medical, + /obj/item/hypospray, + /obj/item/implant, + /obj/item/implantcase, + /obj/item/implanter, + /obj/item/lazarus_injector, + /obj/item/lighter, + /obj/item/pinpointer/crew, + /obj/item/reagent_containers/blood, + /obj/item/reagent_containers/dropper, + /obj/item/reagent_containers/cup/beaker, + /obj/item/reagent_containers/cup/bottle, + /obj/item/reagent_containers/cup/vial, + /obj/item/reagent_containers/cup/tube, + /obj/item/reagent_containers/hypospray, + /obj/item/reagent_containers/medigel, + /obj/item/reagent_containers/pill, + /obj/item/reagent_containers/spray, + /obj/item/reagent_containers/syringe, + /obj/item/stack/medical, + /obj/item/stack/sticky_tape, + /obj/item/sensor_device, + /obj/item/storage/fancy/cigarettes, + /obj/item/storage/pill_bottle, + /obj/item/tank/internals/emergency_oxygen, + )) + +// Big surgical kit that can be worn like a bag, holds 14 normal items (more than what a backpack can do!) but works like a duffelbag +/obj/item/storage/backpack/duffelbag/deforest_surgical + name = "first responder surgical kit" + desc = "A large bag able to hold all the surgical tools and first response healing equipment you can think of, you can even wear it!" + icon = 'modular_skyrat/modules/deforest_medical_items/icons/storage.dmi' + icon_state = "super_surgery" + lefthand_file = 'modular_skyrat/modules/deforest_medical_items/icons/inhands/cases_lefthand.dmi' + righthand_file = 'modular_skyrat/modules/deforest_medical_items/icons/inhands/cases_righthand.dmi' + inhand_icon_state = "super_surgery" + worn_icon = 'modular_skyrat/modules/deforest_medical_items/icons/worn/worn.dmi' + worn_icon_teshari = 'modular_skyrat/modules/deforest_medical_items/icons/worn/worn_teshari.dmi' + equip_sound = 'sound/items/equip/jumpsuit_equip.ogg' + pickup_sound = 'sound/items/handling/cloth_pickup.ogg' + drop_sound = 'sound/items/handling/cloth_drop.ogg' + slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_BELT + storage_type = /datum/storage/duffel/deforest_big_surgery + zip_slowdown = 0.5 // Its a bulkier bag and thus slows you down a little more when unzipped + unzip_duration = 1.2 SECONDS + +/obj/item/storage/backpack/duffelbag/deforest_surgical/stocked + +/obj/item/storage/backpack/duffelbag/deforest_surgical/stocked/PopulateContents() + var/static/items_inside = list( + /obj/item/scalpel = 1, + /obj/item/hemostat = 1, + /obj/item/retractor = 1, + /obj/item/circular_saw = 1, + /obj/item/bonesetter = 1, + /obj/item/cautery = 1, + /obj/item/surgical_drapes = 1, + /obj/item/blood_filter = 1, + /obj/item/emergency_bed = 1, + /obj/item/stack/medical/gauze = 1, + /obj/item/stack/medical/gauze/sterilized = 1, + /obj/item/reagent_containers/medigel/sterilizine = 1, + /obj/item/stack/sticky_tape/surgical = 1, + /obj/item/stack/medical/bone_gel = 1, + ) + generate_items_inside(items_inside,src) + +/datum/storage/duffel/deforest_big_surgery + max_total_storage = 14 * WEIGHT_CLASS_NORMAL + max_slots = 14 + +/datum/storage/duffel/deforest_big_surgery/New() + . = ..() + + can_hold = typecacheof(list( + /obj/item/blood_filter, + /obj/item/bonesetter, + /obj/item/cautery, + /obj/item/circular_saw, + /obj/item/clothing/glasses, + /obj/item/clothing/gloves, + /obj/item/clothing/neck/stethoscope, + /obj/item/clothing/mask/breath, + /obj/item/clothing/mask/muzzle, + /obj/item/clothing/mask/surgical, + /obj/item/clothing/suit/toggle/labcoat/skyrat/hospitalgown, + /obj/item/construction/plumbing, + /obj/item/dnainjector, + /obj/item/extinguisher/mini, + /obj/item/flashlight/pen, + /obj/item/geiger_counter, + /obj/item/gun/syringe/syndicate, + /obj/item/healthanalyzer, + /obj/item/hemostat, + /obj/item/holosign_creator/medical, + /obj/item/hypospray, + /obj/item/implant, + /obj/item/implantcase, + /obj/item/implanter, + /obj/item/lazarus_injector, + /obj/item/lighter, + /obj/item/pinpointer/crew, + /obj/item/plunger, + /obj/item/radio, + /obj/item/reagent_containers/blood, + /obj/item/reagent_containers/dropper, + /obj/item/reagent_containers/cup/beaker, + /obj/item/reagent_containers/cup/bottle, + /obj/item/reagent_containers/cup/vial, + /obj/item/reagent_containers/cup/tube, + /obj/item/reagent_containers/hypospray, + /obj/item/reagent_containers/medigel, + /obj/item/reagent_containers/pill, + /obj/item/reagent_containers/spray, + /obj/item/reagent_containers/syringe, + /obj/item/retractor, + /obj/item/scalpel, + /obj/item/shears, + /obj/item/stack/medical, + /obj/item/stack/sticky_tape, + /obj/item/stamp, + /obj/item/sensor_device, + /obj/item/storage/fancy/cigarettes, + /obj/item/storage/pill_bottle, + /obj/item/surgical_drapes, + /obj/item/surgicaldrill, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/weaponcell/medical, + /obj/item/handheld_soulcatcher, + /obj/item/wrench/medical, + /obj/item/emergency_bed, + )) diff --git a/modular_skyrat/modules/deforest_medical_items/code/vulnerable_status_effect.dm b/modular_skyrat/modules/deforest_medical_items/code/vulnerable_status_effect.dm new file mode 100644 index 00000000000..6f7636b8177 --- /dev/null +++ b/modular_skyrat/modules/deforest_medical_items/code/vulnerable_status_effect.dm @@ -0,0 +1,28 @@ +/atom/movable/screen/alert/status_effect/vulnerable_to_damage + name = "Vulnerable To Damage" + desc = "You will take more damage than normal while your body recovers from mending itself!" + icon_state = "terrified" + +/datum/status_effect/vulnerable_to_damage + id = "vulnerable_to_damage" + duration = 5 MINUTES + alert_type = /atom/movable/screen/alert/status_effect/vulnerable_to_damage + remove_on_fullheal = TRUE + /// The percentage damage modifier we give the mob we're applied to + var/damage_resistance_subtraction = 50 + /// How much extra bleeding the mob is given + var/bleed_modifier_addition = 1 + +/datum/status_effect/vulnerable_to_damage/on_apply() + to_chat(owner, span_userdanger("Your body suddenly feals weak and fragile!")) + var/mob/living/carbon/human/carbon_owner = owner + carbon_owner.physiology.damage_resistance -= damage_resistance_subtraction + carbon_owner.physiology.bleed_mod += bleed_modifier_addition + return ..() + +/datum/status_effect/vulnerable_to_damage/on_remove() + to_chat(owner, span_notice("You seem to have recovered from your unnatural fragility!")) + var/mob/living/carbon/human/carbon_recoverer = owner + carbon_recoverer.physiology.damage_resistance += damage_resistance_subtraction + carbon_recoverer.physiology.bleed_mod -= bleed_modifier_addition + return ..() diff --git a/modular_skyrat/modules/deforest_medical_items/icons/inhands/cases_lefthand.dmi b/modular_skyrat/modules/deforest_medical_items/icons/inhands/cases_lefthand.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c53eab3ba9d7618be41204437f515e7e4dc611b7 GIT binary patch literal 1371 zcmZuwdo*_^aj^htV|TU zNEtGGUpI#i%R1uFIB@k@bco#h6z8d7rznEkY=bn+3aRK+V+GII9p>QM80T+8aa4m{ zSxN(vBx*-91gJxNsGV0$&9UGa?2#H8nTQ7D1kJYg=s>?KToW@+LrjPr7c{xxpJflbs;-#cwT373OU)#}( zX`aoCENE3#!SFjX_2JfVpI$ha5(ggFdpQh7jy0g8zwTJuk=`_Pc0>&ttxh>xRx&^= zh3R_9d2C4J6GY~((QV~qtzvSLCv&osAYeqr%HLkwTz8RygDuGg-LeTn;QS!RvQ%H0 zal4rXY;EO+H;LBjjwpJ_($uyN-bMA$s3#^*^%bSRNC_t|;K{~?=xySCE{{EHKjFGx zDF?DT4XfD#R`v`1{xB#=d}={nJGHO--VASlF|$nmiA~pc?sE;k-KoTHC%Dt)*ZnU` z=R#=C5|WooLE1GdW_$81sv2aDvRIyblN7Lz7fG}eQSEIS02!@q_a>(qiW$EnF^xJO z3CWR;n1VoUE#Y(WmF2+-cVT@X2`ccwaRG&rQ4&^K~yBe zr>55OV+bsf4C#1~0f?U?YL@!_hNYS6T%)Dgu}T6@OxbN6tZmKwyv(WNx0p={gLf-tI4cA@Q_QpBHv%6lk-&3m#MR|c_WV)%JvvXxQBqxmloi7D#B5e&+2PUvxejM^|8QF=p& z-zIu|F|z*2xa-hVL0FC`HbuSXhlI9(DL6ZKRD1R<8~M7cOBmRYs7VaN(?~|PLyAP{ zX=_2q=FSMUknrRt%dWoFiwofV6KelE3;;-&+;&>|#z&v*N2*g_m0>ehsSMoF#)>oj zm5vyR$d)Fj$MKZujFYARGB@>GD<-4BT5Ko@eSmwe6w7A3Wjx19SNV>;EA%r1l(&0| z<!nkO?XvB8&)ILx)E51l_J#}&0^?~?%(A>ib{{Z4H Br~Lo` literal 0 HcmV?d00001 diff --git a/modular_skyrat/modules/deforest_medical_items/icons/inhands/cases_righthand.dmi b/modular_skyrat/modules/deforest_medical_items/icons/inhands/cases_righthand.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c5a2099e96b20641ad115ca750f6dd235578789e GIT binary patch literal 1417 zcmZWodo&XY7^hs14(>gNvWrXimgsoajEhhn6S66Ws7MjOg?mhRP`knKAzw`Uf_s949o%8+S4slXCq<%wFYvm?9^q0wVF?bw@qstOViUq*qNSu#$}j~CR@ ze%%21nWMzB>M%BjT{Pu5%YlD>-!~m~LVN;PI$1VY7kweFcJ1JuQ?l`=X$+EpOGo@^45*n%*44|#FtM3+o!|z7@ zTGaOHcGLkK@WCTbv+Y!Gr

0E3=1h<*pB-3hht^{&^KCKEw7u7Rk8y6sT8)m4u#` zHwX&E$v4BWmP0_CInt{10&rsP$y69sJEbcoq@5{bEaH+!wX_2F()ku=2XiFW=SChon`Z{*U7tP$74e1iwEOC-eQbd^c@fSfxtk!t;2wqcb(Zqg!wRy)lP)LWg$##S#&W@DU0g1D9$48TmXoR5nVS=sJ}l$11iIiXx@ z2n6`+W4r~@DkU5ukX3cMuc^G7R-ul~-R#s4Uu)#T8e?8Om`g`qNh++4J}Z8WU?UhW z;|~+fVa4e!At5e&LHG4~@?nPY+qQ&;i|{kjYmg#}!vcPL%yntVwWkzbJjzcM*H|P9 zs%r5!$6O&mLnA|*)sBt6?udA|T8+>Aowm=%OF=cB(!CH71_e5ru%)B)Dgpzs)VDWc*Mx zYD5*Mm1X+x>g2pH+PzWeF|4Cuaz=Ur_-)?*={BYllc7$mvSZuVuh+sgqIVjn^lOMc z61}T5j&o=b4LIUYjM}8BWGSw_)C#`bB9NUt86=u3^sxLpz%rGGLDTOZUBG&6rS&_x zZ>tvIZ)8At+$6{)H`WZfhdw=TOvkvY(IZ)|N^?5FG~g@J>N~U|vfFzd@{~RD#s^B~ zcpRQJ8;FY-%4KDcx2sPvb6JFhEr82?MO^dOn8#L$v{$(GYg?YS*-=mnaW@oA2XPJH zgUWE*`A$B+z&9F=Q~0G$!(_fS;)@J@a|48W2Lhr9?!vlHmHAEiSjYbTNB$mpf9e?y zG$oc=9W(7h_~9D{&}gng5x;@Hfh8@(JO^e^$vj;72o?dG8+z{j%+w)z!%y>+zc}(1 zCSv_%sH}QFTam&$IzDkqm@l*(Mj5rQBg(C}j>d5Z(ukM4Zt_*!&CdDjy0^GZqCyu9 z>zMFzAt-`Hun*4@?EJq)O--)Xb-M_$DG`FyR`B0n`R^nt`&p}AuZm#!DeC|StN-Jd zIrv5ZA|sYM2Qys+mF8m}RYt5*yvIW(%v@WNYPcrIcD+hlUT4-i!Hu>2FqC>zzWy;) z5)D-IivjX#t91|@gE!ix9n~Wzj7Mc#8^|9B({$|~lyFo{=$QOEx#Gaph$POlKE}={ zpA=AlGrWvF?Nyv~<=|4Cxb_osBgLn2d)m4e;muzvn*+z1rxk9B#4u5a?e=bZ;zjF- zmPlOn$x&I&?n)84+;QI>5o9j%S6xZpx09(Pk!x)Zb@9d64DV}aM~FkC-L>q002$!B Ash*xYB$mTkW|zu)iiIOoyl@%Vne-_QGx&*SlaKfkZn`<>(N=A^Pi zXNQc8jEeKwQ=ZcI+pR}QLAra=BNb(2wi%>)`z4$TjlUFkH74O|^mQ4T$W>gl7F;O*+MM$>v>61TEppyf zm}}-fhF^cUWL1kV425L&C=Oaz7c-&mT3VdA(C68Ia{G_`9#?P6ubsEtnGBW8SRK%M zbG_PA?u3c!yRe;KOnRx?QLh|{Ia;kcC8)}TZaufyGsMeBH6Pmh`!{VX{-`s5tA9*2 z{hZFc{GpQFZdKX({MmE;1AKrD;)?3=;#|U|T)QyOOq_)V+oX{0s{WH{AZZhNIWs#mdBG62Jh<9-aopy3pn((*p~x6Pt&g34*F!F9^4(FoT>XLqW6L4t=3w< zU;nT_ui~m7! z`Pl6m(bEuY`~{n;BkZ(!7#}}xKHv+12!c#KxGbPn5I!OYWxYua=G85_rLlrZY|;$B ztbLeK88&vgX&-o6=%w3Zss0hoTei#Sv#GpS)TD4?^QjH^{CQ+QiDbb9SIoJC2(`v+ zK!an)`$}x9rF@KVpkWF9|a~>T1VPoU^eAn;5i}byj`z@*);xP3M>; ze{=Q;IPzl{eS)<=G2xwM<;ZaSWuhFoU z)z~&y+o_IjhR%r8?nMINfE4iy&4O~EAgH-$ef9O7o7iW9M$j*9$5yPR8UMy1nQpFi zx+2o|#U?j0sO69?a@Mt!mR}ke8#n=t=7xF1Xq9UW4uHXLU%PWb$?ooLj@&syOCSlI z5=Cr5@-&CV*XmNJYM-Pva9uvOeNFwXFJOsBu~}>Cr|9TdHq}%?qjX>evxz)__KS2z zsXaB?R5eAZ8bvb0IU$qAPBQ`{$u#P23plnzPHoR(a+(cdmaIE z`9skQDZLe(3Ea_IFp%S0j6X?r@=HpKO`gy7@STcbNHWCf*h4LdWMWHIIHew1d5A}J zX`JnSFdRrxjFWKL-SRq4?|IwSSBr>2mPcQMKTOy0`yrshWWj1wmqB^(h<;(2EG~9E zHuRLrtq_4|OL1jH6&&zAy>!ucYK0)d-K+&4&ed&wHaeORl))f#9PiJrBRvA;f+2Y@ zi7hNk7HKF=?)60Ldoxh$bWii{o;xV7P9f5)Ja_;@OXYS$CGVdo|8>`Yg%u3H{fK$C z1$cvO+rg{}J|5)?^BZrQ%6SSjPaKWo`m_4&t{#iLu&=kn9va*0sNWcgczkWoCg%B2 zg==o&98k~zJl zjYPNrEpgbyWz*P=VJEFswnN=Gjb62*5;3xlPTBZnFrvPpppY$MNGe_uumQtW?-QwD(#zh3r3`@ch=8FUDMhilre;Z18I$2yQ4*&NekXgi!@Xu zx|g$G&^gmiUYpZ&$58dQFxEg2$G?Dac3SVj?*6>N~C>Fp1!g5ag@|%}FXj|lm$!2lBoUzYVdy_Uz z?PfR25z^TB+&cQ9^;o}9azFN;?7lmlt&D#132!!H-RA+aZK2t;hdAKN2GJq773$E? zPcVhqsh(#~$bYVHM*MG_K$oo7rm?c3#lmr^`HeVz@~`8TYhrHo+YbL(AjSmbPQ(cj zX%feSUaN*2>Vx>+3%cQni9Y&$Hz7>{7mZY5@Ea?I7f_X6dn}g*>f!8m0j!ieBJFtX zuBYKQ8d?YJnJW!y`sEqK>KvBeep#EQ*2A>v5NspKa|y6i6yH@(7n?)GcYj#@sK)T} zzG9?G5h_9MW*6YSRQj6gSnD^sP1P`h~LD9gOvo&D%=`W5WH;)VC_prs#u|t)L2tR z0|YM96)rDrf5VDOLXzz#VcSy2kfPFYDcWg+LSL&6tqJ~D5`z)C_Qy!ncs0(6Rl2%Z z2OU1|!>uB(&a+_^f7fWB-pLVNt&R>CAEM4P9gtnE>iK}hbUC|!}{qL+u>m+z+*NS;JSsOIJU-qqsw PE$Ysv-A*+*{C4X<7$`>$ literal 0 HcmV?d00001 diff --git a/modular_skyrat/modules/deforest_medical_items/icons/stack_items.dmi b/modular_skyrat/modules/deforest_medical_items/icons/stack_items.dmi new file mode 100644 index 0000000000000000000000000000000000000000..947d1a088d5a2cb981707c82b2f158c6483fa670 GIT binary patch literal 1183 zcmV;Q1YrA#P)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5skk($xF9DpuSAK9GbOXA7$|1Q#hF%=n41b=!&N5dAB7700YZOL_t(|ob8*> zYZE~f$6qy2O)J=wQmoLZgjA$nidCqRR%|PH5WI*NK|utmUV0Kd_!s!=;z0y2`2##i z3;iKNt@L71Q;M2`VzDO$+i1bE=1qC&c9U!}%kGRXeIHmRna%#leBXOBv-<`>5ClOG z1VIpt(_s4sg3y2ek+Uax5SHdYfwvsFd4tt|+GhI(g7E$GJKvHMu^g?%PO*n8lJ3OTqTR3fucUp!>A1aLS0*Oi#E zdSpWob0X9WfkF^MjZdH3nnJmsnxI(kwtNghruu+er&3P;i5-yaX;$CoUoFGP)E~I_ za!%Xuv;=TlKfoF+t~#o|wXs3fkr!li?;;>J;=Z@>k&VwOM^}WvqabR0?`Mp#mKbGEp!35pM4nwLVp-Qf33E&PvSmNfb^A1m= zWctkqn9Jr=X$rLT=0j&n>anhzXH+9lC%n-QP-h$~Gc1jsvBo@%y`2GQGa`F&tOPu=9Xwt7EvmmSiUY zQfYMz$5k>lhagIZYMoz!bYE}9-%X5-!(y^2vLvZWt7EvXlJOM)<1M)~HYoo2^uBo2 zY-G&Y#NT%gT~m4McpRs=Y!Y7q$kKwiHs$WPEi(+#4LNT^qg7GD9}%YMiM zY6X9f;PGLmi(mrSY`&pv8vJ^ep1Ji2VZhDEZ%_5h;XaFb(VR?Qwje|WmedMsS6vQ+4Vso}%+019p8z-#*L{~z%c z;Mu^yrjZK{?{qr2D2IdI%xJC|((EQ;*vOq{&-<2~U?)Je#9VIu0K12A^){hn=K=MG x2w)izz%n9$WkdkWhya!m0W2c|SVjb}%s-=g!CwJ@6YBr~002ovPDHLkV1lp4HC_M! literal 0 HcmV?d00001 diff --git a/modular_skyrat/modules/deforest_medical_items/icons/storage.dmi b/modular_skyrat/modules/deforest_medical_items/icons/storage.dmi new file mode 100644 index 0000000000000000000000000000000000000000..516e7cd30a78dc67bf40a4653e82c29c60dae923 GIT binary patch literal 2042 zcmVV=-0C=2@ki8DVFbss}tEy`wpFk0VS0{DcY^8W%&o-IEUJ46nEUzZAW=OJ_HTn^q1L|&p*+C&i zj}%k3lVTt}!K%L(0b}s!O*bNE>4Ac01j>T(K?Z`)bDHlK+#h{&+O)LN`xjlRx~-PK zeE@)mUZK`$-Uk2x2M;5>RMJ zjfp145M$&4xu=ql5*zh!wP^(`*xEL<5Kp;C z%W?m6&UdS>QDTJ9d1YmVwQiU-@4cv$l3oyt1-{=FNN960<5kG<1#n`hHf@!IJ?X{?e!B z+s^%$jqqW^g7`y4oD0JU8&@>P zTbJGE>D~h;Zqcre^MU3Er5rT&|CM&WhvQ1so~L90C-E7?t!;fdzW>0NfxR@uZ(3gL z`TkuU!Q>-)V}c;p)8n@&a&4Gs_KdW6oQsZ65K4dI+U&?z%}CRNMo)2m={_D4KkGSj z2(A?Eq`ha_0#83;2o4wYd_`P@R?Kk`i*ejgGQhDTN9l{*-%)c*y)6#ncc1Q2d7KjF zTEK$i9F92-;v;WvwKOOowE5>1I;XXb!FCKXSfV zrxKryfvhOsvE}_Yh3Hn`o>o4)3I%hbh{0O&6W4^)5pyEU(l6WzdHc4vjveJ9$_Bu2 zvw1Rx#YZ0?j9&2TU*%Edp+d<7h&vds9~#R2=?Tv{WFv6rE36?1fLSPnn2E{;9Ig2yUo|uhD2U8jVJy(P%UpjYgxy9JOnE zq&z-T zg{Y)L9Lu%>%$$+A;FOk?2m=6{0eA}zHXxWMAK3apbp-$>DSB!iplr7Au=wk{n^HSb zf(W-RJSdDH7o^%TKUW4~^a<1MM}$&onc~J7;)OXl}Ks-51zODPgtXq?;@U@fMnA~fG%>X>@#~TtD z^D2nT%Io0^s4MyGzCQOWS+IS}2aSIRv9uwOaNY4L*K{G+=t#dbKlrgOIDTVh!uNk) zp6-NDTdeOPs{!W1m~(9ags)iIVjR^3`rOW?M8loODAHw*V{zgC8yeD=+cY!~wVpXi zbmu0mIsBtIcksDql5zHHnU8u1{WDRJxec%`$M%Zqa%~WJA0YY6Of>+VBw+0eaE<3enDPLM+m|6e(kLyPY~Q2? z5UqY)HT7RaXCdJ}@=ePRRW_kP{4wKM*|?wS1o^A4pHCMq*q2#GZzY;a)_~uC@UFbZ zI05mIhFJ@#0nkFT5qRTi&o`#MUq+`&1^$dvHG*n806*^)&L0G_V$&e`{)(I8Maj2n zA?*jC5iT-H|3x(eJ5o1xlPcy##Brv60OO?{5cgQz*YyqGiuJ3l(XEd6@jJ^(f6!pO zX~~jFEgahbEWuklQ+=>WMsz%nRG$PPSv>4Une*ujbRhBpwY9AizL@u@;e5@mU#WlN z<5KZc9mr_rG%*lYRT1vqg2CbRdL#V|1x1GMj?4}wQPB>F)yirvh{Y43Au|2|0fcT& z3XTxxWw7{cq+G@IgI=Yv4GSS&QgBfNjAKy)jIh0ZUuv%w*8+x@&1WNi>NC`6B&DOF z0fICxnF^!L0EyAcMe(|T6ZZ1Qj95?(;m7+oZlyUmN6GK=XyVw4@cCJ|9V_@$oJw+T zLME*F05s5UlQI~Fcbbq15}uIZ!kBXg08>39#*~#+sr48=GBPrlle%j(8jVJy(M%ox Y0s$J3(k_;0NdN!<07*qoM6N<$g2-Uwb^rhX literal 0 HcmV?d00001 diff --git a/modular_skyrat/modules/deforest_medical_items/icons/worn/worn.dmi b/modular_skyrat/modules/deforest_medical_items/icons/worn/worn.dmi new file mode 100644 index 0000000000000000000000000000000000000000..3705fdb63f4f9eeffd7742b488c7400d371e2aea GIT binary patch literal 1087 zcmeAS@N?(olHy`uVBq!ia0vp^4M3d0!3HF+R#kZdskW++h!U67;^d;tf|AVqJO+k} zIl*BCMWx@r1Q&e#`b5iHSL@uF^T8WJ4K5l#c%*aQNAn~@QBUs<3*#W;%f?;`a~@4P zGATqMc%{Wg6-#AP_s(u()y*p;mh^TTuhlR#7d>L;5)>XaAxb1ZCThyOs1VP9(x||? zIM1{!LA};fTX> zi=2?>D}mMtqAjfVUdf;6u)22Aeu?vig^QQ}Vz(+gvDo~hfXGA5Nk&2ZqMpZ|9Z$`O zy8bP4Zan|zx`U72ZL4{1Z9M<^P5GT>&z?Q=@tQn&vgdLAyNy?P6?B;bEJ#5YAAMQ* z>~Zn&Su20PaI;-?eO3SZSOzO!gJaKl{O)i>-di14wKkMt%gJ)Nd-wLO^W83f_uAiu zP8#r=X3OyexH~)W+Oj*%-v3-)#ER`SMES+ie(99#*Zsvc< zC1o71O4G7!SFH$TaG9OooRFLU2WZZ+#jLjV8Joq@83NabGDr7IZrv!nW%i=^if4Uf z@?vlDMc&&Y7A)SMH&?KCX6&nfKce=s3HbWWUgvwU^zW72SpKJnKKJuhKRY?MDrEhu zou?j4m;R1B&^%Fi_r4u7V}C_uUizW^-(!2?n zIk9)YOz6M;47%@byofX|O4B**8W#Ub-;Kkh?bzv3-KL8z>*My#yL%-0+ta*#$8_GU zS=@Pl_P+VP97*4j&F}A({oQavsbFV|LYe&BW1bhC%@jQd6(EO@V>qBDL*X8 zkZFMfA3iL7_T$G{h4@Dyu~+#6cdx5i)4APVV4<6w?4MM(>GnUhe)3-pt#!Jv=vONm#dLO?9MjK4XATa)+tk`lRnq`?k;D_`AkLx!b<( zx6by%?eA;PS^Vt0JAL=P-;%d)OD0q*pOZAWX0f;H?sV&Wb;rI{ooKV+Dzg0)oaD>E ca3Jn4qvo=me{wcgN`PGI>FVdQ&MBb@08`cct^fc4 literal 0 HcmV?d00001 diff --git a/modular_skyrat/modules/deforest_medical_items/icons/worn/worn_teshari.dmi b/modular_skyrat/modules/deforest_medical_items/icons/worn/worn_teshari.dmi new file mode 100644 index 0000000000000000000000000000000000000000..9dc17287bda1931d47ad971fd8bcb38d0ffda34b GIT binary patch literal 1051 zcmeAS@N?(olHy`uVBq!ia0vp^4M3d0!3HF+R#kZdskW++h!U67;^d;tf|AVqJO+k} zIl*BCMWx@r1Q&e#`b5iHSL@uF^T8WJ4K5l#c%*aQNAn~@QBUs<3*#W;%f?;`a~@4P zGATqMc%{Wg6-#AP_s(u()y*p;mh^TTuhlR#7d>L;5)>XaAxb1ZCThyOs1VP9(x||? zIM1{!LA};fT8E;U?z~CcCm-?dhVuKpb1RK^H_E(>j)*AGyqdLj$Sb(LhvkJUzE_U&<7Z@;+8X2+WCvifM&X1BL4Po*5h zv!mzUdwrpL?&jYKJk$J{*NEm@2cC*SbeGE|?u1^i*nr=xmA7x;5{`C*S)$oyT}9@zd_@Yo!?OE@lKK zKva-cP_RV8-sYx_)A4OPP6=9-nVT*-CF_0RJuA-}`2yv`?00TnHg;t9-Y62hajG)w z)dhdno>SLYK4*(n=^V>ay%%~5BDyj^Iv;&Ir9M`=_S)-NPMrIgef(rf*WcSywl?f^ znC7%3t+G|J4wa$J_gQBB2>Ci?(%QBQ-?Qw~R$WcAKJfLX^y~JwUYf5oRqH1>-Df&w z@Zg)mEBTdKn!3?z7d~G0j~CUwVBU>+$By}lUA`>7sJ__Ua*B4@JR@#PHphLkYm)Nb z|9PnP>b-MIwl`4Xy4r;&?J~^?@%;8%($B_9_1UYRS{So4D)z5P2~U$r!>*0jgP!Ox z|KH`@<2d2J+`cbw(^mw{uKK?9{^>})aJS`M>0hU=_