From f7e00834098479ae7ddc0a5027c946f86359c430 Mon Sep 17 00:00:00 2001 From: Heroman Date: Sat, 26 Mar 2022 17:26:48 +1000 Subject: [PATCH 01/21] Makes board in tech storage not be broken --- maps/tether/tether-05-station1.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maps/tether/tether-05-station1.dmm b/maps/tether/tether-05-station1.dmm index 430e7154cd..fdb370ee8b 100644 --- a/maps/tether/tether-05-station1.dmm +++ b/maps/tether/tether-05-station1.dmm @@ -5618,7 +5618,7 @@ /area/storage/tech) "amb" = ( /obj/structure/table/rack/steel, -/obj/item/weapon/circuitboard/skills{ +/obj/item/weapon/circuitboard/skills/pcu{ pixel_x = -3; pixel_y = 3 }, From 7d3173d539c5cbb401b830c23b3912d1d10e9a7c Mon Sep 17 00:00:00 2001 From: Pandora Date: Sat, 26 Mar 2022 16:44:17 +0000 Subject: [PATCH 02/21] Update floor_attackby.dm --- code/game/turfs/simulated/floor_attackby.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/game/turfs/simulated/floor_attackby.dm b/code/game/turfs/simulated/floor_attackby.dm index 279cf8a5b1..aed4636e68 100644 --- a/code/game/turfs/simulated/floor_attackby.dm +++ b/code/game/turfs/simulated/floor_attackby.dm @@ -8,13 +8,15 @@ if(L.a_intent != I_HELP) attack_tile(C, L) // Be on help intent if you want to decon something. return - +/* +//By god, no I do NOT want to engrave when trying to cut wires, can't get this working with non-help intent either else you just swipe the tools over the floors. if(!(C.has_tool_quality(TOOL_SCREWDRIVER) && flooring && (flooring.flags & TURF_REMOVE_SCREWDRIVER))) if(isliving(user)) var/mob/living/L = user if(L.a_intent == I_HELP) if(try_graffiti(L, C)) // back by unpopular demand return +*/ // Multi-z roof building if(istype(C, /obj/item/stack/tile/roofing)) From fea7d8c037fd3553ea2f31cd4fbd004629892174 Mon Sep 17 00:00:00 2001 From: Pandora Date: Sat, 26 Mar 2022 16:46:32 +0000 Subject: [PATCH 03/21] Update wall_attacks.dm --- code/game/turfs/simulated/wall_attacks.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index 11f0b9d1cc..8c6eb32ae3 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -131,9 +131,12 @@ user.setClickCooldown(user.get_attack_speed(W)) +/* +//As with the floors, only this time it works AND tries pushing the wall after it's done. if(!construction_stage && user.a_intent == I_HELP) if(try_graffiti(user,W)) return +*/ if (!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") From 3b04c3893f2666e86ce79c66a0a381c4d4bdad66 Mon Sep 17 00:00:00 2001 From: Pandora Date: Sat, 26 Mar 2022 16:47:26 +0000 Subject: [PATCH 04/21] Update screwdriver.dm --- code/game/objects/items/weapons/tools/screwdriver.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/weapons/tools/screwdriver.dm b/code/game/objects/items/weapons/tools/screwdriver.dm index faabb582f7..9d053be64f 100644 --- a/code/game/objects/items/weapons/tools/screwdriver.dm +++ b/code/game/objects/items/weapons/tools/screwdriver.dm @@ -4,6 +4,7 @@ /obj/item/weapon/tool/screwdriver name = "screwdriver" desc = "You can be totally screwwy with this." + description_fluff = "This could be used to engrave messages on suitable surfaces if you really put your mind to it! Alt-click a floor or wall to engrave with it." //This way it's not a completely hidden, arcane art to engrave. icon = 'icons/obj/tools.dmi' icon_state = "screwdriver" center_of_mass = list("x" = 13,"y" = 7) From ddd31375924e00a6346c985a29ab7c2f498d6c1f Mon Sep 17 00:00:00 2001 From: Pandora Date: Sat, 26 Mar 2022 16:51:40 +0000 Subject: [PATCH 05/21] Update wirecutters.dm --- code/game/objects/items/weapons/tools/wirecutters.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/weapons/tools/wirecutters.dm b/code/game/objects/items/weapons/tools/wirecutters.dm index 6e5973f0c3..d40099de25 100644 --- a/code/game/objects/items/weapons/tools/wirecutters.dm +++ b/code/game/objects/items/weapons/tools/wirecutters.dm @@ -4,6 +4,7 @@ /obj/item/weapon/tool/wirecutters name = "wirecutters" desc = "This cuts wires." + description_fluff = "This could be used to engrave messages on suitable surfaces if you really put your mind to it! Alt-click a floor or wall to engrave with it." //This way it's not a completely hidden, arcane art to engrave. icon = 'icons/obj/tools.dmi' icon_state = "cutters" item_state = "cutters" From bb607348331bb2e2e4f5669643d3561ce19d9aa0 Mon Sep 17 00:00:00 2001 From: Pandora Date: Sat, 26 Mar 2022 16:52:16 +0000 Subject: [PATCH 06/21] Update knives.dm --- code/game/objects/items/weapons/material/knives.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index 3895d0c6f6..30ef860641 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -1,6 +1,7 @@ /obj/item/weapon/material/butterfly name = "butterfly knife" desc = "A basic metal blade concealed in a lightweight plasteel grip. Small enough when folded to fit in a pocket." + description_fluff = "This could be used to engrave messages on suitable surfaces if you really put your mind to it! Alt-click a floor or wall to engrave with it." //This way it's not a completely hidden, arcane art to engrave. icon_state = "butterflyknife" item_state = null hitsound = null @@ -63,6 +64,7 @@ icon = 'icons/obj/kitchen.dmi' icon_state = "knife" desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come." + description_fluff = "This could be used to engrave messages on suitable surfaces if you really put your mind to it! Alt-click a floor or wall to engrave with it." //This way it's not a completely hidden, arcane art to engrave. sharp = TRUE edge = TRUE force_divisor = 0.15 // 9 when wielded with hardness 60 (steel) From ab3fa9984498e8d34392018291e8ebdaddf9e77c Mon Sep 17 00:00:00 2001 From: FartMaster69420 <78667902+FartMaster69420@users.noreply.github.com> Date: Sat, 26 Mar 2022 22:31:35 -0400 Subject: [PATCH 07/21] Go ahead Deconstruct 'em --- code/modules/vore/resizing/holder_micro_vr.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/vore/resizing/holder_micro_vr.dm b/code/modules/vore/resizing/holder_micro_vr.dm index d4f114fc2a..cd09c2eec4 100644 --- a/code/modules/vore/resizing/holder_micro_vr.dm +++ b/code/modules/vore/resizing/holder_micro_vr.dm @@ -5,7 +5,8 @@ desc = "Another crewmember, small enough to fit in your hand." icon_state = "micro" icon_override = 'icons/inventory/head/mob_vr.dmi' - slot_flags = SLOT_FEET | SLOT_HEAD | SLOT_ID + slot_flags = SLOT_FEET | SLOT_HEAD | SLOT_ID | SLOT_HOLSTER + origin_tech = list(TECH_BIO = 2) w_class = ITEMSIZE_SMALL item_icons = null // No in-hand sprites (for now, anyway, we could totally add some) pixel_y = 0 // Override value from parent. From fd4541bf32ce3c1c47dea9ea322c1340e6d91370 Mon Sep 17 00:00:00 2001 From: FartMaster69420 <78667902+FartMaster69420@users.noreply.github.com> Date: Sat, 26 Mar 2022 22:47:54 -0400 Subject: [PATCH 08/21] Atleast holsters work micros dont deconstruct very well --- code/modules/vore/resizing/holder_micro_vr.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/vore/resizing/holder_micro_vr.dm b/code/modules/vore/resizing/holder_micro_vr.dm index cd09c2eec4..c77fd207fa 100644 --- a/code/modules/vore/resizing/holder_micro_vr.dm +++ b/code/modules/vore/resizing/holder_micro_vr.dm @@ -6,7 +6,6 @@ icon_state = "micro" icon_override = 'icons/inventory/head/mob_vr.dmi' slot_flags = SLOT_FEET | SLOT_HEAD | SLOT_ID | SLOT_HOLSTER - origin_tech = list(TECH_BIO = 2) w_class = ITEMSIZE_SMALL item_icons = null // No in-hand sprites (for now, anyway, we could totally add some) pixel_y = 0 // Override value from parent. From a86fba943a34e076598561a0a052fcf10bb761f2 Mon Sep 17 00:00:00 2001 From: Rykka Date: Sat, 26 Mar 2022 21:49:28 -0600 Subject: [PATCH 09/21] Autoresleever checks for whitelist and if species can be resleeved As it says. Autoresleever will abort the spawn attempt if the client is not whitelisted for the species (as currently one can ghost, select an autoresleever, and spawn via it even on a whitelisted species they don't have access to normally.) Autoresleever will abort spawn attempt for species with NO_SCAN in their flags. This prevents Xenochimera/Proteans/etc from rejoining via Autoresleevers, as per whitelist expectations - Xenochimera even have specific lore stating they contaminate sleevers. These changes will be applied to regular clonepod + resleeving pod eventually:tm: --- code/modules/resleeving/autoresleever.dm | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/code/modules/resleeving/autoresleever.dm b/code/modules/resleeving/autoresleever.dm index 0ea65aa305..ce5cb0d307 100644 --- a/code/modules/resleeving/autoresleever.dm +++ b/code/modules/resleeving/autoresleever.dm @@ -76,6 +76,18 @@ var/client/ghost_client = ghost.client + if(!is_alien_whitelisted(ghost, GLOB.all_species[ghost_client?.prefs?.species]) && !check_rights(R_ADMIN, 0)) // Prevents a ghost ghosting in on a slot and spawning via a resleever with race they're not whitelisted for, getting around normal join restrictions. + to_chat(ghost, "You are not whitelisted to spawn as this species!") + return + + var/datum/species/chosen_species + if(ghost.client.prefs.species) // In case we somehow don't have a species set here. + chosen_species = GLOB.all_species[ghost_client.prefs.species] + + if(chosen_species.flags && NO_SCAN) // Sanity. Prevents species like Xenochimera, Proteans, etc from rejoining the round via resleeve, as they should have their own methods of doing so already, as agreed to when you whitelist as them. + to_chat(ghost, "This species cannot be resleeved!") + return + //Name matching is ugly but mind doesn't persist to look at. var/charjob var/datum/data/record/record_found From 2d25fe7155d13e73a2ea09cf810a46cb9b8a0a64 Mon Sep 17 00:00:00 2001 From: Pandora Date: Sun, 27 Mar 2022 05:00:40 +0100 Subject: [PATCH 10/21] Update syringes.dm --- code/modules/reagents/reagent_containers/syringes.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 3ef20ceeda..c5004a4252 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -8,6 +8,7 @@ /obj/item/weapon/reagent_containers/syringe name = "syringe" desc = "A syringe." + description_fluff = "This could be used to engrave messages on suitable surfaces if you really put your mind to it! Alt-click a floor or wall to engrave with it." //This way it's not a completely hidden, arcane art to engrave. icon = 'icons/obj/syringe.dmi' item_state = "syringe_0" icon_state = "0" From a9df95e5d493e1c9d0c54004f7b90b755026cda7 Mon Sep 17 00:00:00 2001 From: Pandora Date: Sun, 27 Mar 2022 05:14:01 +0100 Subject: [PATCH 11/21] Catslugs can into space (#17) * Update catslug.dm * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload --- .../subtypes/animal/alien animals/catslug.dm | 109 ++++++++++++++++++ icons/mob/alienanimals_x32.dmi | Bin 68411 -> 76025 bytes icons/mob/items/lefthand_holder.dmi | Bin 25339 -> 26446 bytes icons/mob/items/righthand_holder.dmi | Bin 25300 -> 26373 bytes maps/expedition_vr/space/fueldepot.dmm | 30 ++++- 5 files changed, 135 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm index 6864f25f69..286c6dfff0 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm @@ -278,3 +278,112 @@ /obj/item/weapon/holder/catslug/Initialize(mapload, mob/held) . = ..() color = held.color + +/datum/category_item/catalogue/fauna/catslug/spaceslug + name = "Alien Wildlife - Catslug - Miros" + desc = "This catslug serves as the Fuel Depots resident attendant,\ + despite the facility being fully automated and self-serve. - \ + The Catslug is an omnivorous terrestrial creature.\ + Exhibiting properties of both a cat and a slug (hence its name)\ + it moves somewhat awkwardly. However, the unique qualities of\ + its body make it exceedingly flexible and smooth, allowing it to\ + wiggle into and move effectively in even extremely tight spaces.\ + Additionally, it has surprisingly capable hands, and moves quite\ + well on two legs or four. Caution is advised when interacting\ + with these creatures, they are quite intelligent, and proficient\ + tool users." + value = CATALOGUER_REWARD_MEDIUM //Should offer a measure of incentive for people to visit the depot more often. + +/mob/living/simple_mob/vore/alienanimals/catslug/spaceslug + name = "Miros" + desc = "Looks like catslugs can into space after all! This little chap seems to have gotten their mitts on a tiny spacesuit, there's a nametag on it that reads \"Miros\" alongside the Aether Atmospherics logo." + tt_desc = "Mollusca Felis Stellaris" + icon_state = "spaceslug" + icon_living = "spaceslug" + icon_rest = "spaceslug_rest" + icon_dead = "spaceslug_dead" + digestable = 0 + catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/spaceslug) + holder_type = /obj/item/weapon/holder/catslug/spaceslug + makes_dirt = 0 + say_list_type = /datum/say_list/catslug/spaceslug + + minbodytemp = 0 // Shamelessly stolen temp & atmos tolerances from the space cat. + maxbodytemp = 900 + heat_damage_per_tick = 3 + cold_damage_per_tick = 2 + + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + + player_msg = "You are an intelligent creature capable of more than most think, clad in a spacesuit that protects you from the ravages of vacuum and hostile atmospheres alike. You can pick up and use many things, and even carry some of them with you into the vents, which you can use to move around quickly. You're quiet and capable, you speak with your hands and your deeds!
- - - - -
Keep in mind, your goal should generally be to survive. You're expected to follow the same rules as everyone else, so don't go self antagging without permission from the staff team, but you are able and capable of defending yourself from those who would attack you for no reason." + + has_langs = list("Sign Language") + +/datum/say_list/catslug/spaceslug + speak = list("Have any porl?", "What is that?", "What kind of ship is that?", "What are you doing?", "How did you get here?", "Don't take off your helmet.", "SPAAAAAACE!", "WAOW!", "Nice weather we're having, isn't it?") + +/mob/living/simple_mob/vore/alienanimals/catslug/spaceslug/Initialize() + . = ..() + verbs += /mob/living/proc/ventcrawl + verbs += /mob/living/proc/hide //I don't even want to imagine what the colour change proc would do to their sprite, not to mention ghosts would need to be forced into the catslug so this is more just a safety net than anything + +/mob/living/simple_mob/vore/alienanimals/catslug/spaceslug/attack_hand(mob/living/carbon/human/M as mob) + + if(stat == DEAD) + return ..() + if(M.a_intent != I_HELP) + return ..() + playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + if(resting) + M.visible_message("\The [M.name] shakes \the [src] awake from their nap.","You shake \the [src] awake!") + lay_down() + ai_holder.go_wake() + return + if(M.zone_sel.selecting == BP_HEAD) + M.visible_message( \ + "[M] pats \the [src] on their helmet.", \ + "You pat \the [src] on their helmet.", ) + if(client) + return + if(prob(10)) + visible_message("\The [src] purrs and leans into [M]'s hand.") + else if(M.zone_sel.selecting == BP_R_HAND || M.zone_sel.selecting == BP_L_HAND) + M.visible_message( \ + "[M] shakes \the [src]'s hand.", \ + "You shake \the [src]'s hand.", ) + if(client) + return + if(prob(10)) + visible_message("\The [src]'s looks a little confused and bonks their helmet's faceplate against [M]'s hand experimentally, attempting to nibble at it.") + else if(M.zone_sel.selecting == "mouth") + M.visible_message( \ + "[M] attempts to boop \the [src]'s nose, defeated only by the helmet they wear.", \ + "You attempt to boop \the [src] on the nose, stopped only by that helmet they wear.", ) + if(client) + return + if(prob(10)) + visible_message("\The [src]'s eyes widen as they stare at [M]. After a moment they rub at the faint mark [M]'s digit left upon the surface of their helmet's faceplate.") + else if(M.zone_sel.selecting == BP_GROIN) + M.visible_message( \ + "[M] rubs \the [src]'s tummy...", \ + "You rub \the [src]'s tummy, accidently pressing a few of the buttons on their chestpiece in the process... You feel the danger.", ) + if(client) + return + visible_message("\The [src] pushes [M]'s hand away from their tummy and furrows their brow, frantically pressing at the buttons [M] so carelessly pushed!") + if(prob(5)) + ai_holder.target = M + ai_holder.track_target_position() + ai_holder.set_stance(STANCE_FIGHT) + else + return ..() + +/obj/item/weapon/holder/catslug/spaceslug + item_state = "spaceslug" + diff --git a/icons/mob/alienanimals_x32.dmi b/icons/mob/alienanimals_x32.dmi index b187ad58735a88b02d9f47a7790beb73c63d6892..05b70ba65718d2a44eb0645fb24a402961f15e75 100644 GIT binary patch delta 26227 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 delta 18553 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 diff --git a/icons/mob/items/lefthand_holder.dmi b/icons/mob/items/lefthand_holder.dmi index aa7e7807cca3002c66a50c4247fc6e12792bd91e..56c51d0f5c48fffb9f95ed1f9daea9a9993b9b37 100644 GIT binary patch delta 5557 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 Ctt*27 delta 4548 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 Date: Sun, 27 Mar 2022 14:17:41 +1000 Subject: [PATCH 12/21] Reworks xenobio extract rewards --- code/_helpers/global_lists_vr.dm | 249 +++ code/game/objects/items/devices/flashlight.dm | 27 - .../ai/ai_holder_subtypes/slime_xenobio_ai.dm | 21 +- .../subtypes/slime/xenobio/subtypes.dm | 3 +- .../subtypes/slime/xenobio/xenobio.dm | 33 +- .../reagents/reactions/instant/instant_vr.dm | 237 +-- code/modules/xenobio/items/extracts.dm | 2 + code/modules/xenobio/items/extracts_vr.dm | 1648 +++++++++++++++++ code/modules/xenobio/items/slime_objects.dm | 96 +- code/modules/xenobio/items/slimepotions.dm | 8 +- code/modules/xenobio/items/slimepotions_vr.dm | 190 ++ icons/inventory/back/item.dmi | Bin 26764 -> 27719 bytes icons/inventory/back/mob.dmi | Bin 125953 -> 126716 bytes icons/mob/slimes_vr.dmi | Bin 0 -> 480 bytes vorestation.dme | 3 +- 15 files changed, 2241 insertions(+), 276 deletions(-) create mode 100644 code/modules/xenobio/items/extracts_vr.dm create mode 100644 code/modules/xenobio/items/slimepotions_vr.dm create mode 100644 icons/mob/slimes_vr.dmi diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index 455732fa7c..9373bc342c 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 3b20ccbb5c..f0ff01c05a 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -486,30 +486,3 @@ light_range = 8 light_power = 0.1 light_color = "#49F37C" - -/* - * Slime Extract - */ - -/obj/item/device/flashlight/slime - gender = PLURAL - name = "glowing slime extract" - desc = "A slimy ball that appears to be glowing from bioluminesence." - icon = 'icons/obj/lighting.dmi' - icon_state = "floor1" //not a slime extract sprite but... something close enough! - item_state = "slime" - light_color = "#FFF423" - w_class = ITEMSIZE_TINY - light_range = 6 - on = 1 //Bio-luminesence has one setting, on. - power_use = 0 - -/obj/item/device/flashlight/slime/New() - ..() - set_light(light_range, light_power, light_color) - -/obj/item/device/flashlight/slime/update_brightness() - return - -/obj/item/device/flashlight/slime/attack_self(mob/user) - return //Bio-luminescence does not toggle. diff --git a/code/modules/ai/ai_holder_subtypes/slime_xenobio_ai.dm b/code/modules/ai/ai_holder_subtypes/slime_xenobio_ai.dm index 563c9953e6..bc4f9303e3 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 72d32abb8c..ed1e3fb8be 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 dd22ad7fd0..a5782f880c 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 c9b3ad1dc7..bbc18fa322 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 dacebb203c..188c8874c2 100644 --- a/code/modules/xenobio/items/extracts.dm +++ b/code/modules/xenobio/items/extracts.dm @@ -1,3 +1,5 @@ +//VOREStation Note - we use different xenobio balance in extracts_vr, keep this unticked. + // Base /obj/item/slime_extract name = "slime extract" diff --git a/code/modules/xenobio/items/extracts_vr.dm b/code/modules/xenobio/items/extracts_vr.dm new file mode 100644 index 0000000000..239da38896 --- /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 9a945e0058..72cc0e01e3 100644 --- a/code/modules/xenobio/items/slime_objects.dm +++ b/code/modules/xenobio/items/slime_objects.dm @@ -67,7 +67,6 @@ qdel(src) - // More or less functionally identical to the telecrystal tele. /obj/item/slime_crystal name = "lesser slime cystal" @@ -101,6 +100,7 @@ safe_blink(AM, 14) qdel(src) + /obj/item/weapon/disposable_teleporter/slime name = "greater slime crystal" desc = "A larger, gooier crystal." @@ -112,7 +112,6 @@ origin_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 4) - // Very filling food. /obj/item/weapon/reagent_containers/food/snacks/slime name = "slimy clump" @@ -125,4 +124,95 @@ /obj/item/weapon/reagent_containers/food/snacks/slime/Initialize() . = ..() - bitesize = 5 \ No newline at end of file + bitesize = 5 + + +//Flashlight + +/obj/item/device/flashlight/slime + gender = PLURAL + name = "glowing slime extract" + desc = "A slimy ball that appears to be glowing from bioluminesence." + icon = 'icons/obj/lighting.dmi' + icon_state = "floor1" //not a slime extract sprite but... something close enough! + item_state = "slime" + light_color = "#FFF423" + w_class = ITEMSIZE_TINY + light_range = 6 + on = 1 //Bio-luminesence has one setting, on. + power_use = 0 + +/obj/item/device/flashlight/slime/New() + ..() + set_light(light_range, light_power, light_color) + +/obj/item/device/flashlight/slime/update_brightness() + return + +/obj/item/device/flashlight/slime/attack_self(mob/user) + return //Bio-luminescence does not toggle. + + +//Radiation Emitter + +/obj/item/slime_irradiator + name = "glowing slime extract" + desc = "A slimy ball that appears to be glowing from bioluminesence." + icon = 'icons/mob/slimes_vr.dmi' + icon_state = "irradiator" + light_color = "#00FF00" + light_power = 0.4 + light_range = 2 + w_class = ITEMSIZE_TINY + +/obj/item/slime_irradiator/New() + START_PROCESSING(SSobj, src) + set_light(light_range, light_power, light_color) + return ..() + +/obj/item/slime_irradiator/process() + SSradiation.radiate(src, 5) + +/obj/item/slime_irradiator/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + + +//BS Pouch +/obj/item/weapon/storage/backpack/holding/slime + name = "bluespace slime pouch" + desc = "A slimy pouch that opens into a localized pocket of bluespace." + icon_state = "slimepouch" + + + +//Slime Chems + +/datum/reagent/myelamine/slime + name = "Agent A" + id = "slime_bleed_fixer" + description = "A slimy liquid which appears to rapidly clot internal hemorrhages by increasing the effectiveness of platelets at low quantities. Toxic in high quantities." + taste_description = "slime" + overdose = 5 + +/datum/reagent/osteodaxon/slime + name = "Agent B" + id = "slime_bone_fixer" + description = "A slimy liquid which can be used to heal bone fractures at low quantities. Toxic in high quantities." + taste_description = "slime" + overdose = 5 + +/datum/reagent/peridaxon/slime + name = "Agent C" + id = "slime_organ_fixer" + description = "A slimy liquid which is used to encourage recovery of internal organs and nervous systems in low quantities. Toxic in high quantities." + taste_description = "slime" + overdose = 5 + +/datum/reagent/nutriment/glucose/slime + name = "Slime Goop" + id = "slime_goop" + description = "A slimy liquid, with very compelling smell. Extremely nutritious." + color = "#FABA3A" + nutriment_factor = 30 + taste_description = "slimy nectar" \ No newline at end of file diff --git a/code/modules/xenobio/items/slimepotions.dm b/code/modules/xenobio/items/slimepotions.dm index 2a600fb801..11d2d07571 100644 --- a/code/modules/xenobio/items/slimepotions.dm +++ b/code/modules/xenobio/items/slimepotions.dm @@ -11,7 +11,7 @@ /obj/item/slimepotion/enhancer name = "extract enhancer agent" desc = "A potent chemical mix that will give a slime extract an additional two uses." - icon_state = "potpurple" + icon_state = "potcyan" description_info = "This will even work on inert slime extracts, if it wasn't enhanced before. Extracts enhanced cannot be enhanced again." // Makes slimes less likely to mutate. @@ -64,7 +64,7 @@ // Makes the slime friendly forever. /obj/item/slimepotion/docility - name = "docility agent" + name = "slime docility agent" desc = "A potent chemical mix that nullifies a slime's hunger, causing it to become docile and tame. It might also work on other creatures?" icon_state = "potlightpink" description_info = "The target needs to be alive, not already passive, and be an animal or slime type entity." @@ -178,7 +178,7 @@ desc = "A potent chemical mix that makes an animal deeply loyal to the species of whoever applies this, and will attack threats to them." description_info = "The slime or other animal needs to be alive for this to work. The slime this is applied to will have their 'faction' change to \ the user's faction, which means the slime will attack things that are hostile to the user's faction, such as carp, spiders, and other slimes." - icon_state = "potred" + icon_state = "potlightpink" /obj/item/slimepotion/loyalty/attack(mob/living/simple_mob/M, mob/user) if(!istype(M)) @@ -247,7 +247,7 @@ name = "slime feeding agent" desc = "A potent chemical mix that will instantly sediate the slime." description_info = "The slime needs to be alive for this to work. It will instantly grow the slime enough to reproduce." - icon_state = "potyellow" + icon_state = "potorange" /obj/item/slimepotion/feeding/attack(mob/living/simple_mob/slime/xenobio/M, mob/user) if(!istype(M)) diff --git a/code/modules/xenobio/items/slimepotions_vr.dm b/code/modules/xenobio/items/slimepotions_vr.dm new file mode 100644 index 0000000000..efd1bdc9e9 --- /dev/null +++ b/code/modules/xenobio/items/slimepotions_vr.dm @@ -0,0 +1,190 @@ +/obj/item/slimepotion/attackby(obj/item/O, mob/user) + if(istype(O, /obj/item/slimepotion/mimic)) + to_chat(user, "You apply the mimic to the slime potion as it copies it's effects.") + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + var/newtype = src.type + new newtype(get_turf(src)) + qdel(O) + ..() + + +/obj/item/slimepotion/infertility + name = "slime infertility agent" + desc = "A potent chemical mix that will reduce the amount of offspring this slime will have." + icon_state = "potpurple" + description_info = "The slime needs to be alive for this to work. It will reduce the amount of slime babies by 2 (to minimum of 2)." + +/obj/item/slimepotion/infertility/attack(mob/living/simple_mob/slime/xenobio/M, mob/user) + if(!istype(M)) + to_chat(user, "The agent only works on slimes!") + return ..() + if(M.stat == DEAD) + to_chat(user, "The slime is dead!") + return ..() + if(M.split_amount <= 2) + to_chat(user, "The slime cannot get any less fertile!") + return ..() + + to_chat(user, "You feed the slime the infertility agent. It will now have less offspring.") + M.split_amount = between(2, M.split_amount - 2, 6) + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + qdel(src) + +/obj/item/slimepotion/fertility + name = "slime fertility agent" + desc = "A potent chemical mix that will increase the amount of offspring this slime will have." + icon_state = "potpurple" + description_info = "The slime needs to be alive for this to work. It will increase the amount of slime babies by 2 (to maximum of 6)." + +/obj/item/slimepotion/fertility/attack(mob/living/simple_mob/slime/xenobio/M, mob/user) + if(!istype(M)) + to_chat(user, "The agent only works on slimes!") + return ..() + if(M.stat == DEAD) + to_chat(user, "The slime is dead!") + return ..() + if(M.split_amount >= 6) + to_chat(user, "The slime cannot get any more fertile!") + return ..() + + to_chat(user, "You feed the slime the infertility agent. It will now have less offspring.") + M.split_amount = between(2, M.split_amount + 2, 6) + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + qdel(src) + +/obj/item/slimepotion/shrink + name = "slime shrinking agent" + desc = "A potent chemical mix that will turn adult slime into a baby one." + icon_state = "potpurple" + description_info = "The slime needs to be alive for this to work." + +/obj/item/slimepotion/shrink/attack(mob/living/simple_mob/slime/xenobio/M, mob/user) + if(!istype(M)) + to_chat(user, "The agent only works on slimes!") + return ..() + if(M.stat == DEAD) + to_chat(user, "The slime is dead!") + return ..() + if(!(M.is_adult)) + to_chat(user, "The slime is already a baby!") + return ..() + + to_chat(user, "You feed the slime the shrinking agent. It is now back to being a baby.") + M.make_baby() + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + qdel(src) + +/obj/item/slimepotion/death + name = "slime death agent" + desc = "A potent chemical mix that will instantly kill a slime." + icon_state = "potblue" + description_info = "The slime needs to be alive for this to work." + +/obj/item/slimepotion/death/attack(mob/living/simple_mob/slime/xenobio/M, mob/user) + if(!istype(M)) + to_chat(user, "The agent only works on slimes!") + return ..() + if(M.stat == DEAD) + to_chat(user, "The slime is already dead!") + return ..() + + to_chat(user, "You feed the slime the death agent. Its face flashes pain of betrayal before it goes still.") + M.adjustToxLoss(500) + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + qdel(src) + +/obj/item/slimepotion/ferality + name = "slime ferality agent" + desc = "A potent chemical mix that will make a slime untamable." + icon_state = "potred" + description_info = "The slime needs to be alive for this to work." + +/obj/item/slimepotion/ferality/attack(mob/living/simple_mob/slime/xenobio/M, mob/user) + if(!istype(M)) + to_chat(user, "The agent only works on slimes!") + return ..() + if(M.stat == DEAD) + to_chat(user, "The slime is already dead!") + return ..() + if(M.untamable && M.untamable_inheirit) + to_chat(user, "The slime is already untamable!") + return ..() + + to_chat(user, "You feed the slime the death agent. It will now only get angrier at taming attempts.") + M.untamable = TRUE + M.untamable_inheirit = TRUE + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + qdel(src) + +/obj/item/slimepotion/reinvigoration + name = "extract reinvigoration agent" + desc = "A potent chemical mix that will create a slime of appropriate type out of an extract." + icon_state = "potcyan" + description_info = "This will even work on inert extracts. Extract is destroyed in process." + +/obj/item/slimepotion/mimic + name = "mimic agent" + desc = "A potent chemical mix that will mimic effects of other slime-produced agents." + icon_state = "potsilver" + description_info = "Warning: avoid combining multiple doses of mimic agent." + +/obj/item/slimepotion/mimic/attackby(obj/item/O, mob/user) + if(istype(O, /obj/item/slimepotion/mimic)) + to_chat(user, "You apply the mimic to the mimic, resulting a mimic that copies a mimic that copies a mimic that copies a mimic that-") + var/location = get_turf(src) + playsound(location, 'sound/weapons/gauss_shoot.ogg', 50, 1) + var/datum/effect/effect/system/grav_pull/s = new /datum/effect/effect/system/grav_pull + s.set_up(3, 3, location) + s.start() + qdel(O) + qdel(src) + return + ..() + +/obj/item/slimepotion/sentience + name = "slime loyalty agent" + desc = "A potent chemical mix that makes an animal deeply loyal to the species of whoever applies this, and will attack threats to them." + description_info = "The slime or other animal needs to be alive for this to work. The slime this is applied to will have their 'faction' change to \ + the user's faction, which means the slime will attack things that are hostile to the user's faction, such as carp, spiders, and other slimes." + icon_state = "potblue" + +/obj/item/slimepotion/sentience/attack(mob/living/simple_mob/M, mob/user) + if(!istype(M)) + to_chat(user, "The agent only works on creatures!") + return ..() + if(M.stat == DEAD) + to_chat(user, "The creature is dead!") + return ..() + if(M.ghostjoin) + to_chat(user, "The creature is already developing sentience.") + return ..() + if(M.ckey) + to_chat(user, "The creature is already sentient!") + return ..() + + to_chat(user, "You feed \the [M] the agent. It may now eventually develop proper sentience.") + M.ghostjoin = 1 + active_ghost_pods |= M + M.ghostjoin_icon() + log_and_message_admins("[key_name_admin(user)] used a sentience potion on a simple mob: [M]. [ADMIN_FLW(src)]") + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + qdel(src) + +/obj/item/slimepotion/obedience + name = "slime obedience agent" + desc = "A potent chemical mix that makes slime extremely obedient." + icon_state = "potlightpink" + description_info = "The target needs to be alive and currently misbehaving. Effect is equivalent to very strong discipline." + +/obj/item/slimepotion/obedience/attack(mob/living/simple_mob/slime/xenobio/M, mob/user) + if(!istype(M)) + to_chat(user, "The agent only works on slimes!") + return ..() + if(M.stat == DEAD) + to_chat(user, "The slime is dead!") + return ..() + + to_chat(user, "You feed the slime the agent. It has been disciplined, for better or worse...") + M.adjust_discipline(10) + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + qdel(src) \ No newline at end of file diff --git a/icons/inventory/back/item.dmi b/icons/inventory/back/item.dmi index daa2c464499689ecb36a3c214fbd5c0c908d2d7b..230b3950c8af1f67b66b88151ce42f231c7a177a 100644 GIT binary patch delta 5830 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 delta 4867 zcmaiXcT^K?@a_VEp!BYS5I`w{g7naPQ3!|%Nbg0EB1LK05PC-`f(R&xz(DGNC`z+5P}jw0^I%Xx##}*`|a5?XWz4D-hjGKbx>3et58 zbb0LMALQld3jj}FW#@GG&PucD4o_IJ_T3i~YN87xmHL|B!2nciMbNt`)Zc4v_+ z?4$LuZwMyT^JW99#Dw8Z{MPVti}L5ol@dlPi{ti@$9v|Fe0}cX$eUY@Gk?15ihjPx z4H9awG&LRX`JmfiY0`iMlleW-rvPfkR{zlr>8bfJRLnBX1BDp^H8~{7s9Bez&$x3V zP2z7$HfC8=k&B2-Alp%CpkzK#f8h{HU)E1I3XEE;Y878!ZBNV0p^nY7z4qF!x!O`7 zSVpZn-<>dn@@!pVba^)%6ct+syPP=~%{`#BvcMP}LK!n`Pt5~+=%hw>9X+Tv_Xk}p z&Xh{o%kVepf9@&K8PRqq|E8_D$*{yWiq2UD@<5OHG9@-{K0 z!NU#_5;-Ja`Hb*0Psh`KcH8ycV)Mgp^`#a%1Bu_X;<;CIg=LtI1sPDxA2+5pBItfT z?3sCbki)PM<&y_$vV0A*;ie5UKBDpD;NcHm#q#7LcwBQoN2%QU`d9aQdG=y$a9@M_ z^F!d&{*fdy(lUH}%%nB4BL7pxll>6OoztpOxX1L9bg9XfwijNT?|e@)quo`Fnls{W z>@6>+M!u`}95rocso;q0HhezzQkrqb2H{h2g=EA|G=4tD`+R4L%*A-FV@veUuAPQ21ZhlllK?2fpXd-giP@?8sl4^(x-Ilu2!ri-IX<|Ldt}RxPxxaKAoTE|0s%=$8Ei z6`b zEP1=)ZW#9BOJ3H&u(fU zd0fQ=G)Fpi^1c*?9tYJA{(bJFK?ygEJJ~s(nwpBW$Km_4CCY4FgcOyO5^8EH*3z=G zv)`1K>P@`a{V!%uZN)ixE;4>5Pcdi7KoB1(t$mFR&b_rPj_f2`Y_Qd#jpL={_kv(qBE&hze zIe+^4l9XGJ)7%4z{(*t-BO};d!S@5J+BP=4jeZMh5|%Z+BG?M{_M|;E?cEM)Nt=S? zI|qtTeruCcTj5OxuU|b8*k?)<(B@2@nE|bxNK4)RN_@75xfgCZfcxW?<^TNi{5~)p zSb%~T4a2i<$(Qm=Jo#uVeJM47VKGa!oo85_b|NoVl$0B)1`cI}X?K*JmmYf(l`Nq0 zC9PHT@E+C9SZxCSOVA-+R|;BjpKf-&n(-)B9D735KM{qj6JV~x`CQIzII)r@fl$HR zjX5*K4QL%oA52Qgzb2GSlFapaHrvi%%mV6zxQ52Y;)Vt;MZfu&fz{5%#n-mq43S)` z;W4j#_+_FBe-7o_*5Z{5>Ew{HdaH4I!tRVe*Wk(d@R> znVRNJ52J>%h2EN2wCwNigXeLR4AA{zpt}_f84$Pw*xlgyY%c{msJ4Mg@Tcz=5HLk$ z!d!S^IJ@L){^8L4kxzqxciNr+{oY4Pmg@=AVjqgEkImnD*c+N&P1bvAw{bH)(d_PB z;VPRZ=CD?NCMKqJO1hNOOd||bh)flDazi&X6p2~aaU|O#!MG0Z$r`R6JpS2>7x4rF zAt89Gp{h#q51HJ*Mw`9E#=Yw0|M#10lCVKKy`ILHV=waJvTYU)djhH{{ce#>T9y)E zi;GkH5Ef;Ok~k2le&!SDY1uj42;J zbOnObE?1`f&3vglfHXcep%u?H9b_Txz$Y%sOlu1YS}yl~7sl?*VyZ$)mly!NgSrr~ zSgfcla^5sfM))mC?}%UP2HU-gdxBr>A#h8+_by{XS}s3qxP(zMM#YFzi}j41e~sP& zLcnb`DM`LU<1)v1#@j3i_n2^T-zNBfBT0HkXIdHHODWNE)hH!L8Ig{c{cuYjcyv;} zqM!5EI3|DP0<&w`hfB#)X5MnnS{A6TAl_<=XzLQTj~u~@K2y@dY_9zCs{=1;-3GXo z_?Ry+(xK-F{+hVSKvP_OJtyV@JWCza-(y~O+n#CA_VdFPmzNs?UDNZs7aijkc8Y2X ztX#!p7ccI)m=MgZW_K1X&Uh#@<#?8XzuC=Cj+y@?3pG7bfMKbmhh;=p{wpSF36ZbwY=4KX)=MbG$HN`b?Z!3F^h<_X3!5u*OGhH6*-C zCsAdl)-}{AfoEiNj`wjv>&}*6hf2|f%5Zh}=w9^0ZP`~SQH7n}4)79g`P>RMFj4g& z+NQ~ur0kP$y?~x~vju3L&1i7czi7c1B6>iaPvtLRQ&Ur0T2LnSPDO06?`~F#UBBKf zS`@+lI5m_hF^rbL$;EXJeDL5w@8Dq9?ymHKLZ_3CE1AD#?nW~F-oh?C_QIqM;C+1A zlN-%aBFt}J^PoJg;e;8`{6&zedzM+@AqC*s>n;9p$N$i~ISfC33@iyQm=EK96iT*D zCv{|~$968a7f&7t9|rKE3RM$jJ%+A0%Lp~-3!hfE@VX)I9&CGFJmGFh)z5{)19s-s zBCa82o(mRefjQCL$vg)80FRV?ila30VqT^Yy{njf^ZuW;=JSi>(W2!QbtEk$&Yg`fP0zL}7P|7%ux@iEhMD&*wnt$i; zL*%FJe$c_v!0_KtqF3LZ_Mf17gVwFOX@f@2+Z535?(+RwsHYpG+`he(Z$_W|&DtXp zeE>=LU1PnyUurC?I20g2V~Mjbs5Rj}bJ3YHT*CJUe(i7colCN72_aNB&1>Jj&A`*H zIA6nIkBkr_r1d$2d3kwIbKL1>VfAAj5&ZDV9w9BR8?A%RqO1liN*To9NlJ8TXt6c$ zssZI~V^m*6yCwnyjVl17-^Tbb6-B<{ncPiXZIL`QgtG6^&4|^pLKWXC#m@P{5k0W{ zmoH;(zqoO=kd6j0JzF`~ZSd{e=ifK|qSZdMoSH4r9-0m=7u>N<5AIBVna?p_5JN1R zK&z&trjpjGn0&m10Ci5|td}n@y{Q7L7?Ws2tr~qU4!X~?5` z3Y{%1xTjVU`Q+>)EWz(jNp{_k7=k3ig~xvpb{B>0EHM-_jiEe4*X?K`6h_z6^tZojw?=-*Bmd)t;W#9qEuz`nnlAC065sb> zQTM3e3$JXWxQX3GUS5X0qwLPl#ubV)KYpbA{OR6od*c^Kb^ah;N3}DLRlE@olX?)) z=J{V(B1_9b(z--OZp;3N z6Do@6&&0xBc~Xslu4fn>!$fjd9;iib;~;x`dvlrafKtF>D8`sRx?|CmAHf>Xcz{|+ z%}@o~wP&4HOVBtU1>wPio&Lhk;0P@S?@Gpw?O-ZUl1)xWd1Lw49!O6SiHXdb- z6HbS-1!^F%8sfJc(rsyqfT5zk{X?WG!Z@ zwkmsN5-)nZaQRr};KZ6LLFhudzX{&kV1V|nk&*Te+b4oz3O|f$PS@dBtv=V z=O;=y=8cDC7}8fi}e^veFw^NXxBiVCyDE4kVMqODd^;Bx7Zz2v zTmW|K9t~Yq(dK`EtmGa3RZU{`J)5d^VcV+RbDbR?9$s65C#1)wC$09qH)Yk`Gkkir z*A4)scBZ1R)FkObES8%1qn5_c{)=SbXmMTO8p>AyprfPvIjErXun3XRX0pVt*?6uL z3Yh$y-S%U|#bLjhm=-`;MTLZhjvg6I5RNahxIgkL^rG{3^Ogusji%mF=Y)d0I5oW_ zlY@O5teFZ>@f1pgQUR*jwkE@y5h+5=A94)A_e^=|5_Mgm;zfHLkABHBd>JzH4!99tv+;A|ap$>UA6;&(PpE?{Rj56xhn0OTsh&v=(BQ z1qJ7}IbhFh-*L6~_uq=0-Hz*XO$rs02hdL&`dqQI+xl*9t5xn!qjTz7tbMT|(SlGh zCW>P$D!B>@GAsF~k{F^pfNBfKw!65b3=Ius7-6R~ev!{%4f)Si!>BOD#X5O#skkq=(Y2(RRfCA3E|ujsO4v diff --git a/icons/inventory/back/mob.dmi b/icons/inventory/back/mob.dmi index 755a2d75d428701539347a81d0b2164a58b424f1..3f11cc9dc1a78e5cdc41928dcb226fa0526a99cf 100644 GIT binary patch delta 18262 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 delta 17501 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 W|B;^Vv6D~$0000 Date: Sun, 27 Mar 2022 15:21:45 +1000 Subject: [PATCH 13/21] Adjust descriptions of extract and adds admin logging to some of reactions. --- code/modules/xenobio/items/extracts_vr.dm | 95 +++++++++++++---------- 1 file changed, 54 insertions(+), 41 deletions(-) diff --git a/code/modules/xenobio/items/extracts_vr.dm b/code/modules/xenobio/items/extracts_vr.dm index 239da38896..9133414832 100644 --- a/code/modules/xenobio/items/extracts_vr.dm +++ b/code/modules/xenobio/items/extracts_vr.dm @@ -71,7 +71,8 @@ /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." + description_info = "When injected with phoron, this extract creates a grey slime. When injected with blood, this extract creates some monkey cubes. \ + When injected with water, this extract creates some slime jelly." slime_type = /mob/living/simple_mob/slime/xenobio @@ -118,8 +119,8 @@ /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." + description_info = "When injected with phoron, this extract creates some basic construction materials. When injected with blood, this extract creates some advanced construction materials. \ + When injected with water, this extract creates some unorthodox materials. When injected with slime jelly, this extract creates some steel." slime_type = /mob/living/simple_mob/slime/xenobio/metal @@ -184,9 +185,8 @@ /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." + description_info = "When injected with phoron, this extract creates some frost oil. When injected with blood, this extract creates stability agent that can reduce slime's mutation chance. \ + When injected with water, this extract creates a clamness wave that calms enraged slimes. When injected with slime jelly, this extract creates some cryotoxin." slime_type = /mob/living/simple_mob/slime/xenobio/blue @@ -259,8 +259,9 @@ /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." + description_info = "When injected with phoron, this extract creates steroid agent, which can be used to increase amount of extracts in a slime. When injected with blood, this extract creates \ + infertility agent, which can be used to decrease amount of slime's offspring. When injected with water, this extract creates shrink agent, which can be used to turn an adult slime into a baby. \ + When injected with slime jelly, this extract creates a fertility agent, which can be used to increase amount of slime's offspring." slime_type = /mob/living/simple_mob/slime/xenobio/purple @@ -318,7 +319,8 @@ /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." + description_info = "When injected with phoron, this extract creates a phoron fire. When injected with blood, this extract creates a heat wave. When injected with water, this extract creates \ + some smoke. When injected with slime jelly, this extract creates some pyrotoxin." slime_type = /mob/living/simple_mob/slime/xenobio/orange @@ -438,8 +440,8 @@ /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." + description_info = "When injected with phoron, this extract creates a lightning strike. When injected with blood, this extract creates a slime flashlight. When injected with water \ + this extract creates an EMP puls. When injected with slime jelly, this extract creates a self-charging slime battery." slime_type = /mob/living/simple_mob/slime/xenobio/yellow @@ -508,7 +510,8 @@ /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." + description_info = "When injected with phoron, this extract creates a random hostile creature. When injected with blood, this extract creates three random createres. \ + When injected with water, this extract creates a random passive creature. When injected with slime jelly, this extract creates some gold." slime_type = /mob/living/simple_mob/slime/xenobio/gold @@ -520,6 +523,7 @@ required = /obj/item/slime_extract/gold /decl/chemical_reaction/instant/slime/gold_hostile_mob/on_reaction(var/datum/reagents/holder) + log_and_message_admins("Gold extract reaction (dangerous mob) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") var/type_to_spawn = pickweight(xenobio_gold_mobs_hostile) var/mob/living/C = new type_to_spawn(get_turf(holder.my_atom)) for(var/l = 1, l <= rand(1, 3), l++) @@ -535,6 +539,7 @@ required = /obj/item/slime_extract/gold /decl/chemical_reaction/instant/slime/gold_random_mobs/on_reaction(var/datum/reagents/holder) + log_and_message_admins("Gold extract reaction (random mobs) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") var/type_to_spawn var/list/all_spawnable_types = list() all_spawnable_types += xenobio_gold_mobs_safe @@ -589,7 +594,8 @@ /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." + description_info = "When injected with phoron, this extract creates some basic science materials. When injected with blood, this extract creates some advanced science materials. When injected \ + with water, this extract creates some completely random materials. When injected with slime jelly, this extract creates some silver." slime_type = /mob/living/simple_mob/slime/xenobio/silver @@ -663,7 +669,7 @@ /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." + description_info = "When injected with water, this extract creates some phoron. When injected with slime jelly, this extract creates some blood." slime_type = /mob/living/simple_mob/slime/xenobio/dark_purple @@ -691,9 +697,8 @@ /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." + description_info = "When injected with phoron, this extract creates a cold wave. When injected with blood, this extract grants ability to resist temperature for a while. \ + When injected with water, the water freezes. When injected with slime jelly, this extract creates a death agent, which can be used to instantly kill a slime." slime_type = /mob/living/simple_mob/slime/xenobio/dark_blue @@ -820,9 +825,9 @@ /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." + description_info = "When injected with phoron, this extract creates a mutation agent, that can be used to increase a slime's mutation chance. When injected with blood, this extract causes \ + nearby slimes to fall into rage. When injected with water, this extract creates some hot sauce. When injected with slime jelly, this extract creates a ferality agent, which makes slimes \ + unreceptive to discipline." slime_type = /mob/living/simple_mob/slime/xenobio/red @@ -900,7 +905,8 @@ /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." + description_info = "When injected with phoron, this extract creates a single radioactive pulse. When injected with blood, this extract creates a radioactive glob. When injected with water \ + this extract creates some radium. When injected with slime jelly, this extract creates some uranium." slime_type = /mob/living/simple_mob/slime/xenobio/green @@ -912,6 +918,7 @@ required = /obj/item/slime_extract/green /decl/chemical_reaction/instant/slime/green_radpulse/on_reaction(var/datum/reagents/holder) + log_and_message_admins("Green extract reaction (radiation pulse) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1) holder.my_atom.visible_message("\The [holder.my_atom] begins to vibrate violently!") spawn(5 SECONDS) @@ -927,6 +934,7 @@ required = /obj/item/slime_extract/green /decl/chemical_reaction/instant/slime/green_emitter/on_reaction(var/datum/reagents/holder) + log_and_message_admins("Green extract reaction (radiation emitter) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") new /obj/item/slime_irradiator(get_turf(holder.my_atom)) ..() @@ -958,8 +966,8 @@ /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." + description_info = "When injected with phoron, this extract creates some bone fixing agent. When injected with blood, this extract creates some clotting agent. When injected with water, this \ + extract creates some organ healing agent. When injected with slime jelly, this extract creates a powerful regenerative wave." slime_type = /mob/living/simple_mob/slime/xenobio/pink @@ -1016,8 +1024,8 @@ /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." + description_info = "When injected with phoron, this extract creates some fuel. When injected with blood, this extract creates some cooking oil. When injected with water, this extract \ + creates a fake explosion sound. When injected with slime jelly, this extract explodes." slime_type = /mob/living/simple_mob/slime/xenobio/oil @@ -1085,9 +1093,8 @@ /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." + description_info = "When injected with phoron, this extract creates some bluespace crystals. When injected with blood, this extract creates a bluespace bag. When injected with water, this \ + extract causes random teleportation. When injected with slime jelly, this extract creates a disposable precise teleportation tool." slime_type = /mob/living/simple_mob/slime/xenobio/bluespace @@ -1124,6 +1131,7 @@ required = /obj/item/slime_extract/bluespace /decl/chemical_reaction/instant/slime/bluespace_chaotic_tele/on_reaction(var/datum/reagents/holder) + log_and_message_admins("Bluespace extract reaction (chaos teleport) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") for(var/mob/living/M in range(2,get_turf(holder.my_atom))) if(M.buckled) M.buckled.unbuckle_mob() @@ -1158,8 +1166,9 @@ /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." + description_info = "When injected with phoron, this extract creates an enhancer agent, which can be used to increase amount of uses any extract has once. When injected with blood, this extact \ + creates an invigoration agent, which can be used to create a slime out of an extract. When injected with water, this extract creates a mimic agent, which can copy properties of other agents. \ + When injected with slime jelly, this extract creates a random agent." slime_type = /mob/living/simple_mob/slime/xenobio/cerulean @@ -1218,8 +1227,8 @@ /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." + description_info = "When injected with phoron, this extract creates a feeding agent, which can be used to instantly split a slime. When injected with blood, this extract creates some food. \ + When injected with water, this extract creates some edible slime globs. When injected with slime jelly, this extract creates some super-nutritious slime goop." slime_type = /mob/living/simple_mob/slime/xenobio/amber @@ -1286,7 +1295,9 @@ /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." + description_info = "When injected with phoron, this extract creates a promethean cube, which can be used to create a new promethean. When injected with blood, this extract creates some mutation \ + toxin. When injected with water, this extract creates some plushies. When injected with slime jelly, this extract creates a sentience agent, which can be used to develop sentience in \ + various creatures." slime_type = /mob/living/simple_mob/slime/xenobio/sapphire @@ -1347,8 +1358,8 @@ /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." + description_info = "When injected with phoron, this extract grants extra strength for a time. When injected with blood, this extract causes a wave of pulling force. When injected with water, \ + this extract creates some brute juice. When injected with slime jelly, this extract creates a pushing force." slime_type = /mob/living/simple_mob/slime/xenobio/ruby /decl/chemical_reaction/instant/slime/ruby_swole @@ -1435,7 +1446,8 @@ /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." + description_info = "When injected with phoron, this extract grants extra agility, making you more evasive and fast-acting for a while. When injected with blood, this extract grants extra speed \ + for a short time. When injected with water, this extract creates some hyperzine. When injected with slime jelly, this extract causes area around to become slippery for a time." slime_type = /mob/living/simple_mob/slime/xenobio/emerald @@ -1506,6 +1518,7 @@ required = /obj/item/slime_extract/emerald /decl/chemical_reaction/instant/slime/emerald_hell/on_reaction(var/datum/reagents/holder) + log_and_message_admins("Emerald extract reaction (slip hell) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") for(var/turf/simulated/T in trange(5, get_turf(holder.my_atom))) if(!istype(T)) continue @@ -1520,9 +1533,9 @@ /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." + description_info = "When injected with phoron, this extract creates a friendship agent, which can be used to make a slime or a creature consider you a friend. When injected with blood, \ + this extract creates a loyalty agent, which can be used to make a slime or a creature think of those like you as their own. When injected with water, this extract creates a docility agent, \ + which can be used to pacify a slime or a creature permanently. When injected with slime jelly, this extract creates an obedience agent, which can be used to instantly fully discipline a slime." slime_type = /mob/living/simple_mob/slime/xenobio/light_pink @@ -1581,8 +1594,8 @@ /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." + description_info = "When injected with phoron, this extract will create a random slime. When injected with blood, this extract will create a random slime extract. When injected with water, \ + this extract with create pretty colors. When injected with slime jelly, this extract will create unity agent, which can be used to make slime non-hostile to slimes of other colors." slime_type = /mob/living/simple_mob/slime/xenobio/rainbow From c230fe12ef9e07ee8f0441adbaea05b46b6a4ec7 Mon Sep 17 00:00:00 2001 From: Rykka Date: Sat, 26 Mar 2022 23:36:36 -0600 Subject: [PATCH 14/21] Requested Changes, disables the NO_SCAN check. --- code/modules/resleeving/autoresleever.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/resleeving/autoresleever.dm b/code/modules/resleeving/autoresleever.dm index ce5cb0d307..3b71aae2a8 100644 --- a/code/modules/resleeving/autoresleever.dm +++ b/code/modules/resleeving/autoresleever.dm @@ -80,6 +80,7 @@ to_chat(ghost, "You are not whitelisted to spawn as this species!") return + /* // Comments out NO_SCAN restriction, as per headmin/maintainer request. var/datum/species/chosen_species if(ghost.client.prefs.species) // In case we somehow don't have a species set here. chosen_species = GLOB.all_species[ghost_client.prefs.species] @@ -87,6 +88,7 @@ if(chosen_species.flags && NO_SCAN) // Sanity. Prevents species like Xenochimera, Proteans, etc from rejoining the round via resleeve, as they should have their own methods of doing so already, as agreed to when you whitelist as them. to_chat(ghost, "This species cannot be resleeved!") return + */ //Name matching is ugly but mind doesn't persist to look at. var/charjob From 771f3144a99395a785351fc314ba25f1d631d46f Mon Sep 17 00:00:00 2001 From: Heroman Date: Sun, 27 Mar 2022 17:46:38 +1000 Subject: [PATCH 15/21] Swaps required reagent for hostile mob and random mobs reactions --- code/modules/xenobio/items/extracts_vr.dm | 34 +++++++++++------------ 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/code/modules/xenobio/items/extracts_vr.dm b/code/modules/xenobio/items/extracts_vr.dm index 9133414832..594f0bc0b0 100644 --- a/code/modules/xenobio/items/extracts_vr.dm +++ b/code/modules/xenobio/items/extracts_vr.dm @@ -515,26 +515,10 @@ 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) - log_and_message_admins("Gold extract reaction (dangerous mob) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") - var/type_to_spawn = pickweight(xenobio_gold_mobs_hostile) - var/mob/living/C = new type_to_spawn(get_turf(holder.my_atom)) - for(var/l = 1, l <= rand(1, 3), l++) - step(C, pick(NORTH,SOUTH,EAST,WEST)) - ..() - - /decl/chemical_reaction/instant/slime/gold_random_mobs name = "Slime Random Mobs" id = "m_gold_random_mobs" - required_reagents = list("blood" = 5) + required_reagents = list("phoron" = 5) result_amount = 1 required = /obj/item/slime_extract/gold @@ -557,6 +541,22 @@ ..() +/decl/chemical_reaction/instant/slime/gold_hostile_mob + name = "Slime Hostile Mob" + id = "m_gold_hostile_mob" + required_reagents = list("blood" = 5) + result_amount = 1 + required = /obj/item/slime_extract/gold + +/decl/chemical_reaction/instant/slime/gold_hostile_mob/on_reaction(var/datum/reagents/holder) + log_and_message_admins("Gold extract reaction (dangerous mob) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") + var/type_to_spawn = pickweight(xenobio_gold_mobs_hostile) + var/mob/living/C = new type_to_spawn(get_turf(holder.my_atom)) + for(var/l = 1, l <= rand(1, 3), l++) + step(C, pick(NORTH,SOUTH,EAST,WEST)) + ..() + + /decl/chemical_reaction/instant/slime/gold_safe_mob name = "Slime Safe Mob" id = "m_gold_safe_mob" From 6be4251096700ea6f31cadb4f402380072e560c5 Mon Sep 17 00:00:00 2001 From: Heroman Date: Sun, 27 Mar 2022 19:28:12 +1000 Subject: [PATCH 16/21] Grammar and missed desc/name --- code/modules/xenobio/items/extracts_vr.dm | 14 +++++++------- code/modules/xenobio/items/slimepotions_vr.dm | 19 +++++++++---------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/code/modules/xenobio/items/extracts_vr.dm b/code/modules/xenobio/items/extracts_vr.dm index 594f0bc0b0..00abebfcb1 100644 --- a/code/modules/xenobio/items/extracts_vr.dm +++ b/code/modules/xenobio/items/extracts_vr.dm @@ -510,7 +510,7 @@ /obj/item/slime_extract/gold name = "gold slime extract" icon_state = "gold slime extract" - description_info = "When injected with phoron, this extract creates a random hostile creature. When injected with blood, this extract creates three random createres. \ + description_info = "When injected with phoron, this extract creates a few random creatures. When injected with blood, this extract a random hostile creature. \ When injected with water, this extract creates a random passive creature. When injected with slime jelly, this extract creates some gold." slime_type = /mob/living/simple_mob/slime/xenobio/gold @@ -1296,7 +1296,7 @@ name = "sapphire slime extract" icon_state = "sapphire slime extract" description_info = "When injected with phoron, this extract creates a promethean cube, which can be used to create a new promethean. When injected with blood, this extract creates some mutation \ - toxin. When injected with water, this extract creates some plushies. When injected with slime jelly, this extract creates a sentience agent, which can be used to develop sentience in \ + toxin. When injected with water, this extract creates some plushies. When injected with slime jelly, this extract creates a sapience agent, which can be used to develop sentience in \ various creatures." slime_type = /mob/living/simple_mob/slime/xenobio/sapphire @@ -1340,15 +1340,15 @@ ..() -/decl/chemical_reaction/instant/slime/sapphire_sentience - name = "Slime Sentience" - id = "m_sapphire_sentience" +/decl/chemical_reaction/instant/slime/sapphire_sapience + name = "Slime Sapience" + id = "m_sapphire_sapience" required_reagents = list("slimejelly" = 5) result_amount = 1 required = /obj/item/slime_extract/sapphire -/decl/chemical_reaction/instant/slime/sapphire_sentience/on_reaction(var/datum/reagents/holder) - new /obj/item/slimepotion/sentience(get_turf(holder.my_atom)) +/decl/chemical_reaction/instant/slime/sapphire_sapience/on_reaction(var/datum/reagents/holder) + new /obj/item/slimepotion/sapience(get_turf(holder.my_atom)) ..() // *************** diff --git a/code/modules/xenobio/items/slimepotions_vr.dm b/code/modules/xenobio/items/slimepotions_vr.dm index efd1bdc9e9..0c4f0ab0a8 100644 --- a/code/modules/xenobio/items/slimepotions_vr.dm +++ b/code/modules/xenobio/items/slimepotions_vr.dm @@ -141,14 +141,13 @@ 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." +/obj/item/slimepotion/sapience + name = "slime sapience agent" + desc = "A potent chemical mix that makes an animal capable of developing more advanced, sapient thought." + description_info = "The slime or other animal needs to be alive for this to work. The development is not always immedeate and may take indeterminate time before effects show." icon_state = "potblue" -/obj/item/slimepotion/sentience/attack(mob/living/simple_mob/M, mob/user) +/obj/item/slimepotion/sapience/attack(mob/living/simple_mob/M, mob/user) if(!istype(M)) to_chat(user, "The agent only works on creatures!") return ..() @@ -156,17 +155,17 @@ to_chat(user, "The creature is dead!") return ..() if(M.ghostjoin) - to_chat(user, "The creature is already developing sentience.") + to_chat(user, "The creature is already developing sapience.") return ..() if(M.ckey) - to_chat(user, "The creature is already sentient!") + to_chat(user, "The creature is already sapient!") return ..() - to_chat(user, "You feed \the [M] the agent. It may now eventually develop proper sentience.") + to_chat(user, "You feed \the [M] the agent. It may now eventually develop proper sapience.") M.ghostjoin = 1 active_ghost_pods |= M M.ghostjoin_icon() - log_and_message_admins("[key_name_admin(user)] used a sentience potion on a simple mob: [M]. [ADMIN_FLW(src)]") + log_and_message_admins("[key_name_admin(user)] used a sapience potion on a simple mob: [M]. [ADMIN_FLW(src)]") playsound(src, 'sound/effects/bubbles.ogg', 50, 1) qdel(src) From 124df67c81efa92811b281d71272450968c56382 Mon Sep 17 00:00:00 2001 From: Heroman Date: Sun, 27 Mar 2022 19:55:54 +1000 Subject: [PATCH 17/21] Fixes compile --- code/_helpers/global_lists_vr.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index 9373bc342c..76b1b0d4d8 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -789,7 +789,7 @@ var/global/list/xenobio_cerulean_potions = list( /obj/item/slimepotion/ferality, /obj/item/slimepotion/reinvigoration, /obj/item/slimepotion/mimic, - /obj/item/slimepotion/sentience, + /obj/item/slimepotion/sapience, /obj/item/slimepotion/obedience) var/global/list/xenobio_rainbow_extracts = list( From eb30dfc424a40449c6c85f39ecbd9cb64a33eb4e Mon Sep 17 00:00:00 2001 From: Heroman Date: Mon, 28 Mar 2022 04:01:13 +1000 Subject: [PATCH 18/21] Re-enables Amber Slime's feed aura (with restrictions) --- .../living/simple_mob/subtypes/slime/xenobio/subtypes.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 72d32abb8c..257b16895b 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 @@ -439,15 +439,16 @@ /mob/living/simple_mob/slime/xenobio/amber ) -/* VOREStation Edit. We've had enough server crashes. /mob/living/simple_mob/slime/xenobio/amber/handle_special() if(stat != DEAD) feed_aura() ..() /mob/living/simple_mob/slime/xenobio/amber/proc/feed_aura() - for(var/mob/living/L in view(2, src)) - if(L == src) // Don't feed themselves, or it is impossible to stop infinite slimes without killing all of the ambers. + for(var/mob/living/L in view(1, src)) + if(L.stat == DEAD || !IIsAlly(L)) + continue + if(L == src || istype(L, /mob/living/simple_mob/slime/xenobio/amber)) // Don't feed themselves, or it is impossible to stop infinite slimes without killing all of the ambers. continue if(istype(L, /mob/living/simple_mob/slime/xenobio)) var/mob/living/simple_mob/slime/xenobio/X = L @@ -457,7 +458,6 @@ if(H.isSynthetic()) continue H.nutrition = between(0, H.nutrition + rand(15, 25), 800) -*/ /mob/living/simple_mob/slime/xenobio/cerulean desc = "This slime is generally superior in a wide range of attributes, compared to the common slime. The jack of all trades, but master of none." From c6b6d218b6d6e2c4350029004a72537efe2599b3 Mon Sep 17 00:00:00 2001 From: Foopwo Date: Sun, 27 Mar 2022 11:41:18 -0700 Subject: [PATCH 19/21] Add siphon vent to tether autoresleever room. --- maps/tether/tether-01-surface1.dmm | 40 ++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm index 7625227402..2973009839 100644 --- a/maps/tether/tether-01-surface1.dmm +++ b/maps/tether/tether-01-surface1.dmm @@ -30484,7 +30484,12 @@ /obj/effect/floor_decal/corner/paleblue/border{ dir = 9 }, -/obj/machinery/atmospherics/unary/vent_scrubber/on, +/obj/machinery/atmospherics/unary/vent_pump/siphon/on/atmos{ + external_pressure_bound = 101.3; + external_pressure_bound_default = 101.3; + pressure_checks = 1; + pressure_checks_default = 1 + }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/autoresleeving) "bbJ" = ( @@ -32852,12 +32857,7 @@ /obj/effect/floor_decal/corner/paleblue/border{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, +/obj/machinery/atmospherics/pipe/simple/hidden/universal, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/autoresleeving) "fLB" = ( @@ -34005,6 +34005,12 @@ /obj/effect/floor_decal/corner/paleblue/border{ dir = 6 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/autoresleeving) "iue" = ( @@ -34934,8 +34940,9 @@ /obj/effect/floor_decal/borderfloorwhite/corner, /obj/effect/floor_decal/corner/paleblue/bordercorner, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 8 + dir = 6 }, +/obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/autoresleeving) "lbu" = ( @@ -35299,11 +35306,9 @@ dir = 10 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 + dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/autoresleeving) "lQu" = ( @@ -36235,6 +36240,15 @@ }, /turf/simulated/floor/tiled, /area/tether/surfacebase/security/brig) +"ogh" = ( +/obj/machinery/atmospherics/unary/vent_pump/siphon/on/atmos{ + external_pressure_bound = 101.3; + external_pressure_bound_default = 101.3; + pressure_checks = 1; + pressure_checks_default = 1 + }, +/turf/simulated/floor/plating, +/area/maintenance/lowmedbaymaint) "ohi" = ( /obj/structure/catwalk, /turf/simulated/floor/plating, @@ -54517,7 +54531,7 @@ acA axP aeF axK -aAI +ogh uVK joK xts From b8a5fb1522da1dffae8d59d173dda6bc71194496 Mon Sep 17 00:00:00 2001 From: Pandora Date: Sun, 27 Mar 2022 20:03:12 +0100 Subject: [PATCH 20/21] I may be stoopid --- .../living/simple_mob/subtypes/animal/alien animals/catslug.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm index 286c6dfff0..949be139f8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm @@ -332,7 +332,8 @@ /mob/living/simple_mob/vore/alienanimals/catslug/spaceslug/Initialize() . = ..() verbs += /mob/living/proc/ventcrawl - verbs += /mob/living/proc/hide //I don't even want to imagine what the colour change proc would do to their sprite, not to mention ghosts would need to be forced into the catslug so this is more just a safety net than anything + verbs += /mob/living/proc/hide + verbs -= /mob/living/simple_mob/vore/alienanimals/catslug/proc/catslug_color //I don't even want to imagine what the colour change proc would do to their sprite, not to mention ghosts would need to be forced into the catslug so this is more just a safety net than anything /mob/living/simple_mob/vore/alienanimals/catslug/spaceslug/attack_hand(mob/living/carbon/human/M as mob) From 5d0f8782cff476185d806d02068a51c8c4c5f628 Mon Sep 17 00:00:00 2001 From: VerySoft Date: Sun, 27 Mar 2022 16:16:01 -0400 Subject: [PATCH 21/21] Back to SD Ship time --- vorestation.dme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vorestation.dme b/vorestation.dme index 2a2483e8f3..ca6633e66b 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -4103,6 +4103,7 @@ #include "maps\southern_cross\loadout\loadout_suit.dm" #include "maps\southern_cross\loadout\loadout_uniform.dm" #include "maps\southern_cross\loadout\loadout_vr.dm" +#include "maps\stellardelight\stellar_delight.dm" #include "maps\submaps\_helpers.dm" #include "maps\submaps\_readme.dm" #include "maps\submaps\engine_submaps\engine.dm" @@ -4112,6 +4113,5 @@ #include "maps\submaps\space_submaps\debrisfield\debrisfield.dm" #include "maps\submaps\surface_submaps\wilderness\wilderness.dm" #include "maps\submaps\surface_submaps\wilderness\wilderness_areas.dm" -#include "maps\tether\tether.dm" #include "maps\~map_system\maps.dm" // END_INCLUDE