From fe7c8e1fde1bf8a02b31f7c87497d4eb3bb1ac67 Mon Sep 17 00:00:00 2001 From: carlarctg <53100513+carlarctg@users.noreply.github.com> Date: Thu, 28 Nov 2024 20:42:04 -0300 Subject: [PATCH] Adds some Fish Content (#88213) ## About The Pull Request Adds a new biotype, MOB_AQUATIC, indicating the mob is water-themed somehow. Given to carp, lobstrosities, frogs, axolotls, penguins, fire sharks. Aquatic mobs can be hooked by fishing rods, even without a jawed fishing hook installed. The carp and fish infusion sets now give the infusee the aquatic biotype. Added support for infusions adding a biotype. You can check for a fish's pulse with a stethoscope, which will tell you its status even without fishing skill. Refined fish health status checks to be more precise. Added 'Fishy' Reagent, a version of strange reagent that only works for fish or aquatic biotype mobs. It's made with omnizine, saltwater, and carpotoxin or tetrodotoxin. Added a lifish chemical reaction that creates fish. ## Why It's Good For The Game Fish content fish content fish content > Adds a new biotype, MOB_AQUATIC, indicating the mob is water-themed somehow. Given to carp, lobstrosities, frogs, axolotls, penguins, fire sharks. We were really missing this one by now. > Aquatic mobs can be hooked by fishing rods, even without a jawed fishing hook installed. > The carp and fish infusion sets now give the infusee the aquatic biotype. Added support for infusions adding a biotype. I want to reel in fish people. This is going to be hilarious. > You can check for a fish's pulse with a stethoscope, which will tell you its status even without fishing skill. Fish doctor content - also lets you see the exact status of a fish's health even if you haven't interacted w/ fishing that shift. > Added 'Fishy' Reagent, a version of strange reagent that only works for fish or aquatic biotype mobs. It's made with omnizine, saltwater, and carpotoxin or tetrodotoxin. A somewhat easier to get version of strange reagent, purely for fish, as they die very easily and the road to making SR is a large diversion. I might add this to cargo, maybe? > Added a lifish chemical reaction that creates fish. Fish. fish fish fish fish fish. @Ghommie ## Changelog :cl: add: Adds a new biotype, MOB_AQUATIC, indicating the mob is water-themed somehow. Given to carp, lobstrosities, frogs, axolotls, penguins, fire sharks. add: Aquatic mobs can be hooked by fishing rods, even without a jawed fishing hook installed. add: The carp and fish infusion sets now give the infusee the aquatic biotype. Added support for infusions adding a biotype. add: You can check for a fish's pulse with a stethoscope, which will tell you its status even without fishing skill. qol: Refined fish health status checks to be more precise. add: Added 'Fishy' Reagent, a version of strange reagent that only works for fish or aquatic biotype mobs. It's made with omnizine, saltwater, and carpotoxin or tetrodotoxin. add: Added a lifish chemical reaction that creates fish. /:cl: --------- Co-authored-by: _0Steven <42909981+00-Steven@users.noreply.github.com> Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> --- code/__DEFINES/mobs.dm | 2 + code/datums/elements/organ_set_bonus.dm | 22 ++++++ .../dna_infuser/organ_sets/carp_organs.dm | 1 + .../dna_infuser/organ_sets/fish_organs.dm | 1 + .../dna_infuser/organ_sets/roach_organs.dm | 9 +-- code/modules/fishing/fish/_fish.dm | 69 ++++++++++++++----- code/modules/fishing/fish/fish_traits.dm | 1 + code/modules/fishing/fish/types/mining.dm | 3 + code/modules/fishing/fish/types/ruins.dm | 3 + code/modules/fishing/fishing_equipment.dm | 7 +- .../mob/living/basic/heretic/fire_shark.dm | 2 +- .../basic/lavaland/lobstrosity/lobstrosity.dm | 1 + .../mob/living/basic/pets/penguin/penguin.dm | 1 + .../mob/living/basic/space_fauna/carp/carp.dm | 2 +- .../mob/living/basic/vermin/axolotl.dm | 2 +- code/modules/mob/living/basic/vermin/frog.dm | 2 +- .../chemistry/reagents/medicine_reagents.dm | 30 ++++++++ .../reagents/chemistry/recipes/medicine.dm | 10 +++ .../reagents/chemistry/recipes/others.dm | 23 +++++++ .../reagent_containers/cups/bottle.dm | 5 ++ 20 files changed, 166 insertions(+), 30 deletions(-) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index a1496d2e138..11182e1ea2f 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -73,6 +73,8 @@ #define MOB_PLANT (1 << 10) ///The mob is a goopy creature, probably coming from xenobiology. #define MOB_SLIME (1 << 11) +/// Mob is fish or water-related. +#define MOB_AQUATIC (1 << 12) //Lung respiration type flags #define RESPIRATION_OXYGEN (1 << 0) diff --git a/code/datums/elements/organ_set_bonus.dm b/code/datums/elements/organ_set_bonus.dm index 118c64fbeaf..a8d1d3c7ad7 100644 --- a/code/datums/elements/organ_set_bonus.dm +++ b/code/datums/elements/organ_set_bonus.dm @@ -57,6 +57,10 @@ var/required_biotype = MOB_ORGANIC /// A list of traits added to the mob upon bonus activation, can be of any length. var/list/bonus_traits = list() + /// Bonus biotype to add on bonus activation. + var/bonus_biotype + /// If the biotype was added - used to check if we should remove the biotype or not, on organ set loss. + var/biotype_added = FALSE /// Limb overlay to apply upon activation var/limb_overlay /// Color priority for limb overlay @@ -80,10 +84,20 @@ if((required_biotype == MOB_ORGANIC) && !owner.can_mutate()) return FALSE bonus_active = TRUE + // Add traits if(length(bonus_traits)) owner.add_traits(bonus_traits, REF(src)) + + // Add biotype + if(owner.mob_biotypes & bonus_biotype) + biotype_added = FALSE + owner.mob_biotypes |= bonus_biotype + biotype_added = TRUE + if(bonus_activate_text) to_chat(owner, bonus_activate_text) + + // Add limb overlay if(!iscarbon(owner) || !limb_overlay) return TRUE var/mob/living/carbon/carbon_owner = owner @@ -96,10 +110,18 @@ /datum/status_effect/organ_set_bonus/proc/disable_bonus() SHOULD_CALL_PARENT(TRUE) bonus_active = FALSE + + // Remove traits if(length(bonus_traits)) owner.remove_traits(bonus_traits, REF(src)) + // Remove biotype (if added) + if(biotype_added) + owner.mob_biotypes &= ~bonus_biotype + if(bonus_deactivate_text) to_chat(owner, bonus_deactivate_text) + + // Remove limb overlay if(!iscarbon(owner) || QDELETED(owner) || !limb_overlay) return var/mob/living/carbon/carbon_owner = owner diff --git a/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm b/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm index 1e4bc41ae41..9a873b5e373 100644 --- a/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm @@ -10,6 +10,7 @@ bonus_activate_text = span_notice("Carp DNA is deeply infused with you! You've learned how to propel yourself through space!") bonus_deactivate_text = span_notice("Your DNA is once again mostly yours, and so fades your ability to space-swim...") bonus_traits = list(TRAIT_SPACEWALK) + bonus_biotype = MOB_AQUATIC limb_overlay = /datum/bodypart_overlay/texture/carpskin color_overlay_priority = LIMB_COLOR_CARP_INFUSION diff --git a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm index 7dda9ba1563..69f5a23798f 100644 --- a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm @@ -23,6 +23,7 @@ TRAIT_EXPANDED_FOV, //fish vision TRAIT_WATER_ADAPTATION, ) + bonus_biotype = MOB_AQUATIC /datum/status_effect/organ_set_bonus/fish/enable_bonus() . = ..() diff --git a/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm b/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm index 03955f06ffe..2c07038fd17 100644 --- a/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm @@ -16,10 +16,9 @@ // - Immunity to nuke gibs // - Nukes come with radiation (not actually but yknow) bonus_traits = list(TRAIT_NUKEIMMUNE, TRAIT_RADIMMUNE, TRAIT_VIRUS_RESISTANCE) + bonus_biotype = MOB_BUG /// Armor type attached to the owner's physiology var/datum/armor/given_armor = /datum/armor/roach_internal_armor - /// Storing biotypes pre-organ bonus applied so we don't remove bug from mobs which should have it. - var/old_biotypes = NONE /datum/status_effect/organ_set_bonus/roach/enable_bonus() . = ..() @@ -29,9 +28,6 @@ var/mob/living/carbon/human/human_owner = owner human_owner.physiology.armor = human_owner.physiology.armor.add_other_armor(given_armor) - old_biotypes = human_owner.mob_biotypes - human_owner.mob_biotypes |= MOB_BUG - /datum/status_effect/organ_set_bonus/roach/disable_bonus() . = ..() if(!ishuman(owner) || QDELETED(owner)) @@ -40,9 +36,6 @@ var/mob/living/carbon/human/human_owner = owner human_owner.physiology.armor = human_owner.physiology.armor.subtract_other_armor(given_armor) - if(!(old_biotypes & MOB_BUG)) // only remove bug if it wasn't there before - human_owner.mob_biotypes &= ~MOB_BUG - /// Roach heart: /// Reduces damage taken from brute attacks from behind, /// but increases duration of knockdowns diff --git a/code/modules/fishing/fish/_fish.dm b/code/modules/fishing/fish/_fish.dm index cee77ae003d..fcad429c2b9 100644 --- a/code/modules/fishing/fish/_fish.dm +++ b/code/modules/fishing/fish/_fish.dm @@ -219,8 +219,26 @@ if(istype(held_item, /obj/item/fish_analyzer)) context[SCREENTIP_CONTEXT_LMB] = "Scan" return CONTEXTUAL_SCREENTIP_SET + if(istype(held_item, /obj/item/clothing/neck/stethoscope)) + context[SCREENTIP_CONTEXT_LMB] = "Check Pulse" + return CONTEXTUAL_SCREENTIP_SET return NONE +/obj/item/fish/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/clothing/neck/stethoscope)) + return NONE + user.balloon_alert_to_viewers("checking pulse") + if(!do_after(user, 2.5 SECONDS, src)) + return ITEM_INTERACT_FAILURE + // Sir... I'm afraid your fish is dying. + user.visible_message(span_notice("[user] checks the pulse of [src] with [tool]."), span_notice("You check the pulse of [src] with [tool].")) + var/warns = get_health_warnings(user, always_deep = TRUE) + if(!warns) + to_chat(user, span_notice("[src] appears to be perfectly healthy!")) + return ITEM_INTERACT_SUCCESS + to_chat(user, warns) + return ITEM_INTERACT_SUCCESS + /obj/item/fish/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) if(!HAS_TRAIT(interacting_with, TRAIT_CATCH_AND_RELEASE)) return NONE @@ -434,27 +452,46 @@ /obj/item/fish/examine(mob/user) . = ..() - if(HAS_MIND_TRAIT(user, TRAIT_EXAMINE_DEEPER_FISH)) - if(status == FISH_DEAD) - . += span_deadsay("It's [HAS_MIND_TRAIT(user, TRAIT_NAIVE) ? "taking the big snooze" : "dead"].") - else - var/list/warnings = list() - if(is_starving()) - warnings += "starving" - if(!HAS_TRAIT(src, TRAIT_FISH_STASIS) && !proper_environment()) - warnings += "drowning" - if(health < initial(health) * 0.6) - warnings += "sick" - if(length(warnings)) - . += span_warning("It's [english_list(warnings)].") if(HAS_MIND_TRAIT(user, TRAIT_EXAMINE_FISH)) . += span_notice("It's [size] cm long.") . += span_notice("It weighs [weight] g.") - if(HAS_TRAIT(src, TRAIT_FISHING_BAIT)) - . += span_smallnoticeital("It can be used as a fishing bait.") + + . += get_health_warnings(user, always_deep = FALSE) + + if(HAS_TRAIT(src, TRAIT_FISHING_BAIT)) + . += span_smallnoticeital("It can be used as a fishing bait.") + if(bites_amount) . += span_warning("It's been bitten by someone.") +/obj/item/fish/proc/get_health_warnings(mob/user, always_deep = FALSE) + if(!HAS_MIND_TRAIT(user, TRAIT_EXAMINE_DEEPER_FISH) && !always_deep) + return + if(status == FISH_DEAD) + return span_deadsay("It's [HAS_MIND_TRAIT(user, TRAIT_NAIVE) ? "taking the big snooze" : "dead"].") + + var/list/warnings = list() + if(is_starving()) + warnings += "starving" + if(!HAS_TRAIT(src, TRAIT_FISH_STASIS) && !proper_environment()) + warnings += "drowning" + + var/health_ratio = health / initial(health) + switch(health_ratio) + if(0 to 0.25) + warnings += "dying" + if(0.25 to 0.5) + warnings += "very unhealthy" + if(0.5 to 0.75) + warnings += "unhealthy" + if(0.75 to 0.9) + warnings += "mostly healthy" + + if(length(warnings)) + . += span_warning("It's [english_list(warnings)].") + + return . + /** * This proc takes a base size, base weight and deviation arguments to generate new size and weight through a gaussian distribution (bell curve) * Mainly used to determinate the size and weight of caught fish. @@ -961,7 +998,7 @@ var/datum/reagent/medicine/strange_reagent/revival = locate() in reagents if(!revival) return - if(reagents[revival] >= 2 * w_class) + if(reagents[revival] >= 2 * w_class && revival.pre_rez_check(src)) set_status(FISH_ALIVE) else balloon_alert_to_viewers("twitches for a moment!") diff --git a/code/modules/fishing/fish/fish_traits.dm b/code/modules/fishing/fish/fish_traits.dm index aa045c6308b..c3b813b5b48 100644 --- a/code/modules/fishing/fish/fish_traits.dm +++ b/code/modules/fishing/fish/fish_traits.dm @@ -596,6 +596,7 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) diff_traits_inheritability = 25 catalog_description = "This fish will invert the gravity of the bait at random. May fall upward outside after being caught." added_difficulty = 20 + reagents_to_add = list(/datum/reagent/gravitum = 2.3) /datum/fish_trait/antigrav/minigame_mod(obj/item/fishing_rod/rod, mob/fisherman, datum/fishing_challenge/minigame) minigame.special_effects |= FISHING_MINIGAME_RULE_ANTIGRAV diff --git a/code/modules/fishing/fish/types/mining.dm b/code/modules/fishing/fish/types/mining.dm index 3a1d6ff8310..4ba63bfdb65 100644 --- a/code/modules/fishing/fish/types/mining.dm +++ b/code/modules/fishing/fish/types/mining.dm @@ -143,6 +143,9 @@ /obj/item/fish/boned/make_edible(weight_val) return //it's all bones and no meat. +/obj/item/fish/boned/get_health_warnings(mob/user, always_deep = FALSE) + return list(span_deadsay("It's bones.")) + /obj/item/fish/lavaloop name = "lavaloop fish" fish_id = "lavaloop" diff --git a/code/modules/fishing/fish/types/ruins.dm b/code/modules/fishing/fish/types/ruins.dm index a9a71489867..233c6961d26 100644 --- a/code/modules/fishing/fish/types/ruins.dm +++ b/code/modules/fishing/fish/types/ruins.dm @@ -37,6 +37,9 @@ /obj/item/fish/mastodon/get_export_price(price, elasticity_percent) return ..() * 1.2 //This should push its soft-capped (it's pretty big) price a bit above the rest +/obj/item/fish/mastodon/get_health_warnings(mob/user, always_deep = FALSE) + return list(span_deadsay("It's bones.")) + ///From the cursed spring /obj/item/fish/soul name = "soulfish" diff --git a/code/modules/fishing/fishing_equipment.dm b/code/modules/fishing/fishing_equipment.dm index ab72b0b0fb2..d1ed33e9a21 100644 --- a/code/modules/fishing/fishing_equipment.dm +++ b/code/modules/fishing/fishing_equipment.dm @@ -174,6 +174,9 @@ ///Check if tha target can be caught by the hook /obj/item/fishing_hook/proc/can_be_hooked(atom/target) + if(isliving(target)) + var/mob/living/mob = target + return (mob.mob_biotypes & MOB_AQUATIC) return isitem(target) ///Any special effect when hooking a target that's not managed by the fishing rod. @@ -430,12 +433,12 @@ ///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." + 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/strange_reagent(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) diff --git a/code/modules/mob/living/basic/heretic/fire_shark.dm b/code/modules/mob/living/basic/heretic/fire_shark.dm index 1ac4ccb7b23..0dfb9a3a157 100644 --- a/code/modules/mob/living/basic/heretic/fire_shark.dm +++ b/code/modules/mob/living/basic/heretic/fire_shark.dm @@ -5,7 +5,7 @@ icon_state = "fire_shark" icon_living = "fire_shark" pass_flags = PASSTABLE | PASSMOB - mob_biotypes = MOB_ORGANIC | MOB_BEAST + mob_biotypes = MOB_ORGANIC | MOB_BEAST | MOB_AQUATIC speed = -0.5 health = 16 maxHealth = 16 diff --git a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm index d8288360bd1..ebca48f2fa2 100644 --- a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm +++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm @@ -12,6 +12,7 @@ maxHealth = 150 health = 150 obj_damage = 15 + mob_biotypes = MOB_ORGANIC|MOB_BEAST|MOB_AQUATIC melee_damage_lower = 15 melee_damage_upper = 19 attack_verb_continuous = "snips" diff --git a/code/modules/mob/living/basic/pets/penguin/penguin.dm b/code/modules/mob/living/basic/pets/penguin/penguin.dm index 0df0dfedcb2..376234f3a3e 100644 --- a/code/modules/mob/living/basic/pets/penguin/penguin.dm +++ b/code/modules/mob/living/basic/pets/penguin/penguin.dm @@ -11,6 +11,7 @@ response_harm_simple = "kick" faction = list(FACTION_NEUTRAL) + mob_biotypes = MOB_ORGANIC|MOB_BEAST|MOB_AQUATIC ai_controller = /datum/ai_controller/basic_controller/penguin ///it can lay an egg? var/can_lay_eggs = TRUE diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp.dm b/code/modules/mob/living/basic/space_fauna/carp/carp.dm index b16a00a6906..acd72af2b38 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp.dm @@ -19,7 +19,7 @@ icon_dead = "base_dead" icon_gib = "carp_gib" gold_core_spawnable = HOSTILE_SPAWN - mob_biotypes = MOB_ORGANIC | MOB_BEAST + mob_biotypes = MOB_ORGANIC | MOB_BEAST | MOB_AQUATIC health = 25 maxHealth = 25 pressure_resistance = 200 diff --git a/code/modules/mob/living/basic/vermin/axolotl.dm b/code/modules/mob/living/basic/vermin/axolotl.dm index 3b1f630df40..2ee244a7f62 100644 --- a/code/modules/mob/living/basic/vermin/axolotl.dm +++ b/code/modules/mob/living/basic/vermin/axolotl.dm @@ -12,7 +12,7 @@ density = FALSE pass_flags = PASSTABLE | PASSGRILLE | PASSMOB mob_size = MOB_SIZE_TINY - mob_biotypes = MOB_ORGANIC | MOB_BEAST + mob_biotypes = MOB_ORGANIC|MOB_BEAST|MOB_AQUATIC gold_core_spawnable = FRIENDLY_SPAWN response_help_continuous = "pets" diff --git a/code/modules/mob/living/basic/vermin/frog.dm b/code/modules/mob/living/basic/vermin/frog.dm index d2a634b7e9e..169fa4e8335 100644 --- a/code/modules/mob/living/basic/vermin/frog.dm +++ b/code/modules/mob/living/basic/vermin/frog.dm @@ -4,7 +4,7 @@ icon_state = "frog" icon_living = "frog" icon_dead = "frog_dead" - mob_biotypes = MOB_ORGANIC|MOB_BEAST + mob_biotypes = MOB_ORGANIC|MOB_BEAST|MOB_AQUATIC verb_say = "ribbits" verb_ask = "ribbits inquisitively" verb_exclaim = "croaks" diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index da743f96563..9a169257e1c 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -921,6 +921,10 @@ /// The maximum amount of damage we can revive from, as a ratio of max health var/max_revive_damage_ratio = 2 +// To override for subtypes. +/datum/reagent/medicine/strange_reagent/proc/pre_rez_check(atom/thing_to_rez) + return TRUE + /datum/reagent/medicine/strange_reagent/instant name = "Stranger Reagent" instant = TRUE @@ -980,6 +984,11 @@ exposed_mob.do_jitter_animation(10) return + if(!pre_rez_check(exposed_mob)) + exposed_mob.visible_message(span_warning("[exposed_mob]'s body twitches slightly.")) + exposed_mob.do_jitter_animation(1) + return + exposed_mob.visible_message(span_warning("[exposed_mob]'s body starts convulsing!")) exposed_mob.notify_revival("Your body is being revived with Strange Reagent!") exposed_mob.do_jitter_animation(10) @@ -1010,6 +1019,27 @@ if(need_mob_update) return UPDATE_MOB_HEALTH +/datum/reagent/medicine/strange_reagent/fishy_reagent + name = "Fishy Reagent" + description = "This reagent has a chemical composition very similar to that of Strange Reagent, however, it seems to work purely and only on... fish. Or at least, aquatic creatures." + reagent_state = LIQUID + color = "#5ee8b3" + metabolization_rate = 1.25 * REAGENTS_METABOLISM + taste_description = "magnetic scales" + ph = 0.5 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +// only revives fish. +/datum/reagent/medicine/strange_reagent/fishy_reagent/pre_rez_check(atom/thing_to_rez) + if(ismob(thing_to_rez)) + var/mob/living/mob_to_rez = thing_to_rez + if(mob_to_rez.mob_biotypes & MOB_AQUATIC) + return TRUE + return FALSE + if(isfish(thing_to_rez)) + return TRUE + return FALSE + /datum/reagent/medicine/mannitol name = "Mannitol" description = "Efficiently restores brain damage." diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 868917893c9..84f251b759f 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -208,6 +208,16 @@ required_reagents = list(/datum/reagent/medicine/omnizine/protozine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1) reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_PLANT | REACTION_TAG_OTHER +/datum/chemical_reaction/medicine/fishy_reagent + results = list(/datum/reagent/medicine/strange_reagent/fishy_reagent = 3) + required_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/water/salt = 1, /datum/reagent/toxin/carpotoxin = 1) + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OTHER + +/datum/chemical_reaction/medicine/fishy_reagent/alt + results = list(/datum/reagent/medicine/strange_reagent/fishy_reagent = 6) + required_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/water/salt = 1, /datum/reagent/toxin/tetrodotoxin = 1) + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OTHER + /datum/chemical_reaction/medicine/mannitol results = list(/datum/reagent/medicine/mannitol = 3) required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/hydrogen = 1, /datum/reagent/water = 1) diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 542850ac9be..6219fc96457 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -575,6 +575,29 @@ new /mob/living/basic/pet/dog/corgi(location) ..() +/datum/chemical_reaction/lifish + required_reagents = list(/datum/reagent/medicine/strange_reagent/fishy_reagent = 1, /datum/reagent/medicine/c2/synthflesh = 1, /datum/reagent/blood = 1) + required_temp = 374 + reaction_flags = REACTION_INSTANT + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE + +/datum/chemical_reaction/lifish/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + var/location = get_turf(holder.my_atom) + + // create fish possibles + var/list/fish_types = list() + for(var/path in subtypesof(/obj/item/fish)) + var/obj/item/fish/fake_fish = path + if(initial(fake_fish.random_case_rarity) == FISH_RARITY_NOPE) // means they aren't mean to be randomly available + continue + fish_types |= path + + // spawn from popssible fishes + for(var/i in 1 to rand(1, created_volume)) // More flop. + var/obj/item/fish/spawned_fish = pick(fish_types) + new spawned_fish(location) + return ..() + //monkey powder heehoo /datum/chemical_reaction/monkey_powder results = list(/datum/reagent/monkey_powder = 5) diff --git a/code/modules/reagents/reagent_containers/cups/bottle.dm b/code/modules/reagents/reagent_containers/cups/bottle.dm index ff18c6a9456..4c757e0e146 100644 --- a/code/modules/reagents/reagent_containers/cups/bottle.dm +++ b/code/modules/reagents/reagent_containers/cups/bottle.dm @@ -134,6 +134,11 @@ desc = "A small bottle. May be used to revive people." list_reagents = list(/datum/reagent/medicine/strange_reagent = 30) +/obj/item/reagent_containers/cup/bottle/fishy_reagent + name = "Fishy Reagent Bottle" + desc = "A small bottle. May be used to revive fish." + list_reagents = list(/datum/reagent/medicine/strange_reagent/fishy_reagent = 30) + /obj/item/reagent_containers/cup/bottle/traitor name = "syndicate bottle" desc = "A small bottle. Contains a random nasty chemical."