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 daa2c464499..230b3950c8a 100644 Binary files a/icons/inventory/back/item.dmi and b/icons/inventory/back/item.dmi differ diff --git a/icons/inventory/back/mob.dmi b/icons/inventory/back/mob.dmi index 755a2d75d42..3f11cc9dc1a 100644 Binary files a/icons/inventory/back/mob.dmi and b/icons/inventory/back/mob.dmi differ diff --git a/icons/mob/slimes_vr.dmi b/icons/mob/slimes_vr.dmi new file mode 100644 index 00000000000..4f7b901cfd0 Binary files /dev/null and b/icons/mob/slimes_vr.dmi differ diff --git a/vorestation.dme b/vorestation.dme index b98c312451d..2a2483e8f34 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -4051,9 +4051,10 @@ #include "code\modules\xenoarcheaology\tools\tools_pickaxe.dm" #include "code\modules\xenoarcheaology\tools\tools_pickaxe_vr.dm" #include "code\modules\xenoarcheaology\tools\tools_vr.dm" -#include "code\modules\xenobio\items\extracts.dm" +#include "code\modules\xenobio\items\extracts_vr.dm" #include "code\modules\xenobio\items\slime_objects.dm" #include "code\modules\xenobio\items\slimepotions.dm" +#include "code\modules\xenobio\items\slimepotions_vr.dm" #include "code\modules\xenobio\items\weapons.dm" #include "code\modules\xenobio\machinery\processor.dm" #include "code\modules\xgm\xgm_gas_data.dm"