From 56849e7a714bbfd54ded91665f3d66cab433c560 Mon Sep 17 00:00:00 2001 From: Heroman Date: Sun, 27 Mar 2022 14:17:41 +1000 Subject: [PATCH] Reworks xenobio extract rewards --- 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 | 33 +- .../reagents/reactions/instant/instant_vr.dm | 237 +-- code/modules/xenobio/items/extracts.dm | 2 + code/modules/xenobio/items/extracts_vr.dm | 1648 +++++++++++++++++ code/modules/xenobio/items/slime_objects.dm | 96 +- code/modules/xenobio/items/slimepotions.dm | 8 +- code/modules/xenobio/items/slimepotions_vr.dm | 190 ++ 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, 2241 insertions(+), 276 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 455732fa7c6..9373bc342c4 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -566,3 +566,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/sentience, + /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 3b20ccbb5c2..f0ff01c05ad 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 563c9953e6d..bc4f9303e3b 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 72d32abb8c8..ed1e3fb8be4 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 @@ -489,6 +489,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." @@ -499,7 +500,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 dd22ad7fd0f..a5782f880cb 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 @@ -11,6 +11,9 @@ 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. 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. var/list/slime_mutation = list( /mob/living/simple_mob/slime/xenobio/orange, /mob/living/simple_mob/slime/xenobio/metal, @@ -54,7 +57,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 +109,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 +159,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 +232,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 +269,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 c9b3ad1dc77..bbc18fa3229 100644 --- a/code/modules/reagents/reactions/instant/instant_vr.dm +++ b/code/modules/reagents/reactions/instant/instant_vr.dm @@ -204,240 +204,17 @@ 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/////// /////////////////////////////// -/decl/chemical_reaction/instant/slime_food - name = "Slime Bork" - id = "m_tele2" - result = null - required_reagents = list("phoron" = 10, "slimejelly" = 5, "nutriment" = 20) - result_amount = 1 - -/decl/chemical_reaction/instant/slime_food/on_reaction(var/datum/reagents/holder) - var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/snacks) - - playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1) - - for(var/i = 1, i <= 4 + rand(1,2), i++) - var/chosen = pick(borks) - 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/materials - name = "Slime materials" - id = "slimematerial" - result = null - required_reagents = list("phoron" = 20, "slimejelly" = 40, "aluminum" = 20) //Woah there! You have the possibility of making diamonds! 8 ground up slimes required for one of these, and you still have a 10% chance for it to fail. - result_amount = 1 - -/decl/chemical_reaction/instant/materials/on_reaction(var/datum/reagents/holder) - var/fail_chance = rand(1,1000) - if(fail_chance == 1) // 0.1% chance of exploding, so scientists don't exclusively abuse this to obtain materials. - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The solution begins to vibrate violently!"), 1) // It was at this moment, the Xenobiologist knew... he fucked up. - sleep(30) - playsound(holder.my_atom, 'sound/items/Welder2.ogg', 100, 1) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The reaction begins to rapidly sizzle and swell outwards!"), 1) - sleep(20) - explosion(get_turf(holder.my_atom), 0 ,4, 8) //Enough to cause severe damage in the area, but not so much that it'll instantly gib the person. - empulse(get_turf(holder.my_atom), 3, 7) //Uh oh, it produced some uranium, too! EMP blast! - return - - if(fail_chance < 101) // 10% chance of it not working at all. - playsound(holder.my_atom, 'sound/items/Welder.ogg', 100, 1) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime core fizzles disappointingly."), 1) - return - - var/blocked = list( - /obj/item/stack/material, //Technical stacks - /obj/item/stack/hairlesshide, //Useless leather production steps - /obj/item/stack/wetleather, - /obj/item/stack/material/algae/ten) //Why is this one even a separate thing - blocked += typesof(/obj/item/stack/material/cyborg) //Borg matter synths, should only exist in borgs - blocked += typesof(/obj/item/stack/animalhide) //Hides which are only used for leather production anyway - - var/rare_types = list( - /obj/item/stack/material/morphium, //Complex materials requiring Particle Smasher to create - /obj/item/stack/material/morphium/hull, - /obj/item/stack/material/valhollide, - /obj/item/stack/material/supermatter) - - var/list/material = typesof(/obj/item/stack/material) - blocked - - playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1) - - var/spawn_amount = rand(1,50) - var/chosen = pick(material) - if(chosen in rare_types) - spawn_amount = rand(1,15) - new chosen(get_turf(holder.my_atom), spawn_amount) - -/decl/chemical_reaction/instant/slimelight - name = "Slime Glow" - id = "m_glow" - result = null - required_reagents = list("phoron" = 5, "slimejelly" = 5, "water" = 10) //Takes 10 water so it doesn't mess with the frost oil. - result_amount = 1 - -/decl/chemical_reaction/instant/slimelight/on_reaction(var/datum/reagents/holder) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text(" The contents of the slime core harden and begin to emit a warm, bright light."), 1) - var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime - F.loc = get_turf(holder.my_atom) - - -/decl/chemical_reaction/instant/slimephoron - name = "Slime Phoron" - id = "m_plasma" - result = null - required_reagents = list("phoron" = 20, "uranium" = 20, "slimejelly" = 20) - result_amount = 1 - -/decl/chemical_reaction/instant/slimephoron/on_reaction(var/datum/reagents/holder) - new /obj/item/stack/material/phoron(get_turf(holder.my_atom), 10) - -/decl/chemical_reaction/instant/slimefreeze - name = "Slime Freeze" - id = "m_freeze" - result = null - required_reagents = list("phoron" = 10, "coolant" = 10, "slimejelly" = 10) - result_amount = 1 - -/decl/chemical_reaction/instant/slimefreeze/on_reaction(var/datum/reagents/holder) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently!"), 1) - sleep(50) - playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/M in range (get_turf(holder.my_atom), 7)) - M.bodytemperature -= 140 - to_chat(M, " You suddenly feel a chill!") - -/decl/chemical_reaction/instant/slimefrost - name = "Slime Frost Oil" - id = "m_frostoil" - result = "frostoil" - required_reagents = list("phoron" = 5, "slimejelly" = 5, "water" = 5, "coolant" = 5) - result_amount = 10 - -/decl/chemical_reaction/instant/slimefire - name = "Slime fire" - id = "m_fire" - result = null - required_reagents = list("phoron" = 60, "slimejelly" = 30, "potassium" = 30) - result_amount = 1 - -/decl/chemical_reaction/instant/slimefire/on_reaction(var/datum/reagents/holder) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently!"), 1) - sleep(50) - var/turf/location = get_turf(holder.my_atom.loc) - for(var/turf/simulated/floor/target_tile in range(0,location)) - target_tile.assume_gas("phoron", 25, 1400) - spawn (0) target_tile.hotspot_expose(700, 400) - /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. - result_amount = 1 - -/decl/chemical_reaction/instant/slimeheal //A slime healing mixture. Why not. - name = "Slime Health" - id = "slimeheal" - result = "null" - required_reagents = list("phoron" = 10, "bicaridine" = 10, "kelotane" = 10, "inaprovaline" = 10, "slimejelly" = 10) - -/decl/chemical_reaction/instant/slimeheal/on_reaction(var/datum/reagents/holder, var/created_volume) - 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() - -/decl/chemical_reaction/instant/slimejelly - name = "Slime Jam" - id = "m_jam" - result = "slimejelly" - required_reagents = list("phoron" = 20, "sugar" = 50, "lithium" = 50) //In case a xenobiologist is impatient and is willing to drain their dispenser resources, along with plasma! - result_amount = 5 - -/decl/chemical_reaction/instant/slimevore - name = "Slime Vore" // Hostile vore mobs only - id = "m_tele" - result = null - required_reagents = list("phoron" = 20, "nutriment" = 20, "sugar" = 20, "mutationtoxin" = 20) //Can't do slime jelly as it'll conflict with another, but mutation toxin will do. - result_amount = 1 - -/decl/chemical_reaction/instant/slimevore/on_reaction(var/datum/reagents/holder) - var/mob_path = /mob/living/simple_mob - var/blocked = list( //List of things we do NOT want to spawn - /mob/living/simple_mob, //Technical parent mobs - /mob/living/simple_mob/animal, - /mob/living/simple_mob/animal/passive, - /mob/living/simple_mob/animal/space, - /mob/living/simple_mob/blob, - /mob/living/simple_mob/mechanical, - /mob/living/simple_mob/mechanical/mecha, - /mob/living/simple_mob/slime, - /mob/living/simple_mob/vore, - /mob/living/simple_mob/vore/aggressive, - /mob/living/simple_mob/illusion, //Other technical mobs - /mob/living/simple_mob/animal/passive/crab/Coffee, //Unique pets/named mobs - /mob/living/simple_mob/animal/passive/cat/runtime, - /mob/living/simple_mob/animal/passive/cat/bones, - /mob/living/simple_mob/animal/passive/cat/tabiranth, - /mob/living/simple_mob/animal/passive/dog/corgi/puppy/Bockscar, - /mob/living/simple_mob/animal/passive/dog/corgi/Ian, - /mob/living/simple_mob/animal/passive/dog/corgi/Lisa, - /mob/living/simple_mob/animal/passive/dog/tamaskan/Spice, - /mob/living/simple_mob/animal/passive/fox/renault, - /mob/living/simple_mob/animal/passive/bird/azure_tit/tweeter, - /mob/living/simple_mob/animal/passive/bird/parrot/poly, - /mob/living/simple_mob/animal/sif/fluffy, - /mob/living/simple_mob/animal/sif/fluffy/silky, - /mob/living/simple_mob/animal/passive/snake/python/noodle, - /mob/living/simple_mob/slime/xenobio/rainbow/kendrick, - /mob/living/simple_mob/animal/space/space_worm, //Space Worm parts that aren't proper heads - /mob/living/simple_mob/animal/space/space_worm/head/severed, - /mob/living/simple_mob/animal/borer, //Event/player-control-only mobs - /mob/living/simple_mob/vore/hostile/morph - )//exclusion list for things you don't want the reaction to create. - blocked += typesof(/mob/living/simple_mob/mechanical/ward) //Wards that should be created with ward items, are mobs mostly on technicalities - blocked += typesof(/mob/living/simple_mob/construct) //Should only exist - blocked += typesof(/mob/living/simple_mob/vore/demon) //as player-controlled - blocked += typesof(/mob/living/simple_mob/shadekin) //and/or event things - var/list/voremobs = typesof(mob_path) - blocked // list of possible hostile mobs - - playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1) - var/spawn_count = rand(1,3) - for(var/i = 1, i <= spawn_count, i++) - var/chosen = pick(voremobs) - var/mob/living/simple_mob/C = new chosen - C.faction = "slimesummon" - C.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(C, pick(NORTH,SOUTH,EAST,WEST)) - -/decl/chemical_reaction/instant/slime/sapphire_mutation - name = "Slime Mutation Toxins" - id = "slime_mutation_tox" - result = "mutationtoxin" - required_reagents = list("blood" = 5) - result_amount = 30 - required = /obj/item/slime_extract/sapphire - -/decl/chemical_reaction/instant/biomass - result_amount = 6 // Roughly 120u per phoron sheet + result_amount = 1 \ No newline at end of file diff --git a/code/modules/xenobio/items/extracts.dm b/code/modules/xenobio/items/extracts.dm index dacebb203c7..188c8874c2f 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 00000000000..239da388963 --- /dev/null +++ b/code/modules/xenobio/items/extracts_vr.dm @@ -0,0 +1,1648 @@ +// 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 = "This extract will create a new grey baby slime if injected with phoron, or some new monkey cubes if injected with blood." + 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 = "This extract will create a metamorphic liquid which will transform into metallic liquid it comes into contact with, when injected with phoron. \ + It can also create a metallic binding liquid which will force metallic liquids to mix to form alloys when solified, when injected with water." + 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 = "This extract will create frost oil when injected with phoron, which can be used to solidify liquid metals. \ + The extract can also create a slime stability agent when injected with blood, which reduces the odds of newly created slimes mutating into \ + a different color when a slime reproduces." + 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 = "This extract can create a slime steroid agent when injected with phoron, which increases the amount of slime extracts the processor \ + can extract from a slime specimen." + 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 = "This extract creates a fire when injected with phoron, after a five second delay." + 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 = "This extract will create a special 10k capacity power cell that self recharges slowly over time, when injected with phoron. \ + When injected with blood, it will create a glob of slime which glows brightly. If injected with water, it will emit a strong EMP, after a five second delay." + 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 = "This extract will create 5u liquid gold when injected with phoron." + slime_type = /mob/living/simple_mob/slime/xenobio/gold + + +/decl/chemical_reaction/instant/slime/gold_hostile_mob + name = "Slime Hostile Mob" + id = "m_gold_hostile_mob" + required_reagents = list("phoron" = 5) + result_amount = 1 + required = /obj/item/slime_extract/gold + +/decl/chemical_reaction/instant/slime/gold_hostile_mob/on_reaction(var/datum/reagents/holder) + 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_random_mobs + name = "Slime Random Mobs" + id = "m_gold_random_mobs" + required_reagents = list("blood" = 5) + result_amount = 1 + required = /obj/item/slime_extract/gold + +/decl/chemical_reaction/instant/slime/gold_random_mobs/on_reaction(var/datum/reagents/holder) + 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_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 = "This extract will create 5u liquid silver when injected with phoron." + 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 = "This extract will create 40u liquid phoron when injected with water." + 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 = "This extract will massively lower the temperature of the surrounding atmosphere when injected with phoron. \ + Slimes will suffer massive harm from the cold snap and most colors will die instantly. Other entities are also chilled, however \ + cold-resistant armor like winter coats can protect from this. Note that the user is not immune to the extract's effects." + 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 = "This extract will create a slime mutator agent when injected with phoron, which increases a slime's odds of mutating \ + into a different color when reproducing by 12%. Injecting with blood causes all slimes that can see the user to enrage, becoming very violent and \ + out of control." + 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 = "This extract will create 5u of liquid uranium when injected with phoron." + 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) + 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) + 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 = "This extract will create 30u of blood clotting agent if injected with blood. It can also create 30u of bone binding agent if injected \ + with phoron. When injected with water, it will create an organ-mending agent. The slime medications have a very low threshold for overdosage, however." + 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 = "This extract cause a moderately sized delayed explosion if injected with phoron. The delay is five seconds. Extract enhancers will \ + increase the power of the explosion instead of allowing for multiple explosions." + 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 = "This extract creates slime crystals. When injected with water, it creates five 'lesser' slime crystals, which allow for limited \ + short ranged, random teleporting. When injected with phoron, it creates one 'greater' slime crystal, which allows for a one time precise teleport to \ + a specific area." + 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) + 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 = "This extract creates a slime extract enhancer agent, when injected with phoron. The agent allows an extract to have more \ + 'charges' before it goes inert." + 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 = "This extract creates a slime feeding agent when injected with phoron, which will instantly feed the slime and make it reproduce. When \ + injected with water, it will create a very delicious and filling product." + 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 = "This extract will create one 'slime cube' when injected with phoron. The slime cube is needed to create a Promethean." + 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_sentience + name = "Slime Sentience" + id = "m_sapphire_sentience" + required_reagents = list("slimejelly" = 5) + result_amount = 1 + required = /obj/item/slime_extract/sapphire + +/decl/chemical_reaction/instant/slime/sapphire_sentience/on_reaction(var/datum/reagents/holder) + new /obj/item/slimepotion/sentience(get_turf(holder.my_atom)) + ..() + +// *************** +// * Ruby slimes * +// *************** + +/obj/item/slime_extract/ruby + name = "ruby slime extract" + icon_state = "ruby slime extract" + description_info = "This extract will cause all entities close to the extract to become stronger for ten minutes, when injected with phoron. \ + When injected with blood, makes a slime loyalty agent which will make the slime fight other dangerous entities but not station crew." + 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 = "This extract will cause all entities close to the extract to become more agile for ten minutes, when injected with phoron." + 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) + 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 = "This extract creates a slime docility agent when injected with water, which will make the slime be harmless forever. \ + When injected with phoron, it instead creates a slime friendship agent, which makes the slime consider the user their ally. The agent \ + might be useful on other specimens as well." + 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 = "This extract will create a baby slime of a random color when injected with phoron, or a slime unification agent if injected with water, \ + which makes slimes stop attacking other slime 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 9a945e00582..72cc0e01e31 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 2a600fb8019..11d2d075715 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 00000000000..efd1bdc9e96 --- /dev/null +++ b/code/modules/xenobio/items/slimepotions_vr.dm @@ -0,0 +1,190 @@ +/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/sentience + name = "slime loyalty agent" + 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 = "potblue" + +/obj/item/slimepotion/sentience/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 sentience.") + return ..() + if(M.ckey) + to_chat(user, "The creature is already sentient!") + return ..() + + to_chat(user, "You feed \the [M] the agent. It may now eventually develop proper sentience.") + M.ghostjoin = 1 + active_ghost_pods |= M + M.ghostjoin_icon() + log_and_message_admins("[key_name_admin(user)] used a sentience 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 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 delta 17501 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 W|B;^Vv6D~$0000