From 9609511e877065e77db3b8fda527726432e8ee5a Mon Sep 17 00:00:00 2001 From: Casey Date: Sun, 27 Mar 2022 14:58:25 -0400 Subject: [PATCH] Makes Xenobio Great Again --- code/_helpers/global_lists_vr.dm | 249 +++ code/game/objects/items/devices/flashlight.dm | 27 - .../ai/ai_holder_subtypes/slime_xenobio_ai.dm | 21 +- .../subtypes/slime/xenobio/subtypes.dm | 3 +- .../subtypes/slime/xenobio/xenobio.dm | 37 +- .../reagents/reactions/instant/instant_vr.dm | 14 +- code/modules/xenobio/items/extracts.dm | 2 + code/modules/xenobio/items/extracts_vr.dm | 1661 +++++++++++++++++ code/modules/xenobio/items/slime_objects.dm | 96 +- code/modules/xenobio/items/slimepotions.dm | 8 +- code/modules/xenobio/items/slimepotions_vr.dm | 189 ++ icons/inventory/back/item.dmi | Bin 26764 -> 27719 bytes icons/inventory/back/mob.dmi | Bin 125953 -> 126716 bytes icons/mob/slimes_vr.dmi | Bin 0 -> 480 bytes vorestation.dme | 3 +- 15 files changed, 2263 insertions(+), 47 deletions(-) create mode 100644 code/modules/xenobio/items/extracts_vr.dm create mode 100644 code/modules/xenobio/items/slimepotions_vr.dm create mode 100644 icons/mob/slimes_vr.dmi diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index 850ec24c38..8088eaa5e1 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -590,3 +590,252 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN, var/global/list/weavable_structures = list() var/global/list/weavable_items = list() + + +var/global/list/xenobio_metal_materials_normal = list( + /obj/item/stack/material/steel = 20, + /obj/item/stack/material/glass = 15, + /obj/item/stack/material/plastic = 12, + /obj/item/stack/material/wood = 12, + /obj/item/stack/material/cardboard = 6, + /obj/item/stack/material/sandstone = 5, + /obj/item/stack/material/log = 5, + /obj/item/stack/material/lead = 5, + /obj/item/stack/material/iron = 5, + /obj/item/stack/material/graphite = 5, + /obj/item/stack/material/copper = 4, + /obj/item/stack/material/tin = 4, + /obj/item/stack/material/bronze = 4, + /obj/item/stack/material/aluminium = 4) + +var/global/list/xenobio_metal_materials_adv = list( + /obj/item/stack/material/glass/reinforced = 15, + /obj/item/stack/material/marble = 10, + /obj/item/stack/material/plasteel = 10, + /obj/item/stack/material/glass/phoronglass = 10, + /obj/item/stack/material/wood/sif = 5, + /obj/item/stack/material/wood/hard = 5, + /obj/item/stack/material/log/sif = 5, + /obj/item/stack/material/log/hard = 5, + /obj/item/stack/material/glass/phoronrglass = 5, + /obj/item/stack/material/glass/titanium = 3, + /obj/item/stack/material/glass/plastitanium = 3, + /obj/item/stack/material/durasteel = 2, + /obj/item/stack/material/painite = 1, + /obj/item/stack/material/void_opal = 1, + /obj/item/stack/material/quartz = 1) + +var/global/list/xenobio_metal_materials_weird = list( + /obj/item/stack/material/cloth = 10, + /obj/item/stack/material/leather = 5, + /obj/item/stack/material/fiber = 5, + /obj/item/stack/material/fur/wool = 7, + /obj/item/stack/material/snow = 3, + /obj/item/stack/material/snowbrick = 3, + /obj/item/stack/material/flint = 3, + /obj/item/stack/material/stick = 3, + /obj/item/stack/material/chitin = 1) + +var/global/list/xenobio_silver_materials_basic = list( + /obj/item/stack/material/silver = 10, + /obj/item/stack/material/uranium = 8, + /obj/item/stack/material/gold = 6, + /obj/item/stack/material/titanium = 4, + /obj/item/stack/material/phoron = 1) + +var/global/list/xenobio_silver_materials_adv = list( + /obj/item/stack/material/deuterium = 5, + /obj/item/stack/material/tritium = 5, + /obj/item/stack/material/osmium = 5, + /obj/item/stack/material/mhydrogen = 3, + /obj/item/stack/material/diamond = 2, + /obj/item/stack/material/verdantium = 1) + +var/global/list/xenobio_silver_materials_special = list( + /obj/item/stack/material/valhollide = 1, + /obj/item/stack/material/morphium = 1, + /obj/item/stack/material/supermatter = 1) + +var/global/list/xenobio_gold_mobs_hostile = list( + /mob/living/simple_mob/vore/alienanimals/space_jellyfish, + /mob/living/simple_mob/vore/alienanimals/skeleton, + /mob/living/simple_mob/vore/alienanimals/space_ghost, + /mob/living/simple_mob/vore/alienanimals/startreader, + /mob/living/simple_mob/animal/passive/mouse/operative, + /mob/living/simple_mob/animal/giant_spider, + /mob/living/simple_mob/animal/giant_spider/frost, + /mob/living/simple_mob/animal/giant_spider/electric, + /mob/living/simple_mob/animal/giant_spider/hunter, + /mob/living/simple_mob/animal/giant_spider/lurker, + /mob/living/simple_mob/animal/giant_spider/pepper, + /mob/living/simple_mob/animal/giant_spider/thermic, + /mob/living/simple_mob/animal/giant_spider/tunneler, + /mob/living/simple_mob/animal/giant_spider/webslinger, + /mob/living/simple_mob/animal/giant_spider/phorogenic, + /mob/living/simple_mob/animal/giant_spider/carrier, + /mob/living/simple_mob/animal/giant_spider/nurse, + /mob/living/simple_mob/animal/giant_spider/ion, + /mob/living/simple_mob/animal/giant_spider/nurse/queen, + /mob/living/simple_mob/animal/sif/diyaab, + /mob/living/simple_mob/animal/sif/duck, + /mob/living/simple_mob/animal/sif/frostfly, + /mob/living/simple_mob/animal/sif/glitterfly, + /mob/living/simple_mob/animal/sif/hooligan_crab, + /mob/living/simple_mob/animal/sif/kururak, + /mob/living/simple_mob/animal/sif/leech, + /mob/living/simple_mob/animal/sif/tymisian, + /mob/living/simple_mob/animal/sif/sakimm, + /mob/living/simple_mob/animal/sif/savik, + /mob/living/simple_mob/animal/sif/shantak, + /mob/living/simple_mob/animal/sif/siffet, + /mob/living/simple_mob/animal/space/alien, + /mob/living/simple_mob/animal/space/alien/drone, + /mob/living/simple_mob/animal/space/alien/sentinel, + /mob/living/simple_mob/animal/space/alien/sentinel/praetorian, + /mob/living/simple_mob/animal/space/alien/queen, + /mob/living/simple_mob/animal/space/alien/queen/empress, + /mob/living/simple_mob/animal/space/alien/queen/empress/mother, + /mob/living/simple_mob/animal/space/bats, + /mob/living/simple_mob/animal/space/bear, + /mob/living/simple_mob/animal/space/carp, + /mob/living/simple_mob/animal/space/carp/large, + /mob/living/simple_mob/animal/space/carp/large/huge, + /mob/living/simple_mob/animal/space/goose, + /mob/living/simple_mob/creature, + /mob/living/simple_mob/faithless, + /mob/living/simple_mob/tomato, + /mob/living/simple_mob/animal/space/tree, + /mob/living/simple_mob/vore/aggressive/corrupthound, + /mob/living/simple_mob/vore/aggressive/corrupthound/prettyboi, + /mob/living/simple_mob/vore/aggressive/deathclaw, + /mob/living/simple_mob/vore/aggressive/dino, + /mob/living/simple_mob/vore/aggressive/dragon, + /mob/living/simple_mob/vore/aggressive/frog, + /mob/living/simple_mob/otie, + /mob/living/simple_mob/otie/red, + /mob/living/simple_mob/vore/aggressive/panther, + /mob/living/simple_mob/vore/aggressive/rat, + /mob/living/simple_mob/vore/aggressive/giant_snake, + /mob/living/simple_mob/vore/sect_drone, + /mob/living/simple_mob/vore/sect_queen, + /mob/living/simple_mob/vore/weretiger, + /mob/living/simple_mob/animal/wolf, + /mob/living/simple_mob/vore/xeno_defanged) + +var/global/list/xenobio_gold_mobs_bosses = list( + /mob/living/simple_mob/animal/giant_spider/broodmother, + /mob/living/simple_mob/vore/leopardmander, + /mob/living/simple_mob/vore/leopardmander/blue, + /mob/living/simple_mob/vore/leopardmander/exotic, + /mob/living/simple_mob/vore/greatwolf, + /mob/living/simple_mob/vore/greatwolf/black, + /mob/living/simple_mob/vore/greatwolf/grey, + /mob/living/simple_mob/vore/bigdragon) + +var/global/list/xenobio_gold_mobs_safe = list( + /mob/living/simple_mob/vore/alienanimals/dustjumper, + /mob/living/simple_mob/vore/alienanimals/teppi, + /mob/living/simple_mob/animal/passive/chicken, + /mob/living/simple_mob/animal/passive/cow, + /mob/living/simple_mob/animal/goat, + /mob/living/simple_mob/animal/passive/crab, + /mob/living/simple_mob/animal/passive/mouse/jerboa, + /mob/living/simple_mob/animal/passive/lizard, + /mob/living/simple_mob/animal/passive/lizard/large, + /mob/living/simple_mob/animal/passive/yithian, + /mob/living/simple_mob/animal/passive/tindalos, + /mob/living/simple_mob/animal/passive/mouse, + /mob/living/simple_mob/animal/passive/penguin, + /mob/living/simple_mob/animal/passive/opossum, + /mob/living/simple_mob/animal/passive/cat, + /mob/living/simple_mob/animal/passive/dog/corgi, + /mob/living/simple_mob/animal/passive/dog/void_puppy, + /mob/living/simple_mob/animal/passive/dog/bullterrier, + /mob/living/simple_mob/animal/passive/dog/tamaskan, + /mob/living/simple_mob/animal/passive/dog/brittany, + /mob/living/simple_mob/animal/passive/fox, + /mob/living/simple_mob/animal/passive/fox/syndicate, + /mob/living/simple_mob/animal/passive/hare, + /mob/living/simple_mob/animal/passive/pillbug, + /mob/living/simple_mob/animal/passive/gaslamp, + /mob/living/simple_mob/animal/passive/snake, + /mob/living/simple_mob/animal/passive/snake/red, + /mob/living/simple_mob/animal/passive/snake/python, + /mob/living/simple_mob/vore/bee, + /mob/living/simple_mob/vore/fennec, + /mob/living/simple_mob/vore/fennix, + /mob/living/simple_mob/vore/hippo, + /mob/living/simple_mob/vore/horse, + /mob/living/simple_mob/animal/space/jelly, + /mob/living/simple_mob/vore/oregrub, + /mob/living/simple_mob/vore/oregrub/lava, + /mob/living/simple_mob/vore/rabbit, + /mob/living/simple_mob/vore/redpanda, + /mob/living/simple_mob/vore/sheep, + /mob/living/simple_mob/vore/solargrub) + +var/global/list/xenobio_gold_mobs_birds = list(/mob/living/simple_mob/animal/passive/bird/black_bird, + /mob/living/simple_mob/animal/passive/bird/azure_tit, + /mob/living/simple_mob/animal/passive/bird/european_robin, + /mob/living/simple_mob/animal/passive/bird/goldcrest, + /mob/living/simple_mob/animal/passive/bird/ringneck_dove, + /mob/living/simple_mob/animal/passive/bird/parrot, + /mob/living/simple_mob/animal/passive/bird/parrot/kea, + /mob/living/simple_mob/animal/passive/bird/parrot/eclectus, + /mob/living/simple_mob/animal/passive/bird/parrot/grey_parrot, + /mob/living/simple_mob/animal/passive/bird/parrot/black_headed_caique, + /mob/living/simple_mob/animal/passive/bird/parrot/white_caique, + /mob/living/simple_mob/animal/passive/bird/parrot/budgerigar, + /mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/blue, + /mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/bluegreen, + /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel, + /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/white, + /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/yellowish, + /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/grey, + /mob/living/simple_mob/animal/passive/bird/parrot/sulphur_cockatoo, + /mob/living/simple_mob/animal/passive/bird/parrot/white_cockatoo, + /mob/living/simple_mob/animal/passive/bird/parrot/pink_cockatoo) //There's too dang many + +var/global/list/xenobio_cerulean_potions = list( + /obj/item/slimepotion/enhancer, + /obj/item/slimepotion/stabilizer, + /obj/item/slimepotion/mutator, + /obj/item/slimepotion/docility, + /obj/item/slimepotion/steroid, + /obj/item/slimepotion/unity, + /obj/item/slimepotion/loyalty, + /obj/item/slimepotion/friendship, + /obj/item/slimepotion/feeding, + /obj/item/slimepotion/infertility, + /obj/item/slimepotion/fertility, + /obj/item/slimepotion/shrink, + /obj/item/slimepotion/death, + /obj/item/slimepotion/ferality, + /obj/item/slimepotion/reinvigoration, + /obj/item/slimepotion/mimic, + /obj/item/slimepotion/sapience, + /obj/item/slimepotion/obedience) + +var/global/list/xenobio_rainbow_extracts = list( + /obj/item/slime_extract/grey = 2, + /obj/item/slime_extract/metal = 3, + /obj/item/slime_extract/blue = 3, + /obj/item/slime_extract/purple = 1, + /obj/item/slime_extract/orange = 3, + /obj/item/slime_extract/yellow = 3, + /obj/item/slime_extract/gold = 3, + /obj/item/slime_extract/silver = 3, + /obj/item/slime_extract/dark_purple = 2, + /obj/item/slime_extract/dark_blue = 3, + /obj/item/slime_extract/red = 3, + /obj/item/slime_extract/green = 3, + /obj/item/slime_extract/pink = 3, + /obj/item/slime_extract/oil = 3, + /obj/item/slime_extract/bluespace = 3, + /obj/item/slime_extract/cerulean = 1, + /obj/item/slime_extract/amber = 3, + /obj/item/slime_extract/sapphire = 3, + /obj/item/slime_extract/ruby = 3, + /obj/item/slime_extract/emerald = 3, + /obj/item/slime_extract/light_pink = 1, + /obj/item/slime_extract/rainbow = 1) \ No newline at end of file diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 3b20ccbb5c..f0ff01c05a 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -486,30 +486,3 @@ light_range = 8 light_power = 0.1 light_color = "#49F37C" - -/* - * Slime Extract - */ - -/obj/item/device/flashlight/slime - gender = PLURAL - name = "glowing slime extract" - desc = "A slimy ball that appears to be glowing from bioluminesence." - icon = 'icons/obj/lighting.dmi' - icon_state = "floor1" //not a slime extract sprite but... something close enough! - item_state = "slime" - light_color = "#FFF423" - w_class = ITEMSIZE_TINY - light_range = 6 - on = 1 //Bio-luminesence has one setting, on. - power_use = 0 - -/obj/item/device/flashlight/slime/New() - ..() - set_light(light_range, light_power, light_color) - -/obj/item/device/flashlight/slime/update_brightness() - return - -/obj/item/device/flashlight/slime/attack_self(mob/user) - return //Bio-luminescence does not toggle. diff --git a/code/modules/ai/ai_holder_subtypes/slime_xenobio_ai.dm b/code/modules/ai/ai_holder_subtypes/slime_xenobio_ai.dm index fb3537c69d..ee97da4233 100644 --- a/code/modules/ai/ai_holder_subtypes/slime_xenobio_ai.dm +++ b/code/modules/ai/ai_holder_subtypes/slime_xenobio_ai.dm @@ -76,6 +76,10 @@ if(amount > 0) if(rabid) return + if(my_slime.untamable) + holder.say("Grrr...") + holder.add_modifier(/datum/modifier/berserk, 30 SECONDS) + enrage() var/justified = my_slime.is_justified_to_discipline() // This will also consider the AI-side of that proc. remove_target() // Stop attacking. @@ -95,13 +99,6 @@ discipline = between(0, discipline + amount, 10) my_slime.update_mood() -// This slime always enrages if disciplined. -/datum/ai_holder/simple_mob/xenobio_slime/red/adjust_discipline(amount, silent) - if(amount > 0 && !rabid) - holder.say("Grrr...") - holder.add_modifier(/datum/modifier/berserk, 30 SECONDS) - enrage() - /datum/ai_holder/simple_mob/xenobio_slime/handle_special_strategical() discipline_decay() @@ -145,6 +142,16 @@ my_slime.update_mood() my_slime.visible_message(span("danger", "\The [my_slime] enrages!")) +// Called to relax from being rabid (when blue slime core was used). +/datum/ai_holder/simple_mob/xenobio_slime/proc/relax() + var/mob/living/simple_mob/slime/xenobio/my_slime = holder + if(my_slime.harmless) + return + if(rabid) + rabid = FALSE + my_slime.update_mood() + my_slime.visible_message(span("danger", "\The [my_slime] calms down.")) + // Called when using a pacification agent (or it's Kendrick being initalized). /datum/ai_holder/simple_mob/xenobio_slime/proc/pacify() remove_target() // So it stops trying to kill them. diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm index 4849db6105..9b9b79922d 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm @@ -491,6 +491,7 @@ slime_color = "red" coretype = /obj/item/slime_extract/red movement_cooldown = 0 // See above. + untamable = TRUE // Will enrage if disciplined. description_info = "This slime is faster than the others. Attempting to discipline this slime will always cause it to go rabid and berserk." @@ -501,7 +502,7 @@ /mob/living/simple_mob/slime/xenobio/orange ) - ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime/red // Will enrage if disciplined. + ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime /mob/living/simple_mob/slime/xenobio/green diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm index ae2cfe25ee..8b26c95940 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm @@ -10,7 +10,14 @@ var/power_charge = 0 // Disarm attacks can shock someone if high/lucky enough. var/mob/living/victim = null // the person the slime is currently feeding on var/rainbow_core_candidate = TRUE // If false, rainbow cores cannot make this type randomly. +<<<<<<< HEAD var/mutation_chance = 30 // CHOMPedit Odds of spawning as a new color when reproducing. Can be modified by certain xenobio products. Carried across generations of slimes. +======= + var/mutation_chance = 25 // Odds of spawning as a new color when reproducing. Can be modified by certain xenobio products. Carried across generations of slimes. + var/split_amount = 4 // Amount of children we will normally have. Half of that for dead adult slimes. Is NOT carried across generations. + var/untamable = FALSE //Makes slime untamable via discipline. + var/untamable_inheirit = FALSE //Makes slime inheirit its untamability. +>>>>>>> ed28fbac1a... Merge pull request #12552 from Heroman3003/xenobio-rework var/list/slime_mutation = list( /mob/living/simple_mob/slime/xenobio/orange, /mob/living/simple_mob/slime/xenobio/metal, @@ -54,7 +61,6 @@ AI.resentment = max(previous_AI.resentment - 1, 0) AI.rabid = previous_AI.rabid - /mob/living/simple_mob/slime/xenobio/update_icon() icon_living = "[icon_state_override ? "[icon_state_override] slime" : "slime"] [is_adult ? "adult" : "baby"][victim ? " eating" : ""]" icon_dead = "[icon_state_override ? "[icon_state_override] slime" : "slime"] [is_adult ? "adult" : "baby"] dead" @@ -107,6 +113,21 @@ update_icon() update_name() +/mob/living/simple_mob/slime/xenobio/proc/make_baby() + if(!is_adult) + return + + is_adult = FALSE + melee_damage_lower = round(melee_damage_lower / 2) // 20 + melee_damage_upper = round(melee_damage_upper / 2) // 30 + maxHealth = initial(maxHealth) + health = clamp(health, 0, maxHealth) + max_nutrition = initial(max_nutrition) + nutrition = 400 + amount_grown = 0 + update_icon() + update_name() + /mob/living/simple_mob/slime/xenobio/proc/update_name() if(harmless) // Docile slimes are generally named, so we shouldn't mess with it. return @@ -142,6 +163,13 @@ var/datum/ai_holder/simple_mob/xenobio_slime/AI = ai_holder AI.enrage() +/mob/living/simple_mob/slime/xenobio/proc/relax() + if(harmless) + return + if(has_AI()) + var/datum/ai_holder/simple_mob/xenobio_slime/AI = ai_holder + AI.relax() + /mob/living/simple_mob/slime/xenobio/proc/pacify() harmless = TRUE if(has_AI()) @@ -208,12 +236,12 @@ if(free) free_tiles++ - if(free_tiles < 3) // Three free tiles are needed, as four slimes are made and the 4th tile is from the center tile that the current slime occupies. + if(free_tiles < split_amount-1) // Three free tiles are needed, as four slimes are made and the 4th tile is from the center tile that the current slime occupies. to_chat(src, span("warning", "It is too cramped here to reproduce...")) return var/list/babies = list() - for(var/i = 1 to 4) + for(var/i = 1 to split_amount) babies.Add(make_new_slime()) var/mob/living/simple_mob/slime/new_slime = pick(babies) @@ -245,6 +273,9 @@ if(!istype(baby, /mob/living/simple_mob/slime/xenobio/rainbow)) baby.unity = unity + if(untamable_inheirit) + baby.untamable = untamable + baby.untamable_inheirit = untamable_inheirit baby.faction = faction baby.friends = friends.Copy() diff --git a/code/modules/reagents/reactions/instant/instant_vr.dm b/code/modules/reagents/reactions/instant/instant_vr.dm index 6c42a76a2a..010110fa6e 100644 --- a/code/modules/reagents/reactions/instant/instant_vr.dm +++ b/code/modules/reagents/reactions/instant/instant_vr.dm @@ -204,9 +204,15 @@ required_reagents = list("plantcolony" = 5, "virusfood" = 5) result_amount = 60 +/////////////////////////////////////////////////////////////////////////////////// +/// Upstream Adjustments +/decl/chemical_reaction/instant/biomass + result_amount = 6 // Roughly 120u per phoron sheet + /////////////////////////////// -//SLIME CORES BELOW HERE/////// +//SLIME-RELATED BELOW HERE/////// /////////////////////////////// +<<<<<<< HEAD /decl/chemical_reaction/instant/slime_food name = "Slime Bork" id = "m_tele2" @@ -343,11 +349,14 @@ target_tile.assume_gas("phoron", 25, 1400) spawn (0) target_tile.hotspot_expose(700, 400) +======= +>>>>>>> ed28fbac1a... Merge pull request #12552 from Heroman3003/xenobio-rework /decl/chemical_reaction/instant/slimeify name = "Advanced Mutation Toxin" id = "advmutationtoxin2" result = "advmutationtoxin" required_reagents = list("phoron" = 15, "slimejelly" = 15, "mutationtoxin" = 15) //In case a xenobiologist wants to become a fully fledged slime person. +<<<<<<< HEAD result_amount = 1 /decl/chemical_reaction/instant/slimeheal //A slime healing mixture. Why not. @@ -443,3 +452,6 @@ /decl/chemical_reaction/instant/biomass result_amount = 6 // Roughly 120u per phoron sheet +======= + result_amount = 1 +>>>>>>> ed28fbac1a... Merge pull request #12552 from Heroman3003/xenobio-rework diff --git a/code/modules/xenobio/items/extracts.dm b/code/modules/xenobio/items/extracts.dm index 3c86a278f6..3a79e3b0ff 100644 --- a/code/modules/xenobio/items/extracts.dm +++ b/code/modules/xenobio/items/extracts.dm @@ -1,3 +1,5 @@ +//VOREStation Note - we use different xenobio balance in extracts_vr, keep this unticked. + // Base /obj/item/slime_extract name = "slime extract" diff --git a/code/modules/xenobio/items/extracts_vr.dm b/code/modules/xenobio/items/extracts_vr.dm new file mode 100644 index 0000000000..00abebfcb1 --- /dev/null +++ b/code/modules/xenobio/items/extracts_vr.dm @@ -0,0 +1,1661 @@ +// Base +/obj/item/slime_extract + name = "slime extract" + desc = "Goo extracted from a slime, which can do different things depending on its color and what it is injected with." + icon = 'icons/mob/slimes.dmi' + icon_state = "grey slime extract" + force = 1 + w_class = ITEMSIZE_TINY + throwforce = 0 + throw_speed = 3 + throw_range = 6 + origin_tech = list(TECH_BIO = 4) + var/uses = 1 // uses before it goes inert + var/enhanced = FALSE + var/slime_type + flags = OPENCONTAINER + + +/obj/item/slime_extract/New() + ..() + create_reagents(60) + +/obj/item/slime_extract/attackby(obj/item/O, mob/user) + if(istype(O, /obj/item/slimepotion/enhancer)) + if(enhanced) + to_chat(user, "You cannot enhance this extract further!") + return ..() + to_chat(user, "You apply the enhancer to the slime extract. It may now be reused one more time.") + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + uses += 2 + enhanced = TRUE + name = initial(name) // To remove the 'inert' part of the name. + qdel(O) + else if(istype(O, /obj/item/slimepotion/reinvigoration)) + to_chat(user, "You apply the reinvigorator to the slime extract. It rapidly expands, creating a brand new slime!") + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + new slime_type(get_turf(src)) + qdel(O) + qdel(src) + ..() + +/obj/item/slime_extract/examine(mob/user) + . = ..() + if(uses) + . += "This extract has [uses] more use\s." + else + . += "This extract is inert." + +/decl/chemical_reaction/instant/slime + var/required = null + +/decl/chemical_reaction/instant/slime/can_happen(var/datum/reagents/holder) + if(holder.my_atom && istype(holder.my_atom, required)) + var/obj/item/slime_extract/T = holder.my_atom + if(T.uses > 0) + return ..() + return FALSE + +/decl/chemical_reaction/instant/slime/on_reaction(var/datum/reagents/holder) + var/obj/item/slime_extract/T = holder.my_atom + T.uses-- + if(T.uses <= 0) + T.visible_message("[bicon(T)]\The [T] goes inert.") + T.name = "inert [initial(T.name)]" + + +// *************** +// * Grey slimes * +// *************** + +/obj/item/slime_extract/grey + name = "grey slime extract" + icon_state = "grey slime extract" + description_info = "When injected with phoron, this extract creates a grey slime. When injected with blood, this extract creates some monkey cubes. \ + When injected with water, this extract creates some slime jelly." + slime_type = /mob/living/simple_mob/slime/xenobio + + +/decl/chemical_reaction/instant/slime/grey_new_slime + name = "Slime Spawn" + id = "m_grey_spawn" + result = null + required_reagents = list("phoron" = 5) + result_amount = 1 + required = /obj/item/slime_extract/grey + +/decl/chemical_reaction/instant/slime/grey_new_slime/on_reaction(var/datum/reagents/holder) + holder.my_atom.visible_message("Infused with phoron, the core begins to quiver and grow, and soon a new baby slime emerges from it!") + new /mob/living/simple_mob/slime/xenobio(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/grey_monkey + name = "Slime Monkey" + id = "m_grey_monkey" + result = null + required_reagents = list("blood" = 5) + result_amount = 1 + required = /obj/item/slime_extract/grey + +/decl/chemical_reaction/instant/slime/grey_monkey/on_reaction(var/datum/reagents/holder) + for(var/i = 1 to 4) + new /obj/item/weapon/reagent_containers/food/snacks/monkeycube(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/grey_slimejelly + name = "Slime Jelly" + id = "m_grey_jelly" + result = "slimejelly" + required_reagents = list("water" = 5) + result_amount = 30 + required = /obj/item/slime_extract/grey + +// **************** +// * Metal slimes * +// **************** + +/obj/item/slime_extract/metal + name = "metal slime extract" + icon_state = "metal slime extract" + description_info = "When injected with phoron, this extract creates some basic construction materials. When injected with blood, this extract creates some advanced construction materials. \ + When injected with water, this extract creates some unorthodox materials. When injected with slime jelly, this extract creates some steel." + slime_type = /mob/living/simple_mob/slime/xenobio/metal + + +/decl/chemical_reaction/instant/slime/metal_materials_basic + name = "Slime Basic Construction Materials" + id = "m_metal_basic" + result = null + required_reagents = list("phoron" = 5) + result_amount = 1 + required = /obj/item/slime_extract/metal + +/decl/chemical_reaction/instant/slime/metal_materials_basic/on_reaction(var/datum/reagents/holder) + for(var/i = 1 to 3) + var/type_to_spawn = pickweight(xenobio_metal_materials_normal) + new type_to_spawn(get_turf(holder.my_atom), 10) + ..() + + +/decl/chemical_reaction/instant/slime/metal_materials_adv + name = "Slime Advanced Construction Materials" + id = "m_metal_adv" + required_reagents = list("blood" = 5) + result_amount = 1 + required = /obj/item/slime_extract/metal + +/decl/chemical_reaction/instant/slime/metal_materials_adv/on_reaction(var/datum/reagents/holder) + for(var/i = 1 to 2) + var/type_to_spawn = pickweight(xenobio_metal_materials_adv) + new type_to_spawn(get_turf(holder.my_atom), 10) + ..() + + +/decl/chemical_reaction/instant/slime/metal_materials_weird + name = "Slime Weird Construction Materials" + id = "m_metal_weird" + required_reagents = list("water" = 5) + result_amount = 1 + required = /obj/item/slime_extract/metal + +/decl/chemical_reaction/instant/slime/metal_materials_weird/on_reaction(var/datum/reagents/holder) + for(var/i = 1 to 3) + var/type_to_spawn = pickweight(xenobio_metal_materials_weird) + new type_to_spawn(get_turf(holder.my_atom), 5) + ..() + + +/decl/chemical_reaction/instant/slime/metal_materials_steel + name = "Slime Weird Construction Materials" + id = "m_metal_steel" + required_reagents = list("slimejelly" = 5) + result_amount = 1 + required = /obj/item/slime_extract/metal + +/decl/chemical_reaction/instant/slime/metal_materials_steel/on_reaction(var/datum/reagents/holder) + new /obj/item/stack/material/steel(get_turf(holder.my_atom), 25) + ..() + +// *************** +// * Blue slimes * +// *************** + +/obj/item/slime_extract/blue + name = "blue slime extract" + icon_state = "blue slime extract" + description_info = "When injected with phoron, this extract creates some frost oil. When injected with blood, this extract creates stability agent that can reduce slime's mutation chance. \ + When injected with water, this extract creates a clamness wave that calms enraged slimes. When injected with slime jelly, this extract creates some cryotoxin." + slime_type = /mob/living/simple_mob/slime/xenobio/blue + + +/decl/chemical_reaction/instant/slime/blue_frostoil + name = "Slime Frost Oil" + id = "m_blue_frostoil" + result = "frostoil" + required_reagents = list("phoron" = 5) + result_amount = 30 + required = /obj/item/slime_extract/blue + + +/decl/chemical_reaction/instant/slime/blue_stability + name = "Slime Stability" + id = "m_blue_stability" + required_reagents = list("blood" = 5) + result_amount = 1 + required = /obj/item/slime_extract/blue + +/decl/chemical_reaction/instant/slime/blue_stability/on_reaction(var/datum/reagents/holder) + new /obj/item/slimepotion/stabilizer(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/blue_calm + name = "Slime Calm" + id = "m_blue_calm" + required_reagents = list("water" = 5) + result_amount = 1 + required = /obj/item/slime_extract/blue + +/decl/chemical_reaction/instant/slime/blue_calm/on_reaction(var/datum/reagents/holder) + for(var/mob/living/simple_mob/slime/S in view(get_turf(holder.my_atom))) + if(S.stat) + continue + + if(istype(S, /mob/living/simple_mob/slime/xenobio)) + var/mob/living/simple_mob/slime/xenobio/X = S + if(X.harmless) + continue + if(!X.client) + X.relax() + + S.remove_modifiers_of_type(/datum/modifier/berserk) + + if(S.client) // Player slimes always have free will. + to_chat(S, "An intense wave of relaxing calm is felt from inside, but you remain in control of yourself.") + + for(var/mob/living/carbon/human/H in view(get_turf(holder.my_atom))) + if(H.species.name == SPECIES_PROMETHEAN) + H.remove_modifiers_of_type(/datum/modifier/berserk) + to_chat(H, "An intense wave of relaxing calm is felt from inside, but you remain in control of yourself.") + + playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1) + ..() + + +/decl/chemical_reaction/instant/slime/blue_cryotoxin + name = "Slime Cryotoxin" + id = "m_blue_cryotoxin" + result = "cryotoxin" + required_reagents = list("slimejelly" = 5) + result_amount = 30 + required = /obj/item/slime_extract/blue + +// ***************** +// * Purple slimes * +// ***************** + +/obj/item/slime_extract/purple + name = "purple slime extract" + icon_state = "purple slime extract" + description_info = "When injected with phoron, this extract creates steroid agent, which can be used to increase amount of extracts in a slime. When injected with blood, this extract creates \ + infertility agent, which can be used to decrease amount of slime's offspring. When injected with water, this extract creates shrink agent, which can be used to turn an adult slime into a baby. \ + When injected with slime jelly, this extract creates a fertility agent, which can be used to increase amount of slime's offspring." + slime_type = /mob/living/simple_mob/slime/xenobio/purple + + +/decl/chemical_reaction/instant/slime/purple_steroid + name = "Slime Steroid" + id = "m_purple_steroid" + required_reagents = list("phoron" = 5) + result_amount = 1 + required = /obj/item/slime_extract/purple + +/decl/chemical_reaction/instant/slime/purple_steroid/on_reaction(var/datum/reagents/holder) + new /obj/item/slimepotion/steroid(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/purple_infertility + name = "Slime Infetility" + id = "m_purple_infertility" + required_reagents = list("blood" = 5) + result_amount = 1 + required = /obj/item/slime_extract/purple + +/decl/chemical_reaction/instant/slime/purple_infertility/on_reaction(var/datum/reagents/holder) + new /obj/item/slimepotion/infertility(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/purple_shrink + name = "Slime Shrink" + id = "m_purple_shrink" + required_reagents = list("water" = 5) + result_amount = 1 + required = /obj/item/slime_extract/purple + +/decl/chemical_reaction/instant/slime/purple_shrink/on_reaction(var/datum/reagents/holder) + new /obj/item/slimepotion/shrink(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/purple_fertility + name = "Slime Fetility" + id = "m_purple_fertility" + required_reagents = list("slimejelly" = 5) + result_amount = 1 + required = /obj/item/slime_extract/purple + +/decl/chemical_reaction/instant/slime/purple_fertility/on_reaction(var/datum/reagents/holder) + new /obj/item/slimepotion/fertility(get_turf(holder.my_atom)) + ..() + +// ***************** +// * Orange slimes * +// ***************** + +/obj/item/slime_extract/orange + name = "orange slime extract" + icon_state = "orange slime extract" + description_info = "When injected with phoron, this extract creates a phoron fire. When injected with blood, this extract creates a heat wave. When injected with water, this extract creates \ + some smoke. When injected with slime jelly, this extract creates some pyrotoxin." + slime_type = /mob/living/simple_mob/slime/xenobio/orange + + +/decl/chemical_reaction/instant/slime/orange_fire + name = "Slime Fire" + id = "m_orange_fire" + required_reagents = list("phoron" = 5) + result_amount = 1 + required = /obj/item/slime_extract/orange + +/decl/chemical_reaction/instant/slime/orange_fire/on_reaction(var/datum/reagents/holder) + log_and_message_admins("Orange extract reaction (fire) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") + holder.my_atom.visible_message("\The [src] begins to vibrate violently!") + playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1) + spawn(5 SECONDS) + if(holder && holder.my_atom) + var/turf/simulated/T = get_turf(holder.my_atom) + if(!istype(T)) + return + + for(var/turf/simulated/target_turf in view(2, T)) + target_turf.assume_gas("volatile_fuel", 33, 1500+T0C) + target_turf.assume_gas("oxygen", 66, 1500+T0C) + spawn(0) + target_turf.hotspot_expose(1500+T0C, 400) + + playsound(T, 'sound/effects/phasein.ogg', 75, 1) + ..() + + +/decl/chemical_reaction/instant/slime/orange_heatwave + name = "Slime Heat Wave" + id = "m_orange_heatwave" + required_reagents = list("blood" = 5) + result_amount = 1 + required = /obj/item/slime_extract/orange + +/decl/chemical_reaction/instant/slime/orange_heatwave/on_reaction(var/datum/reagents/holder) + var/turf/simulated/T = get_turf(holder.my_atom) + if(!T) // Nullspace lacks zones. + return + + if(!istype(T)) + return + + var/zone/Z = T.zone + if(!Z) // Paranoid. + return + + log_and_message_admins("Orange extract reaction (heat wave) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") + + var/list/nearby_things = view(T) + + // Hurt mobs. + for(var/mob/living/L in nearby_things) + var/turf/simulated/their_turf = get_turf(L) + if(!istype(their_turf)) // Not simulated. + continue + + if(!(their_turf in Z.contents)) // Not in the same zone. + continue + + if(ishuman(L)) + var/mob/living/carbon/human/H = L + var/protection = H.get_heat_protection() + + if(protection < 1) + var/cold_factor = abs(protection - 1) + H.bodytemperature = between(50, (H.bodytemperature - ((H.bodytemperature + 50) * cold_factor) ), H.bodytemperature) + + if(protection < 0.7) + to_chat(L, "A scalding wave of heat overwhelms you!") + else + to_chat(L, "A scalding wave of heat passes by you, as your armor protects you from it.") + continue + + // Now make it very cold. + var/datum/gas_mixture/env = T.return_air() + if(env) + // This is most likely physically impossible but when has that stopped slimes before? + env.add_thermal_energy(15 * 1000 * 1000) + + playsound(T, 'sound/effects/phasein.ogg', 75, 1) + ..() + + +/decl/chemical_reaction/instant/slime/orange_smoke + name = "Slime Smoke" + id = "m_orange_smoke" + required_reagents = list("water" = 5) + result_amount = 1 + required = /obj/item/slime_extract/orange + +/decl/chemical_reaction/instant/slime/orange_smoke/on_reaction(var/datum/reagents/holder) + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/smoke_spread/chem/S = new /datum/effect/effect/system/smoke_spread/chem + S.attach(location) + S.set_up(holder, 120, 0, location) + playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) + spawn(0) + S.start() + ..() + + +/decl/chemical_reaction/instant/slime/orange_pyrotoxin + name = "Slime Pyrotoxin" + id = "m_orange_pyrotoxin" + result = "thermite_v" + required_reagents = list("slimejelly" = 5) + result_amount = 30 + required = /obj/item/slime_extract/orange + +// ***************** +// * Yellow slimes * +// ***************** + +/obj/item/slime_extract/yellow + name = "yellow slime extract" + icon_state = "yellow slime extract" + description_info = "When injected with phoron, this extract creates a lightning strike. When injected with blood, this extract creates a slime flashlight. When injected with water \ + this extract creates an EMP puls. When injected with slime jelly, this extract creates a self-charging slime battery." + slime_type = /mob/living/simple_mob/slime/xenobio/yellow + + +/decl/chemical_reaction/instant/slime/yellow_lightning + name = "Slime Lightning" + id = "m_yellow_lightning" + required_reagents = list("phoron" = 5) + result_amount = 1 + required = /obj/item/slime_extract/yellow + +/decl/chemical_reaction/instant/slime/yellow_lightning/on_reaction(var/datum/reagents/holder) + log_and_message_admins("Yellow extract reaction (lightning) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") + holder.my_atom.visible_message("\The [src] begins to vibrate violently!") + playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1) + spawn(5 SECONDS) + if(holder && holder.my_atom) + lightning_strike(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/yellow_flashlight + name = "Slime Flashlight" + id = "m_yellow_flashlight" + required_reagents = list("blood" = 5) + result_amount = 1 + required = /obj/item/slime_extract/yellow + +/decl/chemical_reaction/instant/slime/yellow_flashlight/on_reaction(var/datum/reagents/holder) + new /obj/item/device/flashlight/slime(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/yellow_emp + name = "Slime EMP" + id = "m_yellow_emp" + required_reagents = list("water" = 5) + result_amount = 1 + required = /obj/item/slime_extract/yellow + +/decl/chemical_reaction/instant/slime/yellow_emp/on_reaction(var/datum/reagents/holder) + log_and_message_admins("Yellow extract reaction (emp) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") + holder.my_atom.visible_message("\The [src] begins to vibrate violently!") + playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1) + spawn(5 SECONDS) + if(holder && holder.my_atom) + empulse(get_turf(holder.my_atom), 2, 4, 7, 10) // As strong as a normal EMP grenade. + playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1) + ..() + + +/decl/chemical_reaction/instant/slime/yellow_battery + name = "Slime Cell" + id = "m_yellow_cell" + required_reagents = list("slimejelly" = 5) + result_amount = 1 + required = /obj/item/slime_extract/yellow + +/decl/chemical_reaction/instant/slime/yellow_battery/on_reaction(var/datum/reagents/holder) + new /obj/item/weapon/cell/slime(get_turf(holder.my_atom)) + ..() + +// *************** +// * Gold slimes * +// *************** + +/obj/item/slime_extract/gold + name = "gold slime extract" + icon_state = "gold slime extract" + description_info = "When injected with phoron, this extract creates a few random creatures. When injected with blood, this extract a random hostile creature. \ + When injected with water, this extract creates a random passive creature. When injected with slime jelly, this extract creates some gold." + slime_type = /mob/living/simple_mob/slime/xenobio/gold + + +/decl/chemical_reaction/instant/slime/gold_random_mobs + name = "Slime Random Mobs" + id = "m_gold_random_mobs" + required_reagents = list("phoron" = 5) + result_amount = 1 + required = /obj/item/slime_extract/gold + +/decl/chemical_reaction/instant/slime/gold_random_mobs/on_reaction(var/datum/reagents/holder) + log_and_message_admins("Gold extract reaction (random mobs) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") + var/type_to_spawn + var/list/all_spawnable_types = list() + all_spawnable_types += xenobio_gold_mobs_safe + all_spawnable_types += xenobio_gold_mobs_hostile + all_spawnable_types += xenobio_gold_mobs_birds + for(var/j = 1, j <= 3, j++) + if(prob(1)) + type_to_spawn = pickweight(xenobio_gold_mobs_bosses) + else + type_to_spawn = pickweight(all_spawnable_types) + + var/mob/living/C = new type_to_spawn(get_turf(holder.my_atom)) + for(var/l = 1, l <= rand(1, 3), l++) + step(C, pick(NORTH,SOUTH,EAST,WEST)) + ..() + + +/decl/chemical_reaction/instant/slime/gold_hostile_mob + name = "Slime Hostile Mob" + id = "m_gold_hostile_mob" + required_reagents = list("blood" = 5) + result_amount = 1 + required = /obj/item/slime_extract/gold + +/decl/chemical_reaction/instant/slime/gold_hostile_mob/on_reaction(var/datum/reagents/holder) + log_and_message_admins("Gold extract reaction (dangerous mob) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") + var/type_to_spawn = pickweight(xenobio_gold_mobs_hostile) + var/mob/living/C = new type_to_spawn(get_turf(holder.my_atom)) + for(var/l = 1, l <= rand(1, 3), l++) + step(C, pick(NORTH,SOUTH,EAST,WEST)) + ..() + + +/decl/chemical_reaction/instant/slime/gold_safe_mob + name = "Slime Safe Mob" + id = "m_gold_safe_mob" + required_reagents = list("water" = 5) + result_amount = 1 + required = /obj/item/slime_extract/gold + +/decl/chemical_reaction/instant/slime/gold_safe_mob/on_reaction(var/datum/reagents/holder) + var/type_to_spawn + if(prob(100/(xenobio_gold_mobs_safe.len + 1))) + type_to_spawn = pickweight(xenobio_gold_mobs_birds) + else + type_to_spawn = pickweight(xenobio_gold_mobs_safe) + var/mob/living/C = new type_to_spawn(get_turf(holder.my_atom)) + for(var/l = 1, l <= rand(1, 3), l++) + step(C, pick(NORTH,SOUTH,EAST,WEST)) + ..() + + +/decl/chemical_reaction/instant/slime/gold_materials_gold + name = "Slime Gold" + id = "m_gold_gold" + required_reagents = list("slimejelly" = 5) + result_amount = 1 + required = /obj/item/slime_extract/gold + +/decl/chemical_reaction/instant/slime/gold_materials_gold/on_reaction(var/datum/reagents/holder) + new /obj/item/stack/material/gold(get_turf(holder.my_atom), 10) + ..() + +// ***************** +// * Silver slimes * +// ***************** + +/obj/item/slime_extract/silver + name = "silver slime extract" + icon_state = "silver slime extract" + description_info = "When injected with phoron, this extract creates some basic science materials. When injected with blood, this extract creates some advanced science materials. When injected \ + with water, this extract creates some completely random materials. When injected with slime jelly, this extract creates some silver." + slime_type = /mob/living/simple_mob/slime/xenobio/silver + + +/decl/chemical_reaction/instant/slime/silver_materials_basic + name = "Slime Basic Science Materials" + id = "m_silver_basic" + required_reagents = list("phoron" = 5) + result_amount = 1 + required = /obj/item/slime_extract/silver + +/decl/chemical_reaction/instant/slime/silver_materials_basic/on_reaction(var/datum/reagents/holder) + for(var/i = 1 to 2) + var/type_to_spawn = pickweight(xenobio_silver_materials_basic) + new type_to_spawn(get_turf(holder.my_atom), 5) + ..() + + +/decl/chemical_reaction/instant/slime/silver_materials_adv + name = "Slime Advanced Science Materials" + id = "m_silver_adv" + required_reagents = list("blood" = 5) + result_amount = 1 + required = /obj/item/slime_extract/silver + +/decl/chemical_reaction/instant/slime/silver_materials_adv/on_reaction(var/datum/reagents/holder) + var/type_to_spawn = pickweight(xenobio_silver_materials_adv) + new type_to_spawn(get_turf(holder.my_atom), 3) + ..() + + +/decl/chemical_reaction/instant/slime/silver_materials_random + name = "Slime Random Materials" + id = "m_silver_random" + required_reagents = list("water" = 5) + result_amount = 1 + required = /obj/item/slime_extract/silver + +/decl/chemical_reaction/instant/slime/silver_materials_random/on_reaction(var/datum/reagents/holder) + var/type_to_spawn + var/amount = 5 + var/all_spawnable_types = list() + all_spawnable_types += xenobio_metal_materials_normal + all_spawnable_types += xenobio_metal_materials_adv + all_spawnable_types += xenobio_metal_materials_weird + all_spawnable_types += xenobio_silver_materials_basic + all_spawnable_types += xenobio_silver_materials_adv + all_spawnable_types += xenobio_silver_materials_special + for(var/i = 1 to 3) + type_to_spawn = pickweight(all_spawnable_types) + if(type_to_spawn in xenobio_silver_materials_special) + amount = 1 + new type_to_spawn(get_turf(holder.my_atom), amount) + ..() + + +/decl/chemical_reaction/instant/slime/silver_materials_silver + name = "Slime Silver" + id = "m_silver_silver" + required_reagents = list("slimejelly" = 5) + result_amount = 1 + required = /obj/item/slime_extract/silver + +/decl/chemical_reaction/instant/slime/silver_materials_silver/on_reaction(var/datum/reagents/holder) + new /obj/item/stack/material/silver(get_turf(holder.my_atom), 10) + ..() + +// ********************** +// * Dark Purple slimes * +// ********************** + +/obj/item/slime_extract/dark_purple + name = "dark purple slime extract" + icon_state = "dark purple slime extract" + description_info = "When injected with water, this extract creates some phoron. When injected with slime jelly, this extract creates some blood." + slime_type = /mob/living/simple_mob/slime/xenobio/dark_purple + + +/decl/chemical_reaction/instant/slime/dark_purple_phoron + name = "Slime Phoron" + id = "m_darkpurple_phoron" + result = "phoron" + required_reagents = list("water" = 5) + result_amount = 30 + required = /obj/item/slime_extract/dark_purple + + +/decl/chemical_reaction/instant/slime/dark_purple_blood + name = "Slime Blood" + id = "m_darkpurple_blood" + result = "blood" + required_reagents = list("slimejelly" = 5) + result_amount = 30 + required = /obj/item/slime_extract/dark_purple + +// ******************** +// * Dark Blue slimes * +// ******************** + +/obj/item/slime_extract/dark_blue + name = "dark blue slime extract" + icon_state = "dark blue slime extract" + description_info = "When injected with phoron, this extract creates a cold wave. When injected with blood, this extract grants ability to resist temperature for a while. \ + When injected with water, the water freezes. When injected with slime jelly, this extract creates a death agent, which can be used to instantly kill a slime." + slime_type = /mob/living/simple_mob/slime/xenobio/dark_blue + + +/decl/chemical_reaction/instant/slime/dark_blue_cold_snap + name = "Slime Cold Snap" + id = "m_darkblue_coldsnap" + required_reagents = list("phoron" = 5) + result_amount = 1 + required = /obj/item/slime_extract/dark_blue + +// This iterates over a ZAS zone's contents, so that things seperated in other zones aren't subjected to the temperature drop. +/decl/chemical_reaction/instant/slime/dark_blue_cold_snap/on_reaction(var/datum/reagents/holder) + var/turf/simulated/T = get_turf(holder.my_atom) + if(!T) // Nullspace lacks zones. + return + + if(!istype(T)) + return + + var/zone/Z = T.zone + if(!Z) // Paranoid. + return + + log_and_message_admins("Dark Blue extract reaction (cold snap) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") + + var/list/nearby_things = view(T) + + // Hurt mobs. + for(var/mob/living/L in nearby_things) + var/turf/simulated/their_turf = get_turf(L) + if(!istype(their_turf)) // Not simulated. + continue + + if(!(their_turf in Z.contents)) // Not in the same zone. + continue + + if(istype(L, /mob/living/simple_mob/slime)) + var/mob/living/simple_mob/slime/S = L + if(S.cold_resist >= 1) // Immune to cold. + to_chat(S, "A chill is felt around you, however it cannot harm you.") + continue + if(S.client) // Don't instantly kill player slimes. + to_chat(S, "You feel your body crystalize as an intense chill overwhelms you!") + S.inflict_cold_damage(100) + else + S.inflict_cold_damage(200) // Metal slimes can survive this 'slime nuke'. + continue + + if(ishuman(L)) + var/mob/living/carbon/human/H = L + var/protection = H.get_cold_protection() + + if(protection < 1) + var/cold_factor = abs(protection - 1) + H.bodytemperature = between(50, (H.bodytemperature - ((H.bodytemperature - 50) * cold_factor) ), H.bodytemperature) + + if(protection < 0.7) + to_chat(L, "A chilling wave of cold overwhelms you!") + else + to_chat(L, "A chilling wave of cold passes by you, as your armor protects you from it.") + continue + + // Now make it very cold. + var/datum/gas_mixture/env = T.return_air() + if(env) + // This is most likely physically impossible but when has that stopped slimes before? + env.add_thermal_energy(-10 * 1000 * 1000) // For a moderately sized room this doesn't actually lower it that much. + + playsound(T, 'sound/effects/phasein.ogg', 75, 1) + + ..() + + +/decl/chemical_reaction/instant/slime/dark_blue_temp_resist + name = "Slime Temperature Resistance" + id = "m_darkblue_temperature_resist" + required_reagents = list("blood" = 5) + result_amount = 1 + required = /obj/item/slime_extract/dark_blue + +/decl/chemical_reaction/instant/slime/dark_blue_temp_resist/on_reaction(var/datum/reagents/holder) + for(var/mob/living/L in range(1, holder.my_atom)) + L.add_modifier(/datum/modifier/slime_temp_resist, 5 MINUTES, src) + ..() + +/datum/modifier/slime_temp_resist + name = "slime temperature resistance" + desc = "You feel immune to heat and cold." + mob_overlay_state = "corona" + + on_created_text = "A shield of goo surround you. It makes you feel protected against temperature." + on_expired_text = "The shield of goo has faded, and you feel vulnerable to temperature again." + stacks = MODIFIER_STACK_EXTEND + + incoming_fire_damage_percent = 0.5 + heat_protection = 1 + cold_protection = 1 + + +/decl/chemical_reaction/instant/slime/dark_blue_ice + name = "Slime Ice" + id = "m_darkblue_ice" + result = "ice" + required_reagents = list("water" = 5) + result_amount = 5 + required = /obj/item/slime_extract/dark_blue + + +/decl/chemical_reaction/instant/slime/dark_blue_death + name = "Slime Death" + id = "m_darkblue_death" + required_reagents = list("slimejelly" = 5) + result_amount = 1 + required = /obj/item/slime_extract/dark_blue + +/decl/chemical_reaction/instant/slime/dark_blue_death/on_reaction(var/datum/reagents/holder) + new /obj/item/slimepotion/death(get_turf(holder.my_atom)) + ..() + +// ************** +// * Red slimes * +// ************** + +/obj/item/slime_extract/red + name = "red slime extract" + icon_state = "red slime extract" + description_info = "When injected with phoron, this extract creates a mutation agent, that can be used to increase a slime's mutation chance. When injected with blood, this extract causes \ + nearby slimes to fall into rage. When injected with water, this extract creates some hot sauce. When injected with slime jelly, this extract creates a ferality agent, which makes slimes \ + unreceptive to discipline." + slime_type = /mob/living/simple_mob/slime/xenobio/red + + +/decl/chemical_reaction/instant/slime/red_mutation + name = "Slime Mutation" + id = "m_red_mutation" + required_reagents = list("phoron" = 5) + result_amount = 1 + required = /obj/item/slime_extract/red + +/decl/chemical_reaction/instant/slime/red_mutation/on_reaction(var/datum/reagents/holder) + new /obj/item/slimepotion/mutator(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/red_enrage + name = "Slime Enrage" + id = "m_red_enrage" + required_reagents = list("blood" = 5) + result_amount = 1 + required = /obj/item/slime_extract/red + +/decl/chemical_reaction/instant/slime/red_enrage/on_reaction(var/datum/reagents/holder) + for(var/mob/living/simple_mob/slime/S in view(get_turf(holder.my_atom))) + if(S.stat) + continue + + if(istype(S, /mob/living/simple_mob/slime/xenobio)) + var/mob/living/simple_mob/slime/xenobio/X = S + if(X.harmless) + continue + if(!X.client) + X.enrage() + + S.add_modifier(/datum/modifier/berserk, 30 SECONDS) + + if(S.client) // Player slimes always have free will. + to_chat(S, "An intense wave of rage is felt from inside, but you remain in control of yourself.") + + for(var/mob/living/carbon/human/H in view(get_turf(holder.my_atom))) + if(H.species.name == SPECIES_PROMETHEAN) + H.add_modifier(/datum/modifier/berserk, 30 SECONDS) + to_chat(H, "An intense wave of rage is felt from inside, but you remain in control of yourself.") + + log_and_message_admins("Red extract reaction (enrage) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") + + playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1) + ..() + + +/decl/chemical_reaction/instant/slime/red_hotsauce + name = "Slime Hot Sauce" + id = "m_red_hotsauce" + result = "capsaicin" + required_reagents = list("water" = 5) + result_amount = 30 + required = /obj/item/slime_extract/red + + +/decl/chemical_reaction/instant/slime/red_ferality + name = "Slime Ferality" + id = "m_red_ferality" + required_reagents = list("slimejelly" = 5) + result_amount = 1 + required = /obj/item/slime_extract/red + +/decl/chemical_reaction/instant/slime/red_ferality/on_reaction(var/datum/reagents/holder) + new /obj/item/slimepotion/ferality(get_turf(holder.my_atom)) + ..() + +// *************** +// * Green slime * +// *************** + +/obj/item/slime_extract/green + name = "green slime extract" + icon_state = "green slime extract" + description_info = "When injected with phoron, this extract creates a single radioactive pulse. When injected with blood, this extract creates a radioactive glob. When injected with water \ + this extract creates some radium. When injected with slime jelly, this extract creates some uranium." + slime_type = /mob/living/simple_mob/slime/xenobio/green + + +/decl/chemical_reaction/instant/slime/green_radpulse + name = "Slime Radiation Pulse" + id = "m_green_radpulse" + required_reagents = list("phoron" = 5) + result_amount = 1 + required = /obj/item/slime_extract/green + +/decl/chemical_reaction/instant/slime/green_radpulse/on_reaction(var/datum/reagents/holder) + log_and_message_admins("Green extract reaction (radiation pulse) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") + playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1) + holder.my_atom.visible_message("\The [holder.my_atom] begins to vibrate violently!") + spawn(5 SECONDS) + SSradiation.flat_radiate(src, 30, 7, TRUE) + ..() + + +/decl/chemical_reaction/instant/slime/green_emitter + name = "Slime Radiation Emitter" + id = "m_green_emitter" + required_reagents = list("blood" = 5) + result_amount = 1 + required = /obj/item/slime_extract/green + +/decl/chemical_reaction/instant/slime/green_emitter/on_reaction(var/datum/reagents/holder) + log_and_message_admins("Green extract reaction (radiation emitter) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") + new /obj/item/slime_irradiator(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/green_radium + name = "Slime Radium" + id = "m_green_radium" + result = "radium" + required_reagents = list("water" = 5) + result_amount = 30 + required = /obj/item/slime_extract/green + + +/decl/chemical_reaction/instant/slime/green_uranium + name = "Slime Uranium" + id = "m_green_uranium" + required_reagents = list("slimejelly" = 5) + result_amount = 1 + required = /obj/item/slime_extract/green + +/decl/chemical_reaction/instant/slime/green_uranium/on_reaction(var/datum/reagents/holder) + new /obj/item/stack/material/uranium(get_turf(holder.my_atom), 10) + ..() + +// *************** +// * Pink slimes * +// *************** + +/obj/item/slime_extract/pink + name = "pink slime extract" + icon_state = "pink slime extract" + description_info = "When injected with phoron, this extract creates some bone fixing agent. When injected with blood, this extract creates some clotting agent. When injected with water, this \ + extract creates some organ healing agent. When injected with slime jelly, this extract creates a powerful regenerative wave." + slime_type = /mob/living/simple_mob/slime/xenobio/pink + + +/decl/chemical_reaction/instant/slime/pink_bone_fix + name = "Slime Bone Med" + id = "m_pink_bone_fixer" + result = "slime_bone_fixer" + required_reagents = list("phoron" = 5) + result_amount = 30 + required = /obj/item/slime_extract/pink + + +/decl/chemical_reaction/instant/slime/pink_clotting + name = "Slime Clotting Med" + id = "m_pink_clotting" + result = "slime_bleed_fixer" + required_reagents = list("blood" = 5) + result_amount = 30 + required = /obj/item/slime_extract/pink + + +/decl/chemical_reaction/instant/slime/pink_organ_fix + name = "Slime Organ Med" + id = "m_pink_organ_fixer" + result = "slime_organ_fixer" + required_reagents = list("water" = 5) + result_amount = 30 + required = /obj/item/slime_extract/pink + + +/decl/chemical_reaction/instant/slime/pink_heal_pulse + name = "Slime Heal Pulse" + id = "m_pink_heal_pulse" + required_reagents = list("slimejelly" = 5) + result_amount = 1 + required = /obj/item/slime_extract/pink + +/decl/chemical_reaction/instant/slime/pink_heal_pulse/on_reaction(var/datum/reagents/holder) + for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) + to_chat(C, "A wave of energy suddenly invigorates you.") + C.adjustBruteLoss(-25) + C.adjustFireLoss(-25) + C.adjustToxLoss(-25) + C.adjustOxyLoss(-25) + C.adjustBrainLoss(-25) + C.adjustCloneLoss(-25) + C.updatehealth() + ..() + +// ************** +// * Oil slimes * +// ************** + +/obj/item/slime_extract/oil + name = "oil slime extract" + icon_state = "oil slime extract" + description_info = "When injected with phoron, this extract creates some fuel. When injected with blood, this extract creates some cooking oil. When injected with water, this extract \ + creates a fake explosion sound. When injected with slime jelly, this extract explodes." + slime_type = /mob/living/simple_mob/slime/xenobio/oil + + +/decl/chemical_reaction/instant/slime/oil_fuel + name = "Slime Fuel" + id = "m_oil_fuel" + result = "fuel" + required_reagents = list("phoron" = 5) + result_amount = 30 + required = /obj/item/slime_extract/oil + + +/decl/chemical_reaction/instant/slime/oil_oil + name = "Slime Oil" + id = "m_oil_oil" + result = "cookingoil" + required_reagents = list("blood" = 5) + result_amount = 30 + required = /obj/item/slime_extract/oil + + +/decl/chemical_reaction/instant/slime/oil_fakesplosion + name = "Slime Fake Explosion" + id = "m_oil_fakeboom" + required_reagents = list("water" = 5) + result_amount = 1 + required = /obj/item/slime_extract/oil + +/decl/chemical_reaction/instant/slime/oil_fakesplosion/on_reaction(var/datum/reagents/holder) + playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1) + explosion(get_turf(holder.my_atom), 0, 0, 0) + ..() + + +/decl/chemical_reaction/instant/slime/oil_explosion + name = "Slime Explosion" + id = "m_oil_boom" + required_reagents = list("slimejelly" = 5) + result_amount = 1 + required = /obj/item/slime_extract/oil + +/decl/chemical_reaction/instant/slime/oil_explosion/on_reaction(var/datum/reagents/holder) + ..() + var/obj/item/slime_extract/E = holder.my_atom + var/power = 1 + if(E.enhanced) + power++ + E.uses = 0 + + playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1) + holder.my_atom.visible_message("\The [holder.my_atom] begins to vibrate violently!") + log_and_message_admins("Oil extract reaction (explosion) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") + + spawn(5 SECONDS) + if(holder && holder.my_atom) + explosion(get_turf(holder.my_atom), 1 * power, 3 * power, 6 * power) + + if(holder && holder.my_atom) // Explosion may or may not have deleted the extract. + qdel(holder.my_atom) + +// ******************** +// * Bluespace slimes * +// ******************** + +/obj/item/slime_extract/bluespace + name = "bluespace slime extract" + icon_state = "bluespace slime extract" + description_info = "When injected with phoron, this extract creates some bluespace crystals. When injected with blood, this extract creates a bluespace bag. When injected with water, this \ + extract causes random teleportation. When injected with slime jelly, this extract creates a disposable precise teleportation tool." + slime_type = /mob/living/simple_mob/slime/xenobio/bluespace + + +/decl/chemical_reaction/instant/slime/bluespace_crystals + name = "Slime Bluespace Crystals" + id = "m_bs_crystals" + required_reagents = list("phoron" = 5) + result_amount = 1 + required = /obj/item/slime_extract/bluespace + +/decl/chemical_reaction/instant/slime/bluespace_crystals/on_reaction(var/datum/reagents/holder) + for(var/i = 1 to 5) + new /obj/item/slime_crystal(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/bluespace_pouch + name = "Slime Bluespace Pouch" + id = "m_bs_pouch" + required_reagents = list("blood" = 5) + result_amount = 1 + required = /obj/item/slime_extract/bluespace + +/decl/chemical_reaction/instant/slime/bluespace_pouch/on_reaction(var/datum/reagents/holder) + new /obj/item/weapon/storage/backpack/holding/slime(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/bluespace_chaotic_tele + name = "Slime Bluespace Chaos" + id = "m_bs_chaos" + required_reagents = list("water" = 5) + result_amount = 1 + required = /obj/item/slime_extract/bluespace + +/decl/chemical_reaction/instant/slime/bluespace_chaotic_tele/on_reaction(var/datum/reagents/holder) + log_and_message_admins("Bluespace extract reaction (chaos teleport) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") + for(var/mob/living/M in range(2,get_turf(holder.my_atom))) + if(M.buckled) + M.buckled.unbuckle_mob() + + var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() + sparks.set_up(3, 0, get_turf(M)) + sparks.start() + + M.forceMove(pick(trange(50, get_turf(holder.my_atom)))) + + sparks = new /datum/effect/effect/system/spark_spread() + sparks.set_up(3, 0, M.loc) + sparks.start() + ..() + + +/decl/chemical_reaction/instant/slime/bluespace_teleporter + name = "Slime Bluespace Teleporter" + id = "m_bs_teleporter" + required_reagents = list("slimejelly" = 5) + result_amount = 1 + required = /obj/item/slime_extract/bluespace + +/decl/chemical_reaction/instant/slime/bluespace_teleporter/on_reaction(var/datum/reagents/holder) + new /obj/item/weapon/disposable_teleporter/slime(get_turf(holder.my_atom)) + ..() + +// ******************* +// * Cerulean slimes * +// ******************* + +/obj/item/slime_extract/cerulean + name = "cerulean slime extract" + icon_state = "cerulean slime extract" + description_info = "When injected with phoron, this extract creates an enhancer agent, which can be used to increase amount of uses any extract has once. When injected with blood, this extact \ + creates an invigoration agent, which can be used to create a slime out of an extract. When injected with water, this extract creates a mimic agent, which can copy properties of other agents. \ + When injected with slime jelly, this extract creates a random agent." + slime_type = /mob/living/simple_mob/slime/xenobio/cerulean + + +/decl/chemical_reaction/instant/slime/cerulean_enhancer + name = "Slime Enhancer" + id = "m_cerulean_enhancer" + required_reagents = list("phoron" = 5) + result_amount = 1 + required = /obj/item/slime_extract/cerulean + +/decl/chemical_reaction/instant/slime/cerulean_enhancer/on_reaction(var/datum/reagents/holder) + new /obj/item/slimepotion/enhancer(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/cerulean_reinvigoration + name = "Slime Reinvigoration" + id = "m_cerulean_reinvigoration" + required_reagents = list("blood" = 5) + result_amount = 1 + required = /obj/item/slime_extract/cerulean + +/decl/chemical_reaction/instant/slime/cerulean_reinvigoration/on_reaction(var/datum/reagents/holder) + new /obj/item/slimepotion/reinvigoration(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/cerulean_potion_mimic + name = "Slime Potion Mimic" + id = "m_cerulean_potion_mimic" + required_reagents = list("water" = 5) + result_amount = 1 + required = /obj/item/slime_extract/cerulean + +/decl/chemical_reaction/instant/slime/cerulean_potion_mimic/on_reaction(var/datum/reagents/holder) + new /obj/item/slimepotion/mimic(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/cerulean_random_potion + name = "Slime Random Potion" + id = "m_cerulean_random_potion" + required_reagents = list("slimejelly" = 5) + result_amount = 1 + required = /obj/item/slime_extract/cerulean + +/decl/chemical_reaction/instant/slime/cerulean_random_potion/on_reaction(var/datum/reagents/holder) + var/spawn_type = pickweight(xenobio_cerulean_potions) + new spawn_type(get_turf(holder.my_atom)) + ..() + +// **************** +// * Amber slimes * +// **************** + +/obj/item/slime_extract/amber + name = "amber slime extract" + icon_state = "amber slime extract" + description_info = "When injected with phoron, this extract creates a feeding agent, which can be used to instantly split a slime. When injected with blood, this extract creates some food. \ + When injected with water, this extract creates some edible slime globs. When injected with slime jelly, this extract creates some super-nutritious slime goop." + slime_type = /mob/living/simple_mob/slime/xenobio/amber + + +/decl/chemical_reaction/instant/slime/amber_slimefood + name = "Slime Feeding" + id = "m_amber_slime_food" + required_reagents = list("phoron" = 5) + result_amount = 1 + required = /obj/item/slime_extract/amber + +/decl/chemical_reaction/instant/slime/amber_slimefood/on_reaction(var/datum/reagents/holder) + new /obj/item/slimepotion/feeding(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/amber_random_food + name = "Slime Random Food" + id = "m_amber_random_food" + required_reagents = list("blood" = 5) + result_amount = 1 + required = /obj/item/slime_extract/amber + +/decl/chemical_reaction/instant/slime/amber_random_food/on_reaction(var/datum/reagents/holder) + var/list/edibles = subtypesof(/obj/item/weapon/reagent_containers/food/snacks) + + playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1) + + for(var/i = 1 to rand(2, 4)) + var/chosen = pick(edibles) + var/obj/B = new chosen + if(B) + B.loc = get_turf(holder.my_atom) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(B, pick(NORTH,SOUTH,EAST,WEST)) + ..() + + +/decl/chemical_reaction/instant/slime/amber_snack + name = "Slime Snack" + id = "m_amber_snack" + required_reagents = list("water" = 5) + result_amount = 1 + required = /obj/item/slime_extract/amber + +/decl/chemical_reaction/instant/slime/amber_snack/on_reaction(var/datum/reagents/holder) + for(var/i = 1 to rand(3, 5)) + new /obj/item/weapon/reagent_containers/food/snacks/slime(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/amber_goop + name = "Slime Goop" + id = "m_amber_goop" + result = "slime_goop" + required_reagents = list("slimejelly" = 5) + result_amount = 30 + required = /obj/item/slime_extract/amber + +// ******************* +// * Sapphire slimes * +// ******************* + +/obj/item/slime_extract/sapphire + name = "sapphire slime extract" + icon_state = "sapphire slime extract" + description_info = "When injected with phoron, this extract creates a promethean cube, which can be used to create a new promethean. When injected with blood, this extract creates some mutation \ + toxin. When injected with water, this extract creates some plushies. When injected with slime jelly, this extract creates a sapience agent, which can be used to develop sentience in \ + various creatures." + slime_type = /mob/living/simple_mob/slime/xenobio/sapphire + + +/decl/chemical_reaction/instant/slime/sapphire_promethean + name = "Slime Promethean" + id = "m_sapphire_promethean" + required_reagents = list("phoron" = 5) + result_amount = 1 + required = /obj/item/slime_extract/sapphire + +/decl/chemical_reaction/instant/slime/sapphire_promethean/on_reaction(var/datum/reagents/holder) + new /obj/item/slime_cube(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/sapphire_mutation + name = "Slime Mutation Toxins" + id = "m_sapphire_mutation_tox" + result = "mutationtoxin" + required_reagents = list("blood" = 5) + result_amount = 30 + required = /obj/item/slime_extract/sapphire + + +/decl/chemical_reaction/instant/slime/sapphire_plushies + name = "Slime Plushies" + id = "m_sapphire_plushies" + required_reagents = list("water" = 5) + result_amount = 1 + required = /obj/item/slime_extract/sapphire + +/decl/chemical_reaction/instant/slime/sapphire_plushies/on_reaction(var/datum/reagents/holder) + var/spawn_type + var/list/possible_types = subtypesof(/obj/item/toy/plushie) + possible_types -= subtypesof(/obj/item/toy/plushie/fluff) + possible_types -= subtypesof(/obj/item/toy/plushie/therapy) + for(var/i = 1 to rand(3, 5)) + spawn_type = pickweight(possible_types) + new spawn_type(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/sapphire_sapience + name = "Slime Sapience" + id = "m_sapphire_sapience" + required_reagents = list("slimejelly" = 5) + result_amount = 1 + required = /obj/item/slime_extract/sapphire + +/decl/chemical_reaction/instant/slime/sapphire_sapience/on_reaction(var/datum/reagents/holder) + new /obj/item/slimepotion/sapience(get_turf(holder.my_atom)) + ..() + +// *************** +// * Ruby slimes * +// *************** + +/obj/item/slime_extract/ruby + name = "ruby slime extract" + icon_state = "ruby slime extract" + description_info = "When injected with phoron, this extract grants extra strength for a time. When injected with blood, this extract causes a wave of pulling force. When injected with water, \ + this extract creates some brute juice. When injected with slime jelly, this extract creates a pushing force." + slime_type = /mob/living/simple_mob/slime/xenobio/ruby + +/decl/chemical_reaction/instant/slime/ruby_swole + name = "Slime Strength" + id = "m_ruby_strength" + required_reagents = list("phoron" = 5) + result_amount = 1 + required = /obj/item/slime_extract/ruby + +/decl/chemical_reaction/instant/slime/ruby_swole/on_reaction(var/datum/reagents/holder) + for(var/mob/living/L in range(1, holder.my_atom)) + L.add_modifier(/datum/modifier/slime_strength, 10 MINUTES, src) + ..() + +/datum/modifier/slime_strength + name = "slime strength" + desc = "You feel much stronger than usual." + mob_overlay_state = "pink_sparkles" + + on_created_text = "Twinkling spores of goo surround you. It makes you feel stronger and more robust." + on_expired_text = "The spores of goo have faded, and you feel your strength returning to what it was before." + stacks = MODIFIER_STACK_EXTEND + + max_health_flat = 50 + outgoing_melee_damage_percent = 2 + disable_duration_percent = 0.5 + incoming_damage_percent = 0.75 + + +/decl/chemical_reaction/instant/slime/ruby_pull + name = "Slime Pull" + id = "m_ruby_pull" + required_reagents = list("blood" = 5) + result_amount = 1 + required = /obj/item/slime_extract/ruby + +/decl/chemical_reaction/instant/slime/ruby_pull/on_reaction(var/datum/reagents/holder) + var/location = get_turf(holder.my_atom) + playsound(location, 'sound/weapons/gauss_shoot.ogg', 50, 1) + var/datum/effect/effect/system/grav_pull/s = new /datum/effect/effect/system/grav_pull + s.set_up(3, 3, location) + s.start() + ..() + + +/decl/chemical_reaction/instant/slime/ruby_brute_juice + name = "Slime Brute Juice" + id = "m_ruby_brute_juice" + result = "berserkmed" + required_reagents = list("water" = 5) + result_amount = 30 + required = /obj/item/slime_extract/ruby + + +/decl/chemical_reaction/instant/slime/ruby_push + name = "Slime Push" + id = "m_ruby_push" + required_reagents = list("slimejelly" = 5) + result_amount = 1 + required = /obj/item/slime_extract/ruby + +/decl/chemical_reaction/instant/slime/ruby_push/on_reaction(var/datum/reagents/holder) + var/location = get_turf(holder.my_atom) + for(var/X in orange(3, location)) + var/atom/movable/AM = X + if(!ismovable(X) || istype(X, /obj/effect/overlay)) + continue + + if(isobj(X)) + var/obj/O = X + if(O.anchored) + continue + + var/throwdir = get_dir(location, AM) + AM.throw_at(get_edge_target_turf(AM, throwdir), 3, 1, src) + + playsound(location, 'sound/weapons/gauss_shoot.ogg', 50, 1) + ..() + +// ***************** +// * Emerald slime * +// ***************** + +/obj/item/slime_extract/emerald + name = "emerald slime extract" + icon_state = "emerald slime extract" + description_info = "When injected with phoron, this extract grants extra agility, making you more evasive and fast-acting for a while. When injected with blood, this extract grants extra speed \ + for a short time. When injected with water, this extract creates some hyperzine. When injected with slime jelly, this extract causes area around to become slippery for a time." + slime_type = /mob/living/simple_mob/slime/xenobio/emerald + + +/decl/chemical_reaction/instant/slime/emerald_agility + name = "Slime Agility" + id = "m_emerald_agility" + required_reagents = list("phoron" = 5) + result_amount = 1 + required = /obj/item/slime_extract/emerald + +/decl/chemical_reaction/instant/slime/emerald_agility/on_reaction(var/datum/reagents/holder) + for(var/mob/living/L in range(1, holder.my_atom)) + L.add_modifier(/datum/modifier/slime_agility, 10 MINUTES, src) + ..() + +/datum/modifier/slime_agility + name = "slime agility" + desc = "You feel much more agile than usual." + mob_overlay_state = "green_sparkles" + + on_created_text = "Twinkling spores of goo surround you. It makes you feel more agile." + on_expired_text = "The spores of goo have faded, and you feel your agility returning to what it was before." + stacks = MODIFIER_STACK_EXTEND + + evasion = 45 + attack_speed_percent = 0.5 + disable_duration_percent = 0.5 + + +/decl/chemical_reaction/instant/slime/emerald_speed + name = "Slime Speed" + id = "m_emerald_speed" + required_reagents = list("blood" = 5) + result_amount = 1 + required = /obj/item/slime_extract/emerald + +/decl/chemical_reaction/instant/slime/emerald_speed/on_reaction(var/datum/reagents/holder) + for(var/mob/living/L in range(1, holder.my_atom)) + L.add_modifier(/datum/modifier/slime_speed, 1 MINUTE, src) + ..() + +/datum/modifier/slime_speed + name = "slime speed" + desc = "You feel much faster than usual." + mob_overlay_state = "haste" + + on_created_text = "Twinkling spores of goo surround you. It makes you feel very fast." + on_expired_text = "The spores of goo have faded, and you feel your speed returning to what it was before." + stacks = MODIFIER_STACK_EXTEND + + slowdown = -3 + + +/decl/chemical_reaction/instant/slime/emerald_hyperzine + name = "Slime Hyperzine" + id = "m_emerald_hyperzine" + result = "hyperzine" + required_reagents = list("water" = 5) + result_amount = 30 + required = /obj/item/slime_extract/emerald + + +/decl/chemical_reaction/instant/slime/emerald_hell + name = "Slime Hell" + id = "m_emerald_hell" + required_reagents = list("slimejelly" = 5) + result_amount = 1 + required = /obj/item/slime_extract/emerald + +/decl/chemical_reaction/instant/slime/emerald_hell/on_reaction(var/datum/reagents/holder) + log_and_message_admins("Emerald extract reaction (slip hell) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") + for(var/turf/simulated/T in trange(5, get_turf(holder.my_atom))) + if(!istype(T)) + continue + T.wet = 1 + T.freeze_floor() + ..() + +// ********************* +// * Light Pink slimes * +// ********************* + +/obj/item/slime_extract/light_pink + name = "light pink slime extract" + icon_state = "light pink slime extract" + description_info = "When injected with phoron, this extract creates a friendship agent, which can be used to make a slime or a creature consider you a friend. When injected with blood, \ + this extract creates a loyalty agent, which can be used to make a slime or a creature think of those like you as their own. When injected with water, this extract creates a docility agent, \ + which can be used to pacify a slime or a creature permanently. When injected with slime jelly, this extract creates an obedience agent, which can be used to instantly fully discipline a slime." + slime_type = /mob/living/simple_mob/slime/xenobio/light_pink + + +/decl/chemical_reaction/instant/slime/light_pink_friendship + name = "Slime Friendship" + id = "m_lightpink_friendship" + required_reagents = list("phoron" = 5) + result_amount = 1 + required = /obj/item/slime_extract/light_pink + +/decl/chemical_reaction/instant/slime/light_pink_friendship/on_reaction(var/datum/reagents/holder) + new /obj/item/slimepotion/friendship(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/light_pink_loyalty + name = "Slime Loyalty" + id = "m_lightpink_loyalty" + required_reagents = list("blood" = 5) + result_amount = 1 + required = /obj/item/slime_extract/light_pink + +/decl/chemical_reaction/instant/slime/light_pink_loyalty/on_reaction(var/datum/reagents/holder) + new /obj/item/slimepotion/loyalty(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/light_pink_docility + name = "Slime Docility" + id = "m_lightpink_docility" + required_reagents = list("water" = 5) + result_amount = 1 + required = /obj/item/slime_extract/light_pink + +/decl/chemical_reaction/instant/slime/light_pink_docility/on_reaction(var/datum/reagents/holder) + new /obj/item/slimepotion/docility(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/light_pink_obedience + name = "Slime Obedience" + id = "m_lightpink_obedience" + required_reagents = list("slimejelly" = 5) + result_amount = 1 + required = /obj/item/slime_extract/light_pink + +/decl/chemical_reaction/instant/slime/light_pink_obedience/on_reaction(var/datum/reagents/holder) + new /obj/item/slimepotion/obedience(get_turf(holder.my_atom)) + ..() + +// ****************** +// * Rainbow slimes * +// ****************** + + +/obj/item/slime_extract/rainbow + name = "rainbow slime extract" + icon_state = "rainbow slime extract" + description_info = "When injected with phoron, this extract will create a random slime. When injected with blood, this extract will create a random slime extract. When injected with water, \ + this extract with create pretty colors. When injected with slime jelly, this extract will create unity agent, which can be used to make slime non-hostile to slimes of other colors." + slime_type = /mob/living/simple_mob/slime/xenobio/rainbow + + +/decl/chemical_reaction/instant/slime/rainbow_random_slime + name = "Slime Random Slime" + id = "m_rainow_random_slime" + required_reagents = list("phoron" = 5) + result_amount = 1 + required = /obj/item/slime_extract/rainbow + +/decl/chemical_reaction/instant/slime/rainbow_random_slime/on_reaction(var/datum/reagents/holder) + var/mob/living/simple_mob/slime/xenobio/S + var/list/slime_types = typesof(/mob/living/simple_mob/slime/xenobio) + + while(slime_types.len) + S = pick(slime_types) + if(initial(S.rainbow_core_candidate) == TRUE) + break + else + slime_types -= S + S = null + + if(S) + new S(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/rainbow_random_extract + name = "Slime Random Extract" + id = "m_rainow_random_extract" + required_reagents = list("blood" = 5) + result_amount = 1 + required = /obj/item/slime_extract/rainbow + +/decl/chemical_reaction/instant/slime/rainbow_random_extract/on_reaction(var/datum/reagents/holder) + var/spawn_type = pickweight(xenobio_rainbow_extracts) + new spawn_type(get_turf(holder.my_atom)) + ..() + + +/decl/chemical_reaction/instant/slime/rainbow_colors + name = "Slime Colors" + id = "m_rainbow_colors" + required_reagents = list("water" = 5) + result_amount = 1 + required = /obj/item/slime_extract/rainbow + +/decl/chemical_reaction/instant/slime/rainbow_colors/on_reaction(var/datum/reagents/holder) + for(var/mob/living/carbon/human/H in range(3, holder.my_atom)) + H.druggy = max(H.druggy, 30) + ..() + + +/decl/chemical_reaction/instant/slime/rainbow_unity + name = "Slime Unity" + id = "m_rainbow_unity" + required_reagents = list("slimejelly" = 5) + result_amount = 1 + required = /obj/item/slime_extract/rainbow + +/decl/chemical_reaction/instant/slime/rainbow_unity/on_reaction(var/datum/reagents/holder) + new /obj/item/slimepotion/unity(get_turf(holder.my_atom)) + ..() \ No newline at end of file diff --git a/code/modules/xenobio/items/slime_objects.dm b/code/modules/xenobio/items/slime_objects.dm index 9a945e0058..72cc0e01e3 100644 --- a/code/modules/xenobio/items/slime_objects.dm +++ b/code/modules/xenobio/items/slime_objects.dm @@ -67,7 +67,6 @@ qdel(src) - // More or less functionally identical to the telecrystal tele. /obj/item/slime_crystal name = "lesser slime cystal" @@ -101,6 +100,7 @@ safe_blink(AM, 14) qdel(src) + /obj/item/weapon/disposable_teleporter/slime name = "greater slime crystal" desc = "A larger, gooier crystal." @@ -112,7 +112,6 @@ origin_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 4) - // Very filling food. /obj/item/weapon/reagent_containers/food/snacks/slime name = "slimy clump" @@ -125,4 +124,95 @@ /obj/item/weapon/reagent_containers/food/snacks/slime/Initialize() . = ..() - bitesize = 5 \ No newline at end of file + bitesize = 5 + + +//Flashlight + +/obj/item/device/flashlight/slime + gender = PLURAL + name = "glowing slime extract" + desc = "A slimy ball that appears to be glowing from bioluminesence." + icon = 'icons/obj/lighting.dmi' + icon_state = "floor1" //not a slime extract sprite but... something close enough! + item_state = "slime" + light_color = "#FFF423" + w_class = ITEMSIZE_TINY + light_range = 6 + on = 1 //Bio-luminesence has one setting, on. + power_use = 0 + +/obj/item/device/flashlight/slime/New() + ..() + set_light(light_range, light_power, light_color) + +/obj/item/device/flashlight/slime/update_brightness() + return + +/obj/item/device/flashlight/slime/attack_self(mob/user) + return //Bio-luminescence does not toggle. + + +//Radiation Emitter + +/obj/item/slime_irradiator + name = "glowing slime extract" + desc = "A slimy ball that appears to be glowing from bioluminesence." + icon = 'icons/mob/slimes_vr.dmi' + icon_state = "irradiator" + light_color = "#00FF00" + light_power = 0.4 + light_range = 2 + w_class = ITEMSIZE_TINY + +/obj/item/slime_irradiator/New() + START_PROCESSING(SSobj, src) + set_light(light_range, light_power, light_color) + return ..() + +/obj/item/slime_irradiator/process() + SSradiation.radiate(src, 5) + +/obj/item/slime_irradiator/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + + +//BS Pouch +/obj/item/weapon/storage/backpack/holding/slime + name = "bluespace slime pouch" + desc = "A slimy pouch that opens into a localized pocket of bluespace." + icon_state = "slimepouch" + + + +//Slime Chems + +/datum/reagent/myelamine/slime + name = "Agent A" + id = "slime_bleed_fixer" + description = "A slimy liquid which appears to rapidly clot internal hemorrhages by increasing the effectiveness of platelets at low quantities. Toxic in high quantities." + taste_description = "slime" + overdose = 5 + +/datum/reagent/osteodaxon/slime + name = "Agent B" + id = "slime_bone_fixer" + description = "A slimy liquid which can be used to heal bone fractures at low quantities. Toxic in high quantities." + taste_description = "slime" + overdose = 5 + +/datum/reagent/peridaxon/slime + name = "Agent C" + id = "slime_organ_fixer" + description = "A slimy liquid which is used to encourage recovery of internal organs and nervous systems in low quantities. Toxic in high quantities." + taste_description = "slime" + overdose = 5 + +/datum/reagent/nutriment/glucose/slime + name = "Slime Goop" + id = "slime_goop" + description = "A slimy liquid, with very compelling smell. Extremely nutritious." + color = "#FABA3A" + nutriment_factor = 30 + taste_description = "slimy nectar" \ No newline at end of file diff --git a/code/modules/xenobio/items/slimepotions.dm b/code/modules/xenobio/items/slimepotions.dm index 2a600fb801..11d2d07571 100644 --- a/code/modules/xenobio/items/slimepotions.dm +++ b/code/modules/xenobio/items/slimepotions.dm @@ -11,7 +11,7 @@ /obj/item/slimepotion/enhancer name = "extract enhancer agent" desc = "A potent chemical mix that will give a slime extract an additional two uses." - icon_state = "potpurple" + icon_state = "potcyan" description_info = "This will even work on inert slime extracts, if it wasn't enhanced before. Extracts enhanced cannot be enhanced again." // Makes slimes less likely to mutate. @@ -64,7 +64,7 @@ // Makes the slime friendly forever. /obj/item/slimepotion/docility - name = "docility agent" + name = "slime docility agent" desc = "A potent chemical mix that nullifies a slime's hunger, causing it to become docile and tame. It might also work on other creatures?" icon_state = "potlightpink" description_info = "The target needs to be alive, not already passive, and be an animal or slime type entity." @@ -178,7 +178,7 @@ desc = "A potent chemical mix that makes an animal deeply loyal to the species of whoever applies this, and will attack threats to them." description_info = "The slime or other animal needs to be alive for this to work. The slime this is applied to will have their 'faction' change to \ the user's faction, which means the slime will attack things that are hostile to the user's faction, such as carp, spiders, and other slimes." - icon_state = "potred" + icon_state = "potlightpink" /obj/item/slimepotion/loyalty/attack(mob/living/simple_mob/M, mob/user) if(!istype(M)) @@ -247,7 +247,7 @@ name = "slime feeding agent" desc = "A potent chemical mix that will instantly sediate the slime." description_info = "The slime needs to be alive for this to work. It will instantly grow the slime enough to reproduce." - icon_state = "potyellow" + icon_state = "potorange" /obj/item/slimepotion/feeding/attack(mob/living/simple_mob/slime/xenobio/M, mob/user) if(!istype(M)) diff --git a/code/modules/xenobio/items/slimepotions_vr.dm b/code/modules/xenobio/items/slimepotions_vr.dm new file mode 100644 index 0000000000..0c4f0ab0a8 --- /dev/null +++ b/code/modules/xenobio/items/slimepotions_vr.dm @@ -0,0 +1,189 @@ +/obj/item/slimepotion/attackby(obj/item/O, mob/user) + if(istype(O, /obj/item/slimepotion/mimic)) + to_chat(user, "You apply the mimic to the slime potion as it copies it's effects.") + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + var/newtype = src.type + new newtype(get_turf(src)) + qdel(O) + ..() + + +/obj/item/slimepotion/infertility + name = "slime infertility agent" + desc = "A potent chemical mix that will reduce the amount of offspring this slime will have." + icon_state = "potpurple" + description_info = "The slime needs to be alive for this to work. It will reduce the amount of slime babies by 2 (to minimum of 2)." + +/obj/item/slimepotion/infertility/attack(mob/living/simple_mob/slime/xenobio/M, mob/user) + if(!istype(M)) + to_chat(user, "The agent only works on slimes!") + return ..() + if(M.stat == DEAD) + to_chat(user, "The slime is dead!") + return ..() + if(M.split_amount <= 2) + to_chat(user, "The slime cannot get any less fertile!") + return ..() + + to_chat(user, "You feed the slime the infertility agent. It will now have less offspring.") + M.split_amount = between(2, M.split_amount - 2, 6) + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + qdel(src) + +/obj/item/slimepotion/fertility + name = "slime fertility agent" + desc = "A potent chemical mix that will increase the amount of offspring this slime will have." + icon_state = "potpurple" + description_info = "The slime needs to be alive for this to work. It will increase the amount of slime babies by 2 (to maximum of 6)." + +/obj/item/slimepotion/fertility/attack(mob/living/simple_mob/slime/xenobio/M, mob/user) + if(!istype(M)) + to_chat(user, "The agent only works on slimes!") + return ..() + if(M.stat == DEAD) + to_chat(user, "The slime is dead!") + return ..() + if(M.split_amount >= 6) + to_chat(user, "The slime cannot get any more fertile!") + return ..() + + to_chat(user, "You feed the slime the infertility agent. It will now have less offspring.") + M.split_amount = between(2, M.split_amount + 2, 6) + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + qdel(src) + +/obj/item/slimepotion/shrink + name = "slime shrinking agent" + desc = "A potent chemical mix that will turn adult slime into a baby one." + icon_state = "potpurple" + description_info = "The slime needs to be alive for this to work." + +/obj/item/slimepotion/shrink/attack(mob/living/simple_mob/slime/xenobio/M, mob/user) + if(!istype(M)) + to_chat(user, "The agent only works on slimes!") + return ..() + if(M.stat == DEAD) + to_chat(user, "The slime is dead!") + return ..() + if(!(M.is_adult)) + to_chat(user, "The slime is already a baby!") + return ..() + + to_chat(user, "You feed the slime the shrinking agent. It is now back to being a baby.") + M.make_baby() + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + qdel(src) + +/obj/item/slimepotion/death + name = "slime death agent" + desc = "A potent chemical mix that will instantly kill a slime." + icon_state = "potblue" + description_info = "The slime needs to be alive for this to work." + +/obj/item/slimepotion/death/attack(mob/living/simple_mob/slime/xenobio/M, mob/user) + if(!istype(M)) + to_chat(user, "The agent only works on slimes!") + return ..() + if(M.stat == DEAD) + to_chat(user, "The slime is already dead!") + return ..() + + to_chat(user, "You feed the slime the death agent. Its face flashes pain of betrayal before it goes still.") + M.adjustToxLoss(500) + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + qdel(src) + +/obj/item/slimepotion/ferality + name = "slime ferality agent" + desc = "A potent chemical mix that will make a slime untamable." + icon_state = "potred" + description_info = "The slime needs to be alive for this to work." + +/obj/item/slimepotion/ferality/attack(mob/living/simple_mob/slime/xenobio/M, mob/user) + if(!istype(M)) + to_chat(user, "The agent only works on slimes!") + return ..() + if(M.stat == DEAD) + to_chat(user, "The slime is already dead!") + return ..() + if(M.untamable && M.untamable_inheirit) + to_chat(user, "The slime is already untamable!") + return ..() + + to_chat(user, "You feed the slime the death agent. It will now only get angrier at taming attempts.") + M.untamable = TRUE + M.untamable_inheirit = TRUE + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + qdel(src) + +/obj/item/slimepotion/reinvigoration + name = "extract reinvigoration agent" + desc = "A potent chemical mix that will create a slime of appropriate type out of an extract." + icon_state = "potcyan" + description_info = "This will even work on inert extracts. Extract is destroyed in process." + +/obj/item/slimepotion/mimic + name = "mimic agent" + desc = "A potent chemical mix that will mimic effects of other slime-produced agents." + icon_state = "potsilver" + description_info = "Warning: avoid combining multiple doses of mimic agent." + +/obj/item/slimepotion/mimic/attackby(obj/item/O, mob/user) + if(istype(O, /obj/item/slimepotion/mimic)) + to_chat(user, "You apply the mimic to the mimic, resulting a mimic that copies a mimic that copies a mimic that copies a mimic that-") + var/location = get_turf(src) + playsound(location, 'sound/weapons/gauss_shoot.ogg', 50, 1) + var/datum/effect/effect/system/grav_pull/s = new /datum/effect/effect/system/grav_pull + s.set_up(3, 3, location) + s.start() + qdel(O) + qdel(src) + return + ..() + +/obj/item/slimepotion/sapience + name = "slime sapience agent" + desc = "A potent chemical mix that makes an animal capable of developing more advanced, sapient thought." + description_info = "The slime or other animal needs to be alive for this to work. The development is not always immedeate and may take indeterminate time before effects show." + icon_state = "potblue" + +/obj/item/slimepotion/sapience/attack(mob/living/simple_mob/M, mob/user) + if(!istype(M)) + to_chat(user, "The agent only works on creatures!") + return ..() + if(M.stat == DEAD) + to_chat(user, "The creature is dead!") + return ..() + if(M.ghostjoin) + to_chat(user, "The creature is already developing sapience.") + return ..() + if(M.ckey) + to_chat(user, "The creature is already sapient!") + return ..() + + to_chat(user, "You feed \the [M] the agent. It may now eventually develop proper sapience.") + M.ghostjoin = 1 + active_ghost_pods |= M + M.ghostjoin_icon() + log_and_message_admins("[key_name_admin(user)] used a sapience potion on a simple mob: [M]. [ADMIN_FLW(src)]") + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + qdel(src) + +/obj/item/slimepotion/obedience + name = "slime obedience agent" + desc = "A potent chemical mix that makes slime extremely obedient." + icon_state = "potlightpink" + description_info = "The target needs to be alive and currently misbehaving. Effect is equivalent to very strong discipline." + +/obj/item/slimepotion/obedience/attack(mob/living/simple_mob/slime/xenobio/M, mob/user) + if(!istype(M)) + to_chat(user, "The agent only works on slimes!") + return ..() + if(M.stat == DEAD) + to_chat(user, "The slime is dead!") + return ..() + + to_chat(user, "You feed the slime the agent. It has been disciplined, for better or worse...") + M.adjust_discipline(10) + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + qdel(src) \ No newline at end of file diff --git a/icons/inventory/back/item.dmi b/icons/inventory/back/item.dmi index daa2c464499689ecb36a3c214fbd5c0c908d2d7b..230b3950c8af1f67b66b88151ce42f231c7a177a 100644 GIT binary patch delta 5830 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 delta 4867 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 diff --git a/icons/inventory/back/mob.dmi b/icons/inventory/back/mob.dmi index 755a2d75d428701539347a81d0b2164a58b424f1..3f11cc9dc1a78e5cdc41928dcb226fa0526a99cf 100644 GIT binary patch delta 18262 zcmcJ%cUTkK8!j58gA_#pDT0L}NS7{zrlNvaKu}6(g3@~@LlHp`L6P1R6{I&Y^w691 z-a`#Sq=ps}k~7i0f9H4ax#v0e{&DAd*v_o1nYGq8Ykli|-|w3pJWflPp^fEWR->bV zKp-0=K|KhB`pr9mi-3i4r%r`J~{cX?3pSy2dSxdzC8m^YB>7kyD2`OnfhqL2s8~-53+}HkA31-xY)`+ zrgZYd=|v*-O3v~_QEBtVFYArzQkCpBF0(Azv@4zT6I|9cW=fQ0O>?zo70QxEXBhJ(Fo!`)_g7ins6gI#Ds5zFJ*5nUETfc1nZz ze0|Ly=%(b|GJxkw?APyBp7c!pL&20vlTx=GJNz3~xULeJ2rD+*n z6tmIqR=9rJ7`pgK*eL5GqS}h0bcQ|YPQG%29t;0rkl*y@^Fz$s*+bMkKDJfPSDuH( zA%cHv&_yIZOgo_UuHWnZwTsrjOzSxGDO$@=tw2?QO`956A7qdUuvCAtb2YNSw4J?( z@?K>JtVlj1Sjw|*`{bK!Of-yvgg=a^ ziCVgOk>{0|_fJO-@fTq?1#cTEN3Ft7yra)BGJh*{CJ9YXZR4lmnlpa$Xq%QxcNm_U z5pWQY8~m8I0QhDuIV1gK|C7aKC19oh-JS5|cQvLA=I@#gwyB-Ulok1t+9d}E1L36d z?Z$$0eT{^!Z{wpW$`9KCBK(e=Z1ZZ3bn1I*jfoP51*L}#vf?4Z${f@qlCdRBCJz{M zK95pma`OgVxBfCfW#3YIb@S_#_P)a4^QQ_6Jzvl8qs{{_Dql+OOeWN^WW6i!yB1u& z^?K|k?dbpum3*^nF7TdER$Fd6@)sKRaJilV0A zwOw5Ysv$(lscE6cxvs&ho%05>Rj8ZvI+uE@4`RA%I&uEtwh z*ylB7*Ev={c}BC@M#cHxbLJ}A{eRE`reFvp7{)wNr!$S0fWl;P(U$o7EzX{PPP36S=SFf)u z`UZ%f^uV+hyvJi3arJIO{D3E0z(sQ{ALW-i(1?T-IQyc z;~~Zqhx-VmSW^;(^y!TP;KWPg&BF!D>#07EJuWM?aKJLcw_Cje8PtrJ-jAWE>g$(C zMu8Td1HPR~%YM`%GbA9;8HW-=J%R6*Za%?tl@K=B7Ki{TpLm!I#o7|Ld!WY9+3B@h zhme5zY`g8np2Ek_4eercnXAX5zXM-Y1RCg!O(-osE%sY^ynXz$`06j&kDhH6xr~_1 z^UCy)SQ%A2JGQCNLX7m0NlBKF(e;u5-#&^)V(?R(qx ziaM1~%jreBYoXzM0wn=AGYDLZ?5!$G=A` z{2F(z&+~RV>u>Yey#4#n`*rU5+HWR>PUH8Po;Z&(#g?c(mOCkE&-D3r=}}FLpI|EA z;FsHR1!k^<4F8R7@D;hWqGsW}`M2H*qntR+RNSZx3G3@CFH6@eVxSv!eoJ)3(xp$s zWBI_Xx6ke2+MzR%yLA=zb&^hxQUFtpN=fQ~--?~y!Oc7n!cVKz=E?6BNdOe>EP>Y3 zI>TEiQ?v&moNC|$>#6@ zf}mKtP71v37FpM`N~rYVAYRxWf;I;d{&qc>-N7+4auw7$Hr{kn3cVND)rbT5pH z`gr;j)2G$js43f(92j#6o~mS1Um=QLPG!~K4gX`(Tf~=HpN~9A<@gXSgyzo72;rg- zMC?o7Dcw&yxkK1M==YF_e-4L+bNpI=k2AgwL9D0#91oUCDK!2me%DSz_qX)a4d6WY z|EacolLy5=cUt#mTsE8dhu5Ykx!lnhtslHNvb-_7U5l&EO zi{=hLEBZLXrR(Haa?RL5d?waL}Ci7?{$XnEhmg1Gi0*Ui6L5|Fj=_N<_?eL3!=XE0JbVQMN?h8q|f zlKF+=Eu$!Nm;j{vMxy4(jk+$j%^z+rX5V#X|4;WrHVIWO+Z;*W5^{ju*qepIAJ zMq!pVpUE_OmElTrD=VEIxw@L_>9J&_DU>>uoV(gA9E8;c~KTCB*Lc;qZz>j~W`#AH&;@}NQ3HS*3(_d?)-sNblJv4~H zwg0s$Y-ne88G&EgEfO@l(n+YjGhFH|5%$EJ?b5 z&`4+`I4Yubk^mniC8gTI!H1;)2`>6pQMm5PC1-z%S0t*`G*uczef{jDP;ikqF{It8 zxk|hELbvyG@*N62rm^;2DR2htNdp)XF25u&3^x&EWoD?}VFIbR&+p(f zGR`kaYYG&Dk7|$lxEck!eNa_mv33@_*-q#&C!!_Ev(t#_@l~I8Li9)jfoUMHTaFn{ z=_yHy6}xx24wI;b&{{7tC$*=1`a=@i+C}PT-hS=*?s2!zNjNUt`Pm zvuAPf3XtA=Nqqp0vtRL$8oUU5J4OO@aD5C?seKox+YQHm2%TOiPuc(KFQ{D~m682u z6ha}b*Z1zgW##j}f8PS=9mb{BrGFvi+_bZu-RZIE0}1l&=*~QNt^)T1P^3I!;?6e zTUPcaG_!0UMwmXjZ zz5A#W9id_Kf(p9293L*xAj$%hG*1nagF?);E|3(sGxLu{wswl$h~6X02nL;cx}<;y zZrqTJ$*scSOnE?7_BH7FuH?H*?(OY0jd-Uzd{aRY$Qx_@rg-y;9Wv6`j2LeSPR^v! zgGXrSb#A*pArkR-aNmfWrE~)UYp%H-whTO3tH{Ky^o~r@np~shI**bN<(52T!Y|xo z4(j{XNl~^jCsldz*u=IAHhcQ44X+!dz@7Ee`wa@9L}V3*@bFrI#&!eW+k(FZym8dK z+#(i;_YTgbC=p4{Adx85Oy_WX4jW;(Be|cAW28CE7mW3gl|FrcUOx8tTm;Edux@k?F(GaXbcTu^a>QOpy7d3Zl zQ1Nr{CS*mtU+G9&}YmW|~o2s>IWjf1=|hi0!or-cj;5Btc<%9>q3 zjGYv!bmXXc(U{VFU2j!?38l0+8McEj?c3P8N9fUMB)BiS5eM~R(shq#&{+7v)!mAqJVKt$(o(A-*AFJt_D1R@eRO>>6hFCA!N>?N!XPn;K74;KddZ? z`?2K>I_S(7ycfBtF>js{7u%w(h|Lj}#Kx&u9bI4MB25b!!?o@(Cd8*IH#5^*84kH6 z)S$N+<|?$fXgHaXd&hg(cNy%?{h3|5hj7L>c4W-Dl-Q{R_xo+VrZH^;)+(%@<_0LP z5gm4JL{}ex{vX3-KIa<`Eq@J;YAu%uC9U+UV75wjgmB_LlVCdHjP=hyLq~r5ri~|> zDuONDUdkd-oHUARd0aHSnnF@TdkQ;%R?w0wfzw2YEm^|#C?3P~s~_5mhhR=5Ep+*M ze(iN&dLGa#`KWo^*4qaGbf9WaHVnFBz`p)6eq_xQOYlhIqLd{YCvW>me`?Qr$L#Ra%YsoIA>dV)2hmOJv{5~O+24!Y3gN#)7e#0C8m@g0+q3@{dY(Glb!2S* zFFa*v{h#0y#Gb(ad#L)qL8{S`ra^`K`UZvXP$qbwaGQ^Rq!3@xyRr5Z0!huwO9SlrJKDk{tz2@?eJL9S;S>dgJn27qCZ7(ok`!QA z5oc&OzjLP7^vv7F55j3R!aSi@9w>M}P@s8~<+73GaxzMkliAZ|wB~z?+Oh$WQ2@7rV|i_@N#*{D zi?G9>dcs-9zI`m~&2$hbO~I#Elc3l{lnki}@dEFfV@2$S!TSh|sOkFDjaP_QTy_f!?( z;`8cP!gOe8O@4mss9?t*I>2a7%=@y8Z1{UEyFNb9`QLKBJo3onK^0vsFMV_xc!&lz9~1L1Z~Te=d3k74GKT)aQ+~||yV&`f z4Wln+#5)}>igOkbf9yq2E9-Qb$uAZ!Sx)-en8GK*jcN>3_<-DLgThENotY$(3`ug| z>ZcT~6oBR_rd zm9)r`$gC<8BoMu?tP%!O`9wJ2=XKs-VTVgCucPI7%0J8!?pJML%@NDZS6NN|09R4}J8(W3-j9XGKKsWR8yh@Pd|%z9KC9LDfj@Kz{x4GX<$`U>{L8%hlwM46c#I!Pcs0{{yK%!#(se=ZM?P z5NQwj>ACd?;g0w$iOulcnlM~A(RDB2c+=LHIPnm~k-G&9_RRoXy*gy9Zd_Ltq*Y1C z`oN_oAc2rmQBgReg1y9xWzl2Dg_r&E1nGPB5hR?a*#&bB<%Py=kLa1{{ilyy5wJNb&W6#vsR?MlzEm)BV5bekdNA%I7th1pb$O0fY2s zAaa^8BnI@yh)`6s?32=1h(6~3B6I+367gxr7JKRFRcB^TOvEAvs8pcTD&2jX8A)y5 zrgzXE$eQFaCiR)mTdVp1)=`WDymH)H%AmZBP$3I7aVSg5O9p#7f0DHoB(2wRmxXs5 zQ3C_>^C{~ML*)v~ou~fONAOA6qNEpi;DE#I>Xmkop@TPW2cY`aB&xThu8R*R#mp@z zWoJOd(~LRnx@oa}_c&*~xg|-zEALx@ug}Zmn-pI+R5{?7CB_~%_4L2XaJ58RS;{Y< zSMTtDCphDIwRpkfw%8f>F)0iC`&H62;KBhh&+jU5S58s{_74e$F}PF^zN~3VJtAuh#vrTpHZ{LB!iZ1W!(0+snkmGAk$5H3#V+5TieB*N z3;)!0JL??$&v{md73Ir+w!(`s|MO|r<<$Nu72X;D_s0K^mAR#c0ltL9L`KN3U%$3? zKYTX(UpGl7y=ifXxwPQoJ<`1lWYT|_nX$9821M<_yT0F6!pu0(Tw2T*O&)?$hV=}% z2i!r}mP@XA%vTOc0TomFRVut7CeLgTa_LbVn^S(hX$1UMN8Jv%H4S7`ns!7TYK)AH zMI9aaVfupCl#>7G8{H`0ZWym3tCud=(zm?hj_MjM{MwDt%<%n@sFru0-co>dA_>&4 z=4!IVO$c|vNu5RB9l??K`T3OqBw~kGNmI*T#mZWzZF$Ay?QJ0ArCwl8kB8zD{JjO` zg%o$7s8MK(e(0+LsB8VzXPkG^NpXdSjbV*IY<{R$YRd(Zg>6vfbvkKN%`=jJG#}3# zAm?B=Gqdd{s;KQOpAzjY=IOZ>#p7Y`Ny*i|I2W8^qLs8@s(Aa8f2J!SBC=DbnS*K+ zxO7WFhRz9Ar=8|d$DsDz89?=4Si{+RGQMF9n5{#}1-2G#UeULrT;y}T=C zhL3Vy#4vF*?7wILTjMV}>{s-`O^x^*_32?}_fGt+-9~ufigT)z{?meqv>O$3Iy}6G z<%S4*p;tEjdwZg$cnH@pxS%GKK5FxQ2vb}Kz~-)1NEr9tD9J97Bwa>3w}bm1X$y;V zJ7Q)IVwdl-l*M0~{Z-WghHYN1a0 zUlgy99u{=*I6MEiR;(@%d;cK$^P5cqpGKK4Tb9uh%jLesPfLho12H;{F>X`!uLMRT1so@lf{t$~ z0m!57b7$n3LTGE&8#9;v$4?W9pEID4{8aNWIphvt7X(3z6KMSt5ji=x@E|u16n9AS z>my4@fk{YS+!#2lY>pNgQ2zO*iMbKW^vF4x6r_}dOy){LUg!qYcuRkxTKE-81uvW~ zJl_1xf`#r@SI0@R_NPv&L zi6cZwpoVG1(fGrJK(jXBcFMY$tdG$SHxpzniD+<4doAL?dgxp!MD;yEE|XfKxrHFx zae?HJ3Ik;^NFZn-P)Xy{mp{Lf1o zV>WKET#@;^PkNY9P5J$|Aja**8W6Z2_3%z8Q;MOd2}Pj{^h7yx+RmxV_G1mp1otD( z=}*@|&^qH8G`KoJ#;O!*zJ`WtfGy~^E*`#S$=<-{1e4Wgsh5N?NH>bQTJ<8R=H51= z%C8mf@p#Y^1yc@tM;bc~V}rPS|NVT;wi|WN0!otjUCRn_X>3nMMuP~=Sre|c@hLd! zIkONrja`nDq4KU%QLuIYD(2Zj7i|=ma8M0SG@0TAgsei_a76$gK=(h<(a}mK0_8Q; zPswsSgsedYf%t&GLN_RsFI5Lb9|~GTd$*Zcu$nAbjlG*pz$5{VlL zVhq0G)EpLNlT7nZfi)b3&`0qcz7aWh z=*|pZ2qt@M@2Oo<*ABKr+Gw)syJae((9}uO>|~rWLnm+^y*`O{%s;sV`;;d>__<*P zSd?>~I#IpePs*ZCh)d` z-FdeB?auT?r$+G9U-OA(O^V2stLJw5@?VS`5McKe^B$^_M8_;0zy4ER^P-|>YV>pm zpsx9(IiyMSOUdOQLRv>pS;Lr({Qct)nGQ2gJ05G(f~K2=Oz4}KaHLgd6q8ws{8^5% zb-%5dYCt~Yu2bG$u4&ZX7*i*AmP1~o3z*MdSZFh4sh>(p04`w>i6)tvttY;cne~C} zRGm378@iG3N^p}JrfgrR5UWsvmL`?ereyBS%%Y-+rfaqVwEgfGxW1Zh9PXQ2Ae0HDTm>GVGGTf3J1&7#o`_34)>WN)S6*km9|&DM z$$wX1^fFcUK{55Gg~bP=?1lT0k?#?D9Wc-0_D^eUIy(JNYVvWS##9C=WE%6xz+lIp zdTR2Kf$U}$j+RkE=TsHl=T#-?()mYHAfgu2Pa-v`7#P@t@Xw)x?>!P}o3NtCz;v+Vs!;Q!jQV4#*L?D##+JOwnjxev3wZ!w1}WaOCSL02pI{?$O|uU|Wihp9(I>?wKC6+M;eeBTq%;epE#1`b8r% zf)n;3Q)uL?vR7VHYu&A2ZCMDbL%_K%q!YN@sI{3}xVpGR9F>dRwrYCr%AUl4mrot? zWjJV0(}GT}Wc!&gfXOs0s=c?optjIp04ZU&e-vFzdrYglmvJHB9fg#kVi;s3&Yx`1;p8V$t zk1N(ewSjr(dIFAPF8Jd0Wm0^PIW%|nb7?;zR@L_hCkT)u_QmO^hwD6oT7@`@Z+)oO zG!aZ*Du+(I5S=vuZ)9d%^)SbtTyP02`1iWHctRZJQ%LOV2Lbxv{n38$oP?=bRv3Au zsim7p>c0am!d@j9+_O^gso>LKn3CzxL2VueKRbz?JWvwAEbV1pEV^E7;+yXF&Ls3i zNzJ*1JLx}M7T7t5Ks~7^uKa!oYN`zYpI)AmXBV9ocA79N2MU6J^fc=e{}t8kg3=`Z zgY`S){*M9S|BcG_{~SG@1?YyT#|seh7r^MTU5p+~)>i{d&M!F2rzI0L59hXfdJ6OxENEkxVs zkFjfc%a$VvU}HX{F&a!U#C2s;V_9sCEgmK#9fBZEa_ai^L`1RKWr)J|5ld2Wd4HpQ zR>hrwf`rGczYcMBtT_`c0_OHH`lE4R2?7$zsNFK{~R{8`EjQqS|^ zYXemD=cCqjlK>O@Wid%jFvU^GxcJU-`OT>1_e@O8BNd2K8QGVLFuMdW+W!m4it&rAY-#dbc!nGSFr@}>AxmHhnH2Sb7s=@FmNCD>EJ%(5E zXe%8Tf9al)uaCXBwd_MYZnvyq?e#6P#$G&(pJnX?5;q7#F*jD~vF|X7wv^VKH*VB> z|JqeHGO3?Rj`~QZI-R5WkV-}OMnP%P-J5UCiBi`po_$8x4|D22eyk)zS5#PdR{37q zLnU{0xf2dTF~(=Xuk>8eV_6+e{OUHamObCXIM7Tj<qA@SAFT z8yRCU_Dw2Jjw8kNbDR0C*7grhakzG6(%kwP@mk`~P27=QUb3H|3b))C`&qe6t5o|a z1_PNVO|g28iV`7{AaR%^Q;M@BppnL&;aS3{2c(bUM{zJeEwYlz=*`TQ=J>7Y9X$s< zI+GLn-A~smz&CEv0qZr|`SU}foWuB>th{{Gt5-B+QUSgnDX^cvCo34a*8JxXPYs76tEbRaoSsgA`#zKSc zrAa-N zUCXkWbP{LKk@MjC;P=Kjn23FMYtq1_M-@qV7mUkpJ}J)yxyHF4OQ^%f+p(~)05=9~ zpKcM3qn0KjH;Nx5JrmdHdKC^^8?tqivNC{d>@O|isl?~Q6aoOA&u>^p@niQ0_&isV zW(=3gCK$d)7eD@hH7ujc+lb=l&Yn%-q7r(F-(=)=*vjX|j$Hz|j9Vu(PgjzA2VueL z;I}0z1;`{J73Hp}>&Qbd&*-vFff-p^*3f5}Cq82?cD#z>yM6G70&TrpI{0x7dKq2Z zXaowpaR9PYy+kY&_8Nz2CG^NlP?dhgU0AgXDZ#00X^99QbDHpS2!fT{GyyHA8POT|bnDO-G$tCYy>R3|#eOweOe znWN?m%dP;Xpct)ycFv-=G{$NU4kVdlLxG40ea;^g?|(u%1gmM()YwDkF!=hiYevm2 z#rt&zyoPH2*u_g0n*vmPrQhh?0#WU&X!DXu&lSEj&xH>${7-6V8r8Ro9$3*3o=h}n zUi~Fii72{xZN?+?+h4a+=C$=FEx=uC1Us;Os4HIH(}LACn3hK9^rh;z z#XKeGI6_7b%f*XX1g0qfG7nMkPZqy3X((~JikbiT-SJ9o;NHaxNS#7l?9aIwc0s$x z38bqvJ2}6tQ!tE)@xpL zWwfC1xsriDka2^rwobL&l^A^%KjME&L9Bsg@Dib;Nay% z#Kt7fDPs*0@Y~%e!sl8n%5~vPEvC4A0vLl+&hCv}l4bjd|B_-EUJ6?vUy0wI+rXBR-V)`r1A*NqpjL@iA!^qCK zVy(Vh3EKkO&Y1(hyBqam%7I7ho2{tsZTPlHwD)R@vCBpTSMA}$bCHp~ZQOCd-qJnW zYODIX7`%sfckx;B-_K2Aq>Sv;+dqPzpq$#7+Xc7jbT(m(8m&69WT%>ywWPz2voDHz z!QRzM?IMs~aZ8HS;w8_amTh-Z2uX(OX#RT$=kiIwfJ94xyPA%(BmZ`9%rXJi=`EhU9J)Av16+ zjR^#bkKinkI{rKsHN%T|jnoZbSV<>E9Q-g^uEXsk>ae$<37#s>L>${JKqTCqZQV={ zw)NI+&w={WN!0lm|5|~6^VBvO@C^8>a2W2d++`H+pX)}ntS;3|f}Dd=ZAR?8MQjDH(lIl6 z{k$GJqH!T=pqdkw4$ekB_7};?+ivSyz8 zI;jcHqZ+_ElcTgX`=D=$U=+(SY;`k6ALbCz#6{K0^e2_jQL_({4C!d)%o$y88?K(2 zH`M<~;dx$Thw~b}{lEwX<(gPv4?9yxlxuYgvWUVZiE)DldvNP01L)P0cLOc3^JL3S zfjm)CL3b9%Xq7ihG;cF_dy~9?!HKe%Ig58EU^&{Y(Bn&e9wV`0PgbCS>viI49aL{b zvFKr+1O1geTu!E;sjRhqNqg=Fp~nBMGnUj3Wg2w{ zNMLUy>flxY=E58{Gc{PAM4*3$SH+~24@}ME+qs{6R?gfxnmO)`kNdtSB%Af^mjiiS z_wqgny(=^u0=sUwSa+DJIJ*j}(L0A_6A745zSp5234bN}*gY=(8#my9oyv(+GQBe) zCtIv?8TNt+C)Ji9wl98G6OMGKW7)i#lu~`R-NSU%IvqTZ1k3s+|Ab^JmR*l(40~Ir zoMT#2bBI|UHKy$`A~R+`qzg4IKPQ^i>INK@hj0BZTCF^+liA9IlHMmeQ;LX$@?BA& z%bNeA$OGH+xO(Sm8gg7GM}el0JCVwv zR3({hG7xg{cFtsviXz^P^nvQxc4JxG0n5I@$vW)H9BpKU#y?ry}C+K9V z@($(b@p+gRH-8ln$b~H*$T5zt0vdI4#I96t3xZaW+4Y`go*+rchgSPM1GfTXa|zr%Rx)18lceZ122^(mvQ=TqM`ql1mr zh~3ia=e=o)S$62|;RDQAai7Sg34+gY$0>-mth!FGwL-uWouElTY3|I*65xXJmAT!k zCTuMj66v^PzrFBM+c}`%>9YR|lE8$(`0lq~q;s~RvEqyELM`0RFR@09?o$)L)^#JY zF4kn;`Z1iOYQC30<(7A4;Hkj$3hciFRfHRlR;)XfghX^v0^x zly2p^VJ`Z{+|O+SKBm>{LK;^1(JW-(81nUyUJfdKZ1#2cX2@z=(|w0r**e?>rZK82 z@6OXwQ&NK@Czq}IN`uX?z`Refqq`;BKi==A(B!8JUoG4I zR83AsemP)r?yUnLyt^;>auwZlKV&aCFK&zkCS`XDJT9iNyp(EdkW}Qj_T8=2S>MOB zJ@9j$R<;eTGf;ZV54#A>^tEZoWEuU_fo(&+qyE^b(HW{$+)yS2a;XnG9n=|`s|w+sB<yQ(e-_{RZm{XVSiQHafTbOGkZnndGYWsE3UqCIU4N$_3IzM=~IdPrwvJt8xQ*Mmv zwR9@V08#bhTM3S5$|SY0z%fW?JFxiNIvrdV?sEG4i^-3B(2pQ3Rr*Y0{54Z%rUJfx z&T-pni=6?vXo1;*j_Mz@T>m<6%Y?ayk@Gfv4aQfe&*|`rguB+csD#| z4o(EB#Dotnf)PC;M>h8QRP}uW=SZ_lyF(1-BOk1-8qwJy4)B5$OWad|Gq;_2coS2O zA3S{M!=@z%y>sWtHn`T+BdzOw`NIKk17J}@Q+;%N4@R0+RqvDeos7$X`$D zRo=Yr+9{AYx5zkIg0oLt%%+94p^HtKAwJk1`9dzb&YR%{+vLJN?tHRk3M-rfeoIk+ zA;Pa;zm6jTU~P;9-y6wA-?X(A8sxZ92Tn@YjfhhUz;7c6r`Ny$itjq-+O68z8td1b z{*BZ=_;rNqM%Bs*$UT5Z`IU2#$qR%1_XQkkc{Ve9MMk9>9>+67ov80Zw97kv(leu{ zul;hAINRxX7U{;6AZDC>JS|~btzT<^b+5HuY#-?FH-EPO{%*y?-42SwicFffNYb&- z@#+}lvU61DGvzW@w*lGB_R2A{=Fv<+z{!&4)pfyCTYxIL=-@4Yt62D&jO5-b58$xA z7N}x>muaHx(_^&r+s>zBh5i~m*L^q-P)IEt9JKqDJ9h-lH>Qo_os>V&(9Mm8+9;5* zvV!m0cbRrqaQBh2+0~vV^?#nk94~Ykwtgdd(c5(Eemo&ud8*7=KmIvwiF- z(2`SYAB-kcPfo+F)=^6wev|}_62R<>7>*Arf}(=6PoNy78aLP zyK~3QSt+*#1Gwv$k!bB>Q8jL}G|hx?gwqV0hNrtmJ6yv)NULY326<7Z{^L^9tEa}d z3|<4Y66+#9fp2q%x?0EJus3TPa?Xt`FJpCM(D0n!BiDY z(<0e`W>WB3gJj>U<5Ju4;-+4H5MhnIG?vUpZW#0Xx6bjbJ{uM1;T6dumr}Gt3B87O z@oe<^yI2T>&YPSoF#9q#6S$eRknnEq$6)FOku`yfS<}hS;o5mA{0>2}>{Zv)Y4A1R zh|LyzGQ3f?@XbBy+dsgqB%>Ts59FNN#JsV-a`?0ba{*MH9T5;R7%2}CwC z?0z{8;Se%@TMk-ginUTGqkmrnc1}nyt$|N3jjoRVp{%=&QL14P2uZX-fl5w2Vj)VG z^ezo-ei+w~3BT zbD+fwW|3m#K{Lek^suag5AE3VN-E&y2SKhU8kz_~nMm^AvNzD0oRTZ)5Yob(%D>$v zsI6dDg;sSS9F9C89hcB7{}@*HvShn#QcEO%x(36Hs$38RJ_2V11lU|i$9D^=j|IMc zu|5HoUCR;Fe$2$0c%A^#;UO9p$h{0Drg*&*9KD*Hvekq4>1yZ~ntbU#-!$Z6u#i{Z zFfD62A~WTpYiF9ALav%t46!J55&_ZK4FhI)47^&P6XDd}bW0Q?DidWz%-L zM71k`Q}w(|o;-JCs?*^~a@!ar)PYhfqhIRtE%y5fa0?asg|;wtfYmnS+Xx!J5EGc$ zuyCT6>Op>P?rk0@eA?sOlSLiYik)-j;ZnkguWuFHUOc7-E4O0EnMhO+B*8Oh^>o>L z`*ck?wGb8}S?`?8l?a`W`zTo!%nxug6q&PWF-;H@R_{|%(dE$Zq{2u~TW!AIH^_H@ zr>O>l@eB_OwwE52z9`jz->W$l8}4iCh@A6%@|#oP=I+vmws~*(GFfR^@@DNS$EhBK z{=rc65cmNMPjPu{yd=3mZ!|SpotwW1dMKbuzr*GL|KrONp{e{~0Ep}C>Iu(Qc2;y^ zo2XLxn3$M)m-_^@i6NA$i|sLs=sV`8A z^2s(jTHen0&HC|%cU`Ic%r$esdDiDMr~if7e$el@AP?xc32a>I}_)40E|B z-9H~uv<*lNJ+pphx@gt0Y~?2-rZ4bMiEvx%%YMOV4v1g#DCF9?IB0kYaP9lh5$#C%_$^O=Iql5}s1lM~RQ0XDAKfDHhjl}?tYvyf;+jrqF zqkEV!e_7bkX^6rMxNN0{16J<}FMaln@$#H+TCnsC3tIyJA+N!oh>3DbaKqES2K{2r zW)1FqzASJMUZA_H?mx)qv8Jq&J+CiMZC!3LVqiEQd}YEgt6Gs?x9-@>)e>v7*@Esd z)6@(_I7~?E5mnz9->11G1ON3k@q>yS%BT6DEk-Xw`0tYmhcA5=qX}=Xpa9#D$fv%? z(Ac{x8aE2N0scgwH|%aj3i>YxF6$=mS{IloQ@<%B2&c!)gKJ4&>l5zOnO3Voi{HBP zuP<%ZM`7WI&9%KV!&A#PA&g;k|Yo)>iy4`vZu~TgWths3!J7O68QI<+75;P-*PMeW^I!B z@Bftme`SjG#AL9FAQIPAmlHPv!5)*3cicC>P4^Paw=L}p;hw_x(!;PHFq zx0qyd3a|Uh?3%0Kzn}hobuXik9@dEorDeg0hySe^aW&@)MHY56ZuzGnb5$`O*n~Cx z=hKbnkQJMtl14D{@aL#)i-L zJ$3dM>ySvLvL+kGzx_V7d{qqQE5!Ui_W%!y+)^lZ>NaIR zg3kBHrq5#s)OJA}D8^<%7$11ZU;hDbkrED&C<^-m9kP46+q!id#uko!-) zeAh$|-Fe|SOs~3a@Ksp-!!0W}vLpZ=!lvNI>|~RT%Bs>p#!MO8_scu^m zAVZ5G(xz=FQIQ<7`Ez`Dy@H3|Bk>Q3308Bnh}imFK23i%_21mvsO4$MYp(xf*Jc&Z u#WV{1lb2h@`(I)C|6?S6mPC8zdRXjJVrd%*{J-ZwZr`}4Rit4a@;?B%*gS0j delta 17501 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 W|B;^Vv6D~$0000