diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm
index 850ec24c38..8088eaa5e1 100644
--- a/code/_helpers/global_lists_vr.dm
+++ b/code/_helpers/global_lists_vr.dm
@@ -590,3 +590,252 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
var/global/list/weavable_structures = list()
var/global/list/weavable_items = list()
+
+
+var/global/list/xenobio_metal_materials_normal = list(
+ /obj/item/stack/material/steel = 20,
+ /obj/item/stack/material/glass = 15,
+ /obj/item/stack/material/plastic = 12,
+ /obj/item/stack/material/wood = 12,
+ /obj/item/stack/material/cardboard = 6,
+ /obj/item/stack/material/sandstone = 5,
+ /obj/item/stack/material/log = 5,
+ /obj/item/stack/material/lead = 5,
+ /obj/item/stack/material/iron = 5,
+ /obj/item/stack/material/graphite = 5,
+ /obj/item/stack/material/copper = 4,
+ /obj/item/stack/material/tin = 4,
+ /obj/item/stack/material/bronze = 4,
+ /obj/item/stack/material/aluminium = 4)
+
+var/global/list/xenobio_metal_materials_adv = list(
+ /obj/item/stack/material/glass/reinforced = 15,
+ /obj/item/stack/material/marble = 10,
+ /obj/item/stack/material/plasteel = 10,
+ /obj/item/stack/material/glass/phoronglass = 10,
+ /obj/item/stack/material/wood/sif = 5,
+ /obj/item/stack/material/wood/hard = 5,
+ /obj/item/stack/material/log/sif = 5,
+ /obj/item/stack/material/log/hard = 5,
+ /obj/item/stack/material/glass/phoronrglass = 5,
+ /obj/item/stack/material/glass/titanium = 3,
+ /obj/item/stack/material/glass/plastitanium = 3,
+ /obj/item/stack/material/durasteel = 2,
+ /obj/item/stack/material/painite = 1,
+ /obj/item/stack/material/void_opal = 1,
+ /obj/item/stack/material/quartz = 1)
+
+var/global/list/xenobio_metal_materials_weird = list(
+ /obj/item/stack/material/cloth = 10,
+ /obj/item/stack/material/leather = 5,
+ /obj/item/stack/material/fiber = 5,
+ /obj/item/stack/material/fur/wool = 7,
+ /obj/item/stack/material/snow = 3,
+ /obj/item/stack/material/snowbrick = 3,
+ /obj/item/stack/material/flint = 3,
+ /obj/item/stack/material/stick = 3,
+ /obj/item/stack/material/chitin = 1)
+
+var/global/list/xenobio_silver_materials_basic = list(
+ /obj/item/stack/material/silver = 10,
+ /obj/item/stack/material/uranium = 8,
+ /obj/item/stack/material/gold = 6,
+ /obj/item/stack/material/titanium = 4,
+ /obj/item/stack/material/phoron = 1)
+
+var/global/list/xenobio_silver_materials_adv = list(
+ /obj/item/stack/material/deuterium = 5,
+ /obj/item/stack/material/tritium = 5,
+ /obj/item/stack/material/osmium = 5,
+ /obj/item/stack/material/mhydrogen = 3,
+ /obj/item/stack/material/diamond = 2,
+ /obj/item/stack/material/verdantium = 1)
+
+var/global/list/xenobio_silver_materials_special = list(
+ /obj/item/stack/material/valhollide = 1,
+ /obj/item/stack/material/morphium = 1,
+ /obj/item/stack/material/supermatter = 1)
+
+var/global/list/xenobio_gold_mobs_hostile = list(
+ /mob/living/simple_mob/vore/alienanimals/space_jellyfish,
+ /mob/living/simple_mob/vore/alienanimals/skeleton,
+ /mob/living/simple_mob/vore/alienanimals/space_ghost,
+ /mob/living/simple_mob/vore/alienanimals/startreader,
+ /mob/living/simple_mob/animal/passive/mouse/operative,
+ /mob/living/simple_mob/animal/giant_spider,
+ /mob/living/simple_mob/animal/giant_spider/frost,
+ /mob/living/simple_mob/animal/giant_spider/electric,
+ /mob/living/simple_mob/animal/giant_spider/hunter,
+ /mob/living/simple_mob/animal/giant_spider/lurker,
+ /mob/living/simple_mob/animal/giant_spider/pepper,
+ /mob/living/simple_mob/animal/giant_spider/thermic,
+ /mob/living/simple_mob/animal/giant_spider/tunneler,
+ /mob/living/simple_mob/animal/giant_spider/webslinger,
+ /mob/living/simple_mob/animal/giant_spider/phorogenic,
+ /mob/living/simple_mob/animal/giant_spider/carrier,
+ /mob/living/simple_mob/animal/giant_spider/nurse,
+ /mob/living/simple_mob/animal/giant_spider/ion,
+ /mob/living/simple_mob/animal/giant_spider/nurse/queen,
+ /mob/living/simple_mob/animal/sif/diyaab,
+ /mob/living/simple_mob/animal/sif/duck,
+ /mob/living/simple_mob/animal/sif/frostfly,
+ /mob/living/simple_mob/animal/sif/glitterfly,
+ /mob/living/simple_mob/animal/sif/hooligan_crab,
+ /mob/living/simple_mob/animal/sif/kururak,
+ /mob/living/simple_mob/animal/sif/leech,
+ /mob/living/simple_mob/animal/sif/tymisian,
+ /mob/living/simple_mob/animal/sif/sakimm,
+ /mob/living/simple_mob/animal/sif/savik,
+ /mob/living/simple_mob/animal/sif/shantak,
+ /mob/living/simple_mob/animal/sif/siffet,
+ /mob/living/simple_mob/animal/space/alien,
+ /mob/living/simple_mob/animal/space/alien/drone,
+ /mob/living/simple_mob/animal/space/alien/sentinel,
+ /mob/living/simple_mob/animal/space/alien/sentinel/praetorian,
+ /mob/living/simple_mob/animal/space/alien/queen,
+ /mob/living/simple_mob/animal/space/alien/queen/empress,
+ /mob/living/simple_mob/animal/space/alien/queen/empress/mother,
+ /mob/living/simple_mob/animal/space/bats,
+ /mob/living/simple_mob/animal/space/bear,
+ /mob/living/simple_mob/animal/space/carp,
+ /mob/living/simple_mob/animal/space/carp/large,
+ /mob/living/simple_mob/animal/space/carp/large/huge,
+ /mob/living/simple_mob/animal/space/goose,
+ /mob/living/simple_mob/creature,
+ /mob/living/simple_mob/faithless,
+ /mob/living/simple_mob/tomato,
+ /mob/living/simple_mob/animal/space/tree,
+ /mob/living/simple_mob/vore/aggressive/corrupthound,
+ /mob/living/simple_mob/vore/aggressive/corrupthound/prettyboi,
+ /mob/living/simple_mob/vore/aggressive/deathclaw,
+ /mob/living/simple_mob/vore/aggressive/dino,
+ /mob/living/simple_mob/vore/aggressive/dragon,
+ /mob/living/simple_mob/vore/aggressive/frog,
+ /mob/living/simple_mob/otie,
+ /mob/living/simple_mob/otie/red,
+ /mob/living/simple_mob/vore/aggressive/panther,
+ /mob/living/simple_mob/vore/aggressive/rat,
+ /mob/living/simple_mob/vore/aggressive/giant_snake,
+ /mob/living/simple_mob/vore/sect_drone,
+ /mob/living/simple_mob/vore/sect_queen,
+ /mob/living/simple_mob/vore/weretiger,
+ /mob/living/simple_mob/animal/wolf,
+ /mob/living/simple_mob/vore/xeno_defanged)
+
+var/global/list/xenobio_gold_mobs_bosses = list(
+ /mob/living/simple_mob/animal/giant_spider/broodmother,
+ /mob/living/simple_mob/vore/leopardmander,
+ /mob/living/simple_mob/vore/leopardmander/blue,
+ /mob/living/simple_mob/vore/leopardmander/exotic,
+ /mob/living/simple_mob/vore/greatwolf,
+ /mob/living/simple_mob/vore/greatwolf/black,
+ /mob/living/simple_mob/vore/greatwolf/grey,
+ /mob/living/simple_mob/vore/bigdragon)
+
+var/global/list/xenobio_gold_mobs_safe = list(
+ /mob/living/simple_mob/vore/alienanimals/dustjumper,
+ /mob/living/simple_mob/vore/alienanimals/teppi,
+ /mob/living/simple_mob/animal/passive/chicken,
+ /mob/living/simple_mob/animal/passive/cow,
+ /mob/living/simple_mob/animal/goat,
+ /mob/living/simple_mob/animal/passive/crab,
+ /mob/living/simple_mob/animal/passive/mouse/jerboa,
+ /mob/living/simple_mob/animal/passive/lizard,
+ /mob/living/simple_mob/animal/passive/lizard/large,
+ /mob/living/simple_mob/animal/passive/yithian,
+ /mob/living/simple_mob/animal/passive/tindalos,
+ /mob/living/simple_mob/animal/passive/mouse,
+ /mob/living/simple_mob/animal/passive/penguin,
+ /mob/living/simple_mob/animal/passive/opossum,
+ /mob/living/simple_mob/animal/passive/cat,
+ /mob/living/simple_mob/animal/passive/dog/corgi,
+ /mob/living/simple_mob/animal/passive/dog/void_puppy,
+ /mob/living/simple_mob/animal/passive/dog/bullterrier,
+ /mob/living/simple_mob/animal/passive/dog/tamaskan,
+ /mob/living/simple_mob/animal/passive/dog/brittany,
+ /mob/living/simple_mob/animal/passive/fox,
+ /mob/living/simple_mob/animal/passive/fox/syndicate,
+ /mob/living/simple_mob/animal/passive/hare,
+ /mob/living/simple_mob/animal/passive/pillbug,
+ /mob/living/simple_mob/animal/passive/gaslamp,
+ /mob/living/simple_mob/animal/passive/snake,
+ /mob/living/simple_mob/animal/passive/snake/red,
+ /mob/living/simple_mob/animal/passive/snake/python,
+ /mob/living/simple_mob/vore/bee,
+ /mob/living/simple_mob/vore/fennec,
+ /mob/living/simple_mob/vore/fennix,
+ /mob/living/simple_mob/vore/hippo,
+ /mob/living/simple_mob/vore/horse,
+ /mob/living/simple_mob/animal/space/jelly,
+ /mob/living/simple_mob/vore/oregrub,
+ /mob/living/simple_mob/vore/oregrub/lava,
+ /mob/living/simple_mob/vore/rabbit,
+ /mob/living/simple_mob/vore/redpanda,
+ /mob/living/simple_mob/vore/sheep,
+ /mob/living/simple_mob/vore/solargrub)
+
+var/global/list/xenobio_gold_mobs_birds = list(/mob/living/simple_mob/animal/passive/bird/black_bird,
+ /mob/living/simple_mob/animal/passive/bird/azure_tit,
+ /mob/living/simple_mob/animal/passive/bird/european_robin,
+ /mob/living/simple_mob/animal/passive/bird/goldcrest,
+ /mob/living/simple_mob/animal/passive/bird/ringneck_dove,
+ /mob/living/simple_mob/animal/passive/bird/parrot,
+ /mob/living/simple_mob/animal/passive/bird/parrot/kea,
+ /mob/living/simple_mob/animal/passive/bird/parrot/eclectus,
+ /mob/living/simple_mob/animal/passive/bird/parrot/grey_parrot,
+ /mob/living/simple_mob/animal/passive/bird/parrot/black_headed_caique,
+ /mob/living/simple_mob/animal/passive/bird/parrot/white_caique,
+ /mob/living/simple_mob/animal/passive/bird/parrot/budgerigar,
+ /mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/blue,
+ /mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/bluegreen,
+ /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel,
+ /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/white,
+ /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/yellowish,
+ /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/grey,
+ /mob/living/simple_mob/animal/passive/bird/parrot/sulphur_cockatoo,
+ /mob/living/simple_mob/animal/passive/bird/parrot/white_cockatoo,
+ /mob/living/simple_mob/animal/passive/bird/parrot/pink_cockatoo) //There's too dang many
+
+var/global/list/xenobio_cerulean_potions = list(
+ /obj/item/slimepotion/enhancer,
+ /obj/item/slimepotion/stabilizer,
+ /obj/item/slimepotion/mutator,
+ /obj/item/slimepotion/docility,
+ /obj/item/slimepotion/steroid,
+ /obj/item/slimepotion/unity,
+ /obj/item/slimepotion/loyalty,
+ /obj/item/slimepotion/friendship,
+ /obj/item/slimepotion/feeding,
+ /obj/item/slimepotion/infertility,
+ /obj/item/slimepotion/fertility,
+ /obj/item/slimepotion/shrink,
+ /obj/item/slimepotion/death,
+ /obj/item/slimepotion/ferality,
+ /obj/item/slimepotion/reinvigoration,
+ /obj/item/slimepotion/mimic,
+ /obj/item/slimepotion/sapience,
+ /obj/item/slimepotion/obedience)
+
+var/global/list/xenobio_rainbow_extracts = list(
+ /obj/item/slime_extract/grey = 2,
+ /obj/item/slime_extract/metal = 3,
+ /obj/item/slime_extract/blue = 3,
+ /obj/item/slime_extract/purple = 1,
+ /obj/item/slime_extract/orange = 3,
+ /obj/item/slime_extract/yellow = 3,
+ /obj/item/slime_extract/gold = 3,
+ /obj/item/slime_extract/silver = 3,
+ /obj/item/slime_extract/dark_purple = 2,
+ /obj/item/slime_extract/dark_blue = 3,
+ /obj/item/slime_extract/red = 3,
+ /obj/item/slime_extract/green = 3,
+ /obj/item/slime_extract/pink = 3,
+ /obj/item/slime_extract/oil = 3,
+ /obj/item/slime_extract/bluespace = 3,
+ /obj/item/slime_extract/cerulean = 1,
+ /obj/item/slime_extract/amber = 3,
+ /obj/item/slime_extract/sapphire = 3,
+ /obj/item/slime_extract/ruby = 3,
+ /obj/item/slime_extract/emerald = 3,
+ /obj/item/slime_extract/light_pink = 1,
+ /obj/item/slime_extract/rainbow = 1)
\ No newline at end of file
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index 3449bf4c47..4689863245 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -471,7 +471,7 @@ so as to remain in compliance with the most up-to-date laws."
return
if(master)
return usr.client.Click(master, location, control, params)
- ..() // CHOMPStation Edit: Pass through to click_vr
+ ..() // VOREStation Edit: Pass through to click_vr
/obj/screen/alert/Destroy()
..()
diff --git a/code/_onclick/hud/alert_vr.dm b/code/_onclick/hud/alert_vr.dm
index 4255be312e..e4168c3971 100644
--- a/code/_onclick/hud/alert_vr.dm
+++ b/code/_onclick/hud/alert_vr.dm
@@ -24,7 +24,6 @@
name = "Low Power"
desc = "Your battery is very low! Low power mode makes all movements slower."
-// CHOMPEdit Start
/obj/screen/alert/xenochimera/reconstitution
name = "Reconstructing Form"
desc = "You're still rebuilding your body! Click the alert to find out how long you have left."
@@ -51,5 +50,4 @@
if(istype(H) && istype(H.species, /datum/species/xenochimera)) // If you're somehow able to click this while not a chimera, this should prevent weird runtimes. Will need changing if regeneration is ever opened to non-chimera using the same alert.
if(H.revive_ready == REVIVING_DONE) // Sanity check.
H.hatch() // Hatch.
-// CHOMPEdit Finish
-*/
\ No newline at end of file
+*/
diff --git a/code/_onclick/hud/screen_objects_vr.dm b/code/_onclick/hud/screen_objects_vr.dm
index 69555eb61b..65b6df5c3b 100644
--- a/code/_onclick/hud/screen_objects_vr.dm
+++ b/code/_onclick/hud/screen_objects_vr.dm
@@ -45,14 +45,15 @@
var/turf/T = get_turf(H)
if(T.get_lumcount() <= 0.1)
to_chat(usr, "You are slowly calming down in darkness' safety...")
- else if(isbelly(H.loc)) // CHOMPEdit: Safety message for if inside a belly.
+
+ else if(isbelly(H.loc)) // Safety message for if inside a belly.
to_chat(usr, "You are slowly calming down within the darkness of something's belly, listening to their body as it moves around you. ...safe...")
else
to_chat(usr, "You are slowly calming down... But safety of darkness is much preferred.")
else
if(H.nutrition < 150)
to_chat(usr, "Your hunger is slowly making you unstable.")
- if("Reconstructing Form") // CHOMPEdit: Allow Viewing Reconstruction Timer + Hatching for 'chimera
+ if("Reconstructing Form") // Allow Viewing Reconstruction Timer + Hatching for 'chimera
var/mob/living/carbon/human/H = usr
if(istype(H) && istype(H.species, /datum/species/xenochimera)) // If you're somehow able to click this while not a chimera, this should prevent weird runtimes. Will need changing if regeneration is ever opened to non-chimera using the same alert.
if(H.revive_ready == REVIVING_NOW)
@@ -60,7 +61,7 @@
else if(H.revive_ready == REVIVING_DONE)
to_chat(usr, "You should have a notification + alert for this! Bug report that this is still here!")
- if("Ready to Hatch") // CHOMPEdit: Allow Viewing Reconstruction Timer + Hatching for 'chimera
+ if("Ready to Hatch") // Allow Viewing Reconstruction Timer + Hatching for 'chimera
var/mob/living/carbon/human/H = usr
if(istype(H) && istype(H.species, /datum/species/xenochimera)) // If you're somehow able to click this while not a chimera, this should prevent weird runtimes. Will need changing if regeneration is ever opened to non-chimera using the same alert.
if(H.revive_ready == REVIVING_DONE) // Sanity check.
@@ -69,4 +70,4 @@
else
return 0
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm
index 717ceb1ee2..f672cbcf1b 100644
--- a/code/game/objects/items/devices/defib.dm
+++ b/code/game/objects/items/devices/defib.dm
@@ -502,9 +502,11 @@
M.updatehealth()
apply_brain_damage(M)
M.adjustHalLoss(40) // CHOMPEdit: Moderate amount of halloss for EVERYONE being defibbed. Defibs feel like being kicked in the chest by a mule. Shit hurts if you're awake.
- if(istype(M.species, /datum/species/xenochimera)) // Only do the following to Xenochimera. Handwave this however you want, this is to balance defibs on an alien race. CHOMPEdit
+ // VOREStation Edits Start: Defib pain
+ if(istype(M.species, /datum/species/xenochimera)) // Only do the following to Xenochimera. Handwave this however you want, this is to balance defibs on an alien race.
M.adjustHalLoss(220) // This hurts a LOT, stacks on top of the previous halloss.
M.feral += 100 // If they somehow weren't already feral, force them feral by increasing ferality var directly, to avoid any messy checks. handle_feralness() will immediately set our feral properly according to halloss anyhow.
+ // VOREStation Edits End
// SSgame_master.adjust_danger(-20) // VOREStation Edit - We don't use SSgame_master yet.
/obj/item/weapon/shockpaddles/proc/apply_brain_damage(mob/living/carbon/human/H)
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/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 7e75e5057a..b240af4dd6 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -278,7 +278,7 @@ HALOGEN COUNTER - Radcount on mobs
else
dat += "Blood Level Normal: [blood_percent]% [blood_volume]cl. Type: [blood_type]
"
dat += "Subject's pulse: [H.get_pulse(GETPULSE_TOOL)] bpm."
- if(istype(H.species, /datum/species/xenochimera)) // CHOMPEdit Start: Visible feedback for medmains on Xenochimera.
+ if(istype(H.species, /datum/species/xenochimera)) // VOREStation Edit Start: Visible feedback for medmains on Xenochimera.
if(H.stat == DEAD && H.revive_ready == REVIVING_READY && !H.hasnutriment())
dat += "WARNING: Protein levels low. Subject incapable of reconstitution."
else if(H.revive_ready == REVIVING_NOW)
@@ -289,7 +289,7 @@ HALOGEN COUNTER - Radcount on mobs
dat+= "WARNING: Defib will cause extreme pain and set subject feral. Sedation recommended prior to defibrillation."
else // If they bop them and they're not dead or reviving, give 'em a little notice.
dat += "Subject is a Xenochimera. Treat accordingly."
- // CHOMPEdit End
+ // VOREStation Edit End
user.show_message(dat, 1)
/obj/item/device/healthanalyzer/verb/toggle_mode()
@@ -545,4 +545,4 @@ HALOGEN COUNTER - Radcount on mobs
to_chat(user, "No radiation detected.")
return
-#undef DEFIB_TIME_LIMIT //VOREStation addition
\ No newline at end of file
+#undef DEFIB_TIME_LIMIT //VOREStation addition
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 06e176f410..6986f5e23c 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()
evolve_and_reproduce()
@@ -146,6 +143,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/emotes/definitions/audible_furry_ch.dm b/code/modules/emotes/definitions/audible_furry_ch.dm
index 4268ffe2bb..fa9878cae4 100644
--- a/code/modules/emotes/definitions/audible_furry_ch.dm
+++ b/code/modules/emotes/definitions/audible_furry_ch.dm
@@ -1,4 +1,7 @@
+//This file has been disabled in the dme now that the below is actually ported upstream
+/*
/decl/emote/audible/coyawoo
key = "coyawoo"
emote_message_3p = "lets out a scraggly awoo."
- emote_sound = 'sound/voice/coyoteawoo.ogg'
\ No newline at end of file
+ emote_sound = 'sound/voice/coyoteawoo.ogg'
+*/
diff --git a/code/modules/emotes/definitions/audible_furry_vr.dm b/code/modules/emotes/definitions/audible_furry_vr.dm
index 531b525453..61d980ad27 100644
--- a/code/modules/emotes/definitions/audible_furry_vr.dm
+++ b/code/modules/emotes/definitions/audible_furry_vr.dm
@@ -179,3 +179,28 @@
else
emote_sound = pick(smolsound)
. = ..()
+
+/decl/emote/audible/coyawoo
+ key = "coyawoo"
+ emote_message_3p = "lets out a scraggly awoo."
+ emote_sound = 'sound/voice/coyoteawoo.ogg'
+
+/decl/emote/audible/coyawoo2
+ key = "coyawoo2"
+ emote_message_3p = "lets out a pronounced, scraggly awoo."
+ emote_sound = 'sound/voice/coyoteawoo2.ogg'
+
+/decl/emote/audible/coyawoo3
+ key = "coyawoo3"
+ emote_message_3p = "yaps and lets out a scraggly awoo."
+ emote_sound = 'sound/voice/coyoteawoo3.ogg'
+
+/decl/emote/audible/coyawoo4
+ key = "coyawoo4"
+ emote_message_3p = "yaps several times, and lets out a short, scraggly awoo."
+ emote_sound = 'sound/voice/coyoteawoo4.ogg'
+
+/decl/emote/audible/coyawoo5
+ key = "coyawoo5"
+ emote_message_3p = "lets out a scraggly, whine-awoo."
+ emote_sound = 'sound/voice/coyoteawoo5.ogg'
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 84090269e1..1881e2856a 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -137,10 +137,12 @@ var/list/_human_default_emotes = list(
/decl/emote/audible/prbt,
/decl/emote/audible/gyoh,
/decl/emote/audible/rumble,
+ /decl/emote/audible/coyawoo,
+ /decl/emote/audible/coyawoo2,
+ /decl/emote/audible/coyawoo3,
+ /decl/emote/audible/coyawoo4,
+ /decl/emote/audible/coyawoo5
//VOREStation Add End
- //CHOMPStation Add Start
- /decl/emote/audible/coyawoo
- //CHOMPStation End Start
)
//VOREStation Add Start
diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
index c401019f21..2697df5f84 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
@@ -34,14 +34,14 @@
//Scary spawnerization.
revive_ready = REVIVING_NOW
revive_finished = (world.time + time SECONDS) // When do we finish reviving? Allows us to find out when we're done, called by the alert currently.
- throw_alert("regen", /obj/screen/alert/xenochimera/reconstitution) // CHOMPEdit: Regen
+ throw_alert("regen", /obj/screen/alert/xenochimera/reconstitution)
spawn(time SECONDS)
// Was dead, now not dead.
if(stat != DEAD)
to_chat(src, "Your body has recovered from its ordeal, ready to regenerate itself again.")
revive_ready = REVIVING_READY //reset their cooldown
- clear_alert("regen") // CHOMPEdit: Regen
- throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch) // CHOMPEdit: Regen
+ clear_alert("regen")
+ throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch)
// Was dead, still dead.
else
@@ -49,8 +49,8 @@
verbs |= /mob/living/carbon/human/proc/hatch
revive_ready = REVIVING_DONE
src << sound('sound/effects/mob_effects/xenochimera/hatch_notification.ogg',0,0,0,30)
- clear_alert("regen") // CHOMPEdit: Regen
- throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch) // CHOMPEdit: Regen
+ clear_alert("regen")
+ throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch)
//Dead until nutrition injected.
else
@@ -63,7 +63,7 @@
//Waiting for regen after being alive
revive_ready = REVIVING_NOW
revive_finished = (world.time + time SECONDS) // When do we finish reviving? Allows us to find out when we're done, called by the alert currently.
- throw_alert("regen", /obj/screen/alert/xenochimera/reconstitution) // CHOMPEdit: Regen
+ throw_alert("regen", /obj/screen/alert/xenochimera/reconstitution)
spawn(time SECONDS)
//If they're still alive after regenning.
@@ -72,8 +72,8 @@
verbs |= /mob/living/carbon/human/proc/hatch
revive_ready = REVIVING_DONE
src << sound('sound/effects/mob_effects/xenochimera/hatch_notification.ogg',0,0,0,30)
- clear_alert("regen") // CHOMPEdit: Regen
- throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch) // CHOMPEdit: Regen
+ clear_alert("regen")
+ throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch)
//Was alive, now dead
else if(hasnutriment())
@@ -81,14 +81,14 @@
verbs |= /mob/living/carbon/human/proc/hatch
revive_ready = REVIVING_DONE
src << sound('sound/effects/mob_effects/xenochimera/hatch_notification.ogg',0,0,0,30)
- clear_alert("regen") // CHOMPEdit: Regen
- throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch) // CHOMPEdit: Regen
+ clear_alert("regen")
+ throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch)
//Dead until nutrition injected.
else
to_chat(src, "Your body was unable to regenerate, what few living cells remain require additional nutrients to complete the process.")
revive_ready = REVIVING_READY //reset their cooldown
- clear_alert("regen") // CHOMPEdit: Regen
+ clear_alert("regen")
/mob/living/carbon/human/proc/hasnutriment()
if (bloodstr.has_reagent("nutriment", 30) || src.bloodstr.has_reagent("protein", 15)) //protein needs half as much. For reference, a steak contains 9u protein.
@@ -117,7 +117,7 @@
chimera_hatch()
adjustBrainLoss(10) // if they're reviving from dead, they come back with 10 brainloss on top of whatever's unhealed.
visible_message("The lifeless husk of [src] bursts open, revealing a new, intact copy in the pool of viscera.
") //Bloody hell...
- clear_alert("hatch") // CHOMPEdit: Regen
+ clear_alert("hatch")
return
//Don't have nutriment to hatch! Or you somehow died in between completing your revive and hitting hatch.
@@ -125,13 +125,13 @@
to_chat(src, "Your body was unable to regenerate, what few living cells remain require additional nutrients to complete the process.")
verbs -= /mob/living/carbon/human/proc/hatch
revive_ready = REVIVING_READY //reset their cooldown they can try again when they're given a kickstart
- clear_alert("hatch") // CHOMPEdit: Regen
+ clear_alert("hatch")
//Alive when hatching
else
chimera_hatch()
visible_message("The dormant husk of [src] bursts open, revealing a new, intact copy in the pool of viscera.
") //Bloody hell...
- clear_alert("hatch") // CHOMPEdit: Regen
+ clear_alert("hatch")
/mob/living/carbon/human/proc/chimera_hatch()
verbs -= /mob/living/carbon/human/proc/hatch
@@ -166,7 +166,6 @@
playsound(T, 'sound/effects/mob_effects/xenochimera/hatch.ogg', 50)
revive_ready = world.time + 10 MINUTES //set the cooldown CHOMPEdit: Reduced this to 10 minutes, you're playing with fire if you're reviving that often.
- // CHOMPEdit End
/mob/living/carbon/human/proc/revivingreset() // keep this as a debug proc or potential future use
revive_ready = REVIVING_READY
diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
index b3574568c8..5e099d6dce 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
@@ -55,7 +55,7 @@
//primitive_form = "Farwa"
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE//Whitelisted as restricted is broken.
- flags = NO_SCAN | NO_INFECT // | NO_DEFIB // Dying as a chimera is, quite literally, a death sentence. Well, if it wasn't for their revive, that is. CHOMPEdit: Leaving NO_DEFIB there for the future. // CHOMPEdit: Adds flags
+ flags = NO_SCAN | NO_INFECT // | NO_DEFIB // Dying as a chimera is, quite literally, a death sentence. Well, if it wasn't for their revive, that is. Leaving NO_DEFIB there for the future/in case reversion to old 'chimera no-defib.
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
genders = list(MALE, FEMALE, PLURAL, NEUTER)
@@ -88,11 +88,10 @@
H.weakened = 5
H.canmove = 0
H.does_not_breathe = TRUE
- var/regen_sounds = H.regen_sounds // CHOMPEdit Start: Regen sounds/etc
+ var/regen_sounds = H.regen_sounds
if(prob(2)) // 2% chance of playing squelchy noise while reviving, which is run roughly every 2 seconds/tick while regenerating.
playsound(H, pick(regen_sounds), 30)
H.visible_message("[H.name]'s motionless form shudders grotesquely, rippling unnaturally.
")
- // CHOMPEdit End
//Cold/pressure effects when not regenerating
else
@@ -212,8 +211,8 @@
feral++
else
feral = max(0,--feral)
-
- // Being in a belly or in the darkness decreases stress further. :9
+
+ // Being in a belly or in the darkness decreases stress further. Helps mechanically reward players for staying in darkness + RP'ing appropriately. :9
var/turf/T = get_turf(H)
if(feral && (isbelly(H.loc) || T.get_lumcount() <= 0.1))
feral = max(0,--feral)
@@ -233,7 +232,7 @@
H.shock_stage = max(H.shock_stage-(feral/20), 0)
//Handle light/dark areas
- // var/turf/T = get_turf(H) // CHOMPEdit: Moved up to before the in-belly/dark combined check, should still safely reach here just fine.
+ // var/turf/T = get_turf(H) // Moved up to before the in-belly/dark combined check, should still safely reach here just fine.
if(!T)
update_xenochimera_hud(H, danger, feral_state)
return //Nullspace
@@ -246,7 +245,7 @@
var/list/nearby = H.living_mobs(world.view)
//Not in the dark, or a belly, and out in the open.
- if(!darkish && isturf(H.loc) && !isbelly(H.loc)) // CHOMPEdit: added specific check for if in belly
+ if(!darkish && isturf(H.loc) && !isbelly(H.loc)) // Added specific check for if in belly
//Always handle feral if nobody's around and not in the dark.
if(!nearby.len)
@@ -260,8 +259,8 @@
update_xenochimera_hud(H, danger, feral_state)
return
- // In the darkness, "hidden", or in a belly. No need for custom scene-protection checks as it's just an occational infomessage.
- if(darkish || !isturf(H.loc) || isbelly(H.loc)) // CHOMPEdit: added specific check for if in belly
+ // In the darkness, or "hidden", or in a belly. No need for custom scene-protection checks as it's just an occational infomessage.
+ if(darkish || !isturf(H.loc) || isbelly(H.loc)) // Specific check for if in belly. !isturf should do this, but JUST in case.
// If hurt, tell 'em to heal up
if (shock)
to_chat(H,"This place seems safe, secure, hidden, a place to lick your wounds and recover...")
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm
index b6e5612171..4f72a0a53c 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm
@@ -27,7 +27,7 @@
/datum/trait/negative/endurance_low
name = "Low Endurance"
- desc = "Reduces your maximum total hitpoints to 75."
+ desc = "Reduces your maximum total hitpoints to 75. You require only 150 damage in total to die, compared to 200 normally. You will go into crit after losing 75 HP, compared to crit at 100 HP." // CHOMPEdit: Clarity for players' sake.
cost = -4 //Chompedit makes you a lot squishier, should not be only 2 points. (based on the brute and burn vulnerability costs)
var_changes = list("total_health" = 75)
@@ -37,7 +37,7 @@
/datum/trait/negative/endurance_very_low
name = "Low Endurance, Major"
- desc = "Reduces your maximum total hitpoints to 50."
+ desc = "Reduces your maximum total hitpoints to 50. You require only 100 damage in total to die, compared to 200 normally. You will go into crit after losing 50 HP, compared to crit at 100 HP." // CHOMPEdit: Clarity for players' sake.
cost = -8 //Teshari HP. This makes the person a lot more suseptable to getting stunned, killed, etc. //Chompedit: Has no business being only 3 points, while others that function similarly but are nowhere near as crippling are 3 as well.
var_changes = list("total_health" = 50)
@@ -82,9 +82,9 @@
var_changes = list("burn_mod" = 1.5)
//YW ADDITIONS START
-/datum/trait/negative/reduced_biocompat
- name = "Reduced Biocompatibility"
- desc = "For whatever reason, you're one of the unlucky few who don't get as much benefit from modern-day chemicals. Remember to note this down in your medical records!"
+/datum/trait/negative/reduced_biocompat_minor // CHOMPEdit: Changed name of trait + desc.
+ name = "Reduced Biocompatibility, Minor"
+ desc = "For whatever reason, you're one of the unlucky few who don't get as much benefit from modern-day chemicals. Remember to note this down in your medical records! Chems are only 80% as effective on you!"
cost = -1
var_changes = list("chem_strength_heal" = 0.8)
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative_ch.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative_ch.dm
index b524d80f0f..7eb0bfd1e3 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative_ch.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative_ch.dm
@@ -35,7 +35,7 @@
var_changes = list("grab_resist_divisor_victims" = 0.5, "grab_resist_divisor_self" = 3, "grab_power_victims" = 1, "grab_power_self" = -1)
/datum/trait/negative/extreme_slowdown
- name = "Extreme slowdown"
+ name = "Slowdown, Extreme"
desc = "You move EXTREMELY slower than baseline"
cost = -8
var_changes = list("slowdown" = 4.0)
@@ -376,3 +376,25 @@
if(ms != "")
to_chat(H, ms)
H.next_loneliness_time = world.time+500
+
+/datum/trait/negative/endurance_glass // Glass Cannon
+ name = "Glass Endurance"
+ desc = "Your body is very fragile. Reduces your maximum hitpoints to 25. Beware sneezes. You require only 50 damage in total to die, compared to 200 normally. You will go into crit after losing 25 HP, compared to crit at 100 HP."
+ cost = -12 // Similar to Very Low Endurance, this straight up will require you NEVER getting in a fight. This is extremely crippling. I salute the madlad that takes this.
+ var_changes = list("total_health" = 25)
+
+/datum/trait/negative/endurance_glass/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+ ..(S,H)
+ H.setMaxHealth(S.total_health)
+
+/datum/trait/negative/reduced_biocompat
+ name = "Reduced Biocompatibility"
+ desc = "For whatever reason, you're one of the unlucky few who don't get as much benefit from modern-day chemicals. Remember to note this down in your medical records! Chems are only 60% as effective on you!"
+ cost = -4
+ var_changes = list("chem_strength_heal" = 0.6)
+
+/datum/trait/negative/reduced_biocompat_extreme
+ name = "Reduced Biocompatibility, Major"
+ desc = "For whatever reason, you're one of the unlucky few who don't get as much benefit from modern-day chemicals. Remember to note this down in your medical records! Chems are only 30% as effective on you!"
+ cost = -8
+ var_changes = list("chem_strength_heal" = 0.3)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm
index 5f1fa82e65..17d6c788ae 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm
@@ -5,7 +5,7 @@
name = "Haste"
desc = "Allows you to move faster on average than baseline."
cost = 4 //CHOMPEdit
- var_changes = list("slowdown" = -0.5)
+ var_changes = list("slowdown" = -0.45)
excludes = list(/datum/trait/positive/hardy,/datum/trait/positive/hardy_extreme,/datum/trait/positive/hardy_plus,/datum/trait/positive/speed_fast_minor)
//ChompEdit
@@ -45,8 +45,8 @@
/datum/trait/positive/endurance_high
name = "High Endurance"
- desc = "Increases your maximum total hitpoints to 125"
- cost = 2
+ desc = "Increases your maximum total hitpoints to 125. You require 250 damage in total to die, compared to 200 normally. You will still go into crit after losing 125 HP, compared to crit at 100 HP." // CHOMPEdit: Clarity for players' sake.
+ cost = 3 // CHOMPEdit
var_changes = list("total_health" = 125)
/datum/trait/positive/endurance_high/apply(var/datum/species/S,var/mob/living/carbon/human/H)
@@ -55,13 +55,13 @@
/datum/trait/positive/nonconductive
name = "Non-Conductive"
- desc = "Decreases your susceptibility to electric shocks by a 25% amount." //CHOMP Edit
+ desc = "Decreases your susceptibility to electric shocks by 25%." //CHOMP Edit - GRAMMAR PLS.
cost = 2 //This effects tasers!
var_changes = list("siemens_coefficient" = 0.75) //CHOMP Edit
/datum/trait/positive/nonconductive_plus
name = "Non-Conductive, Major"
- desc = "Decreases your susceptibility to electric shocks by a 50% amount." //CHOMP Edit
+ desc = "Decreases your susceptibility to electric shocks by 50%." //CHOMP Edit - GRAMMAR PLS.
cost = 3 //Let us not forget this effects tasers!
var_changes = list("siemens_coefficient" = 0.5) //CHOMP Edit
/* //Chompedit, moving to Positive_ch.dm so it wont be messed with from upstream
@@ -128,8 +128,8 @@
cost = 2
var_changes = list("chem_strength_heal" = 1.2)
-/datum/trait/positive/pain_tolerance_advanced
- name = "High Pain Tolerance"
+/datum/trait/positive/pain_tolerance // CHOMPEdit: There is no "basic" pain tolerance, so I'm reducing this to regular pain tolerance.
+ name = "Increased Pain Tolerance"
desc = "You are noticeably more resistant to pain than most, and experience 20% less pain from all sources."
cost = 2
var_changes = list("pain_mod" = 0.8)
@@ -173,9 +173,8 @@
cost = 1 //CHOMP Edit
var_changes = list("flags" = NO_MINOR_CUT) //Checked the flag is only used by shard stepping.
-//CHOMPStation Removal Start
-/*
+// CHOMPEdit: This has been removed for two years, since Jan 2020, pending "review". Uncommenting as per tankiness increase PR.
/datum/trait/positive/antiseptic_saliva
name = "Antiseptic Saliva"
desc = "Your saliva has especially strong antiseptic properties that can be used to heal small wounds."
@@ -184,8 +183,7 @@
/datum/trait/positive/antiseptic_saliva/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..()
H.verbs |= /mob/living/carbon/human/proc/lick_wounds
-*/
-//CHOMPStation Removal End
+
/datum/trait/positive/traceur
name = "Traceur"
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive_ch.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive_ch.dm
index c005e9a3f8..380e641ddd 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive_ch.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive_ch.dm
@@ -110,19 +110,21 @@
/datum/trait/positive/endurance_high
cost = 3
- excludes = list(/datum/trait/positive/brute_resist, /datum/trait/positive/minor_brute_resist, /datum/trait/positive/minor_burn_resist, /datum/trait/positive/burn_resist)
+ excludes = list(/datum/trait/positive/endurance_very_high) // CHOMPEdit: Increased Endurance.
+ // excludes = list(/datum/trait/positive/brute_resist, /datum/trait/positive/minor_brute_resist, /datum/trait/positive/minor_burn_resist, /datum/trait/positive/burn_resist)
+ // Tankiness at the cost of severe downsides should be allowed - we have a large number of negatives that hurt hard, but you can't take many positives.
/datum/trait/positive/brute_resist
- excludes = list(/datum/trait/positive/minor_brute_resist, /datum/trait/positive/burn_resist, /datum/trait/positive/endurance_high)
+ excludes = list(/datum/trait/positive/minor_brute_resist, /datum/trait/positive/brute_resist_plus) // Tankiness at the cost of severe downsides should be allowed - we have a large number of negatives that hurt hard, but you can't take many positives.
/datum/trait/positive/minor_brute_resist
- excludes = list(/datum/trait/positive/brute_resist, /datum/trait/positive/endurance_high)
+ excludes = list(/datum/trait/positive/brute_resist, /datum/trait/positive/brute_resist_plus) // Tankiness at the cost of severe downsides should be allowed - we have a large number of negatives that hurt hard, but you can't take many positives.
/datum/trait/positive/burn_resist
- excludes = list(/datum/trait/positive/minor_burn_resist, /datum/trait/positive/brute_resist, /datum/trait/positive/endurance_high)
+ excludes = list(/datum/trait/positive/minor_burn_resist, /datum/trait/positive/burn_resist_plus) // Tankiness at the cost of severe downsides should be allowed - we have a large number of negatives that hurt hard, but you can't take many positives.
/datum/trait/positive/minor_burn_resist
- excludes = list(/datum/trait/positive/burn_resist, /datum/trait/positive/endurance_high)
+ excludes = list(/datum/trait/positive/burn_resist, /datum/trait/positive/burn_resist_plus) // Tankiness at the cost of severe downsides should be allowed - we have a large number of negatives that hurt hard, but you can't take many positives.
/datum/trait/positive/absorbent/handle_environment_special(var/mob/living/carbon/human/H)
var/turf/T = get_turf(H)
@@ -249,3 +251,45 @@
..(S,H)
H.verbs |= /mob/living/proc/insect_sting
+// TANKINESS LETS GOOOOOOOOO
+/datum/trait/positive/burn_resist_plus // Equivalent to Burn Weakness Major, cannot be taken at the same time.
+ name = "Major Burn Resist"
+ desc = "Adds 40% resistance to burn damage sources."
+ cost = 3 // Exact Opposite of Burn Weakness Major, except Weakness Major is 50% incoming, this is -40% incoming.
+ var_changes = list("burn_mod" = 0.6)
+ excludes = list(/datum/trait/positive/burn_resist, /datum/trait/positive/minor_burn_resist)
+
+/datum/trait/positive/brute_resist_plus // Equivalent to Brute Weakness Major, cannot be taken at the same time.
+ name = "Major Brute Resist"
+ desc = "Adds 40% resistance to brute damage sources."
+ cost = 3 // Exact Opposite of Brute Weakness Major, except Weakness Major is 50% incoming, this is -40% incoming.
+ var_changes = list("brute_mod" = 0.6)
+ excludes = list(/datum/trait/positive/brute_resist, /datum/trait/positive/minor_brute_resist)
+
+/datum/trait/positive/endurance_very_high
+ name = "Very High Endurance"
+ desc = "Increases your maximum total hitpoints to 150. You require 300 damage in total to die, compared to 200 normally. You will still go into crit after losing 150 HP, compared to crit at 100 HP."
+ cost = 6 // This should cost a LOT, because your total health becomes 300 to be fully dead, rather than 200 normally, or 250 for High Endurance. HE costs 2, double it here.
+ var_changes = list("total_health" = 150)
+ excludes = list(/datum/trait/positive/endurance_high)
+
+/datum/trait/positive/endurance_very_high/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+ ..(S,H)
+ H.setMaxHealth(S.total_health)
+
+
+/datum/trait/positive/endurance_extremely_high
+ name = "Extremely High Endurance"
+ desc = "Increases your maximum total hitpoints to 175"
+ cost = 9 // This should cost a LOT, because your total health becomes 350 to be fully dead, rather than 200 normally, or 250 for High Endurance. HE costs 2, this costs 3x it.
+ var_changes = list("total_health" = 175)
+
+/datum/trait/positive/endurance_extremely_high/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+ ..(S,H)
+ H.setMaxHealth(S.total_health)
+
+/datum/trait/positive/pain_tolerance_advanced // High Pain Intolerance is 50% incoming pain, but this is 40% reduced incoming pain.
+ name = "Increased Pain Tolerance"
+ desc = "You are noticeably more resistant to pain than most, and experience 40% less pain from all sources."
+ cost = 3 // Equivalent to High Pain Intolerance, but less pain resisted for balance reasons.
+ var_changes = list("pain_mod" = 0.6)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/lick_wounds.dm b/code/modules/mob/living/carbon/lick_wounds.dm
index b11ece455a..51edc1870d 100644
--- a/code/modules/mob/living/carbon/lick_wounds.dm
+++ b/code/modules/mob/living/carbon/lick_wounds.dm
@@ -1,4 +1,4 @@
-/mob/living/carbon/human/proc/lick_wounds(var/mob/living/carbon/M) //YWedit, originally, living/carbon/M in living_mobs(1), However, living_mobs does not include src as possible target.
+/mob/living/carbon/human/proc/lick_wounds(var/mob/living/carbon/M) // Allows the user to lick themselves. Given how rarely this trait is used, I don't see an issue with a slight buff.
set name = "Lick Wounds"
set category = "Abilities"
set desc = "Disinfect and heal small wounds with your saliva."
@@ -11,6 +11,10 @@
to_chat(src, "You need to be closer to do that.") // CHOMPEdit - don't use src << unless you have to.
return
+ if (get_dist(src,M) >= 2)
+ to_chat(src, "You need to be closer to do that.")
+ return
+
if ( ! (istype(src, /mob/living/carbon/human) || \
istype(src, /mob/living/silicon)) )
to_chat(src, "If you even have a tongue, it doesn't work that way.")
diff --git a/code/modules/mob/living/simple_mob/simple_mob_ch.dm b/code/modules/mob/living/simple_mob/simple_mob_ch.dm
index 855bd786c2..cf89e7c625 100644
--- a/code/modules/mob/living/simple_mob/simple_mob_ch.dm
+++ b/code/modules/mob/living/simple_mob/simple_mob_ch.dm
@@ -1,3 +1,29 @@
+/mob/living/simple_mob
+ //vars for vore_icons toggle control
+ var/vore_icons_toggle = 1 // on by default, as is legacy
+ var/vore_icons_cache = 0 // 0 by default. Going from ON to OFF should store vore_icons val here.
+
+mob/living/simple_mob/verb/toggle_vore_icons()
+
+ set name = "Toggle Vore Sprite"
+ set desc = "Toggle visibility of changed mob sprite when you have eaten other things."
+ set category = "Abilities"
+
+ if(!vore_icons && !vore_icons_cache)
+ to_chat(src,"This simplemob has no vore sprite.")
+ else if(vore_icons_toggle)
+ vore_icons_cache = vore_icons
+ vore_icons = 0
+ vore_icons_toggle = 0
+ to_chat(src,"Vore sprite disabled.")
+ else
+ vore_icons = vore_icons_cache
+ vore_icons_toggle = 1
+ to_chat(src,"Vore sprite enabled.")
+
+ update_icon()
+
+
// a unique named update_transforms override to allow simplemobs going horizontal on lay/stun.
// This will not make the mob horizontal if the mob has a icon_rest != null
// To use this, add an override in your simplemob subtype of update_transforms with NO . = ..()
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 ae9d1ff188..9cf8c231e0 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,113 @@
/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
+ 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)
+
+ 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/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm
index 3f3d504859..041737ce50 100644
--- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm
@@ -491,6 +491,7 @@
slime_color = "red"
coretype = /obj/item/slime_extract/red
movement_cooldown = 0 // See above.
+ untamable = TRUE // Will enrage if disciplined.
description_info = "This slime is faster than the others. Attempting to discipline this slime will always cause it to go rabid and berserk."
@@ -501,7 +502,7 @@
/mob/living/simple_mob/slime/xenobio/orange
)
- ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime/red // Will enrage if disciplined.
+ ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime
/mob/living/simple_mob/slime/xenobio/green
diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm
index ae2cfe25ee..e68d3b3a7e 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 = 30 // CHOMPedit 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/organs/organ.dm b/code/modules/organs/organ.dm
index 646787d088..c91fa50481 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -28,7 +28,7 @@ var/list/organ_cache = list()
// Damage vars.
var/min_bruised_damage = 10 // Damage before considered bruised
- var/min_broken_damage = 30 // Damage before becoming broken
+ var/min_broken_damage = 60 // Damage before becoming broken CHOMPEdit: Flat doubling of all min_broken_damage
var/max_damage // Damage cap
var/can_reject = 1 // Can this organ reject?
var/rejecting // Is this organ already being rejected?
@@ -361,7 +361,7 @@ var/list/organ_cache = list()
robotize()
robotic = ORGAN_ASSISTED
min_bruised_damage = 15
- min_broken_damage = 35
+ min_broken_damage = 60 // CHOMPEdit: Flat doubling of all min_broken_damage
butcherable = FALSE
/obj/item/organ/proc/digitize() //Used to make the circuit-brain. On this level in the event more circuit-organs are added/tweaks are wanted.
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index 5e3372c57b..94ff5ac52e 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -9,7 +9,7 @@
/obj/item/organ/external
name = "external"
- min_broken_damage = 30
+ min_broken_damage = 60 // CHOMPEdit: Flat doubling of all min_broken_damage
max_damage = 0
dir = SOUTH
organ_tag = "limb"
diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm
index 7d602712a1..e6ff22e596 100644
--- a/code/modules/organs/subtypes/standard.dm
+++ b/code/modules/organs/subtypes/standard.dm
@@ -9,7 +9,7 @@
organ_tag = BP_TORSO
icon_name = "torso"
max_damage = 100
- min_broken_damage = 35
+ min_broken_damage = 60 // CHOMPEdit: Increase all min_broken_damage (Ribs should take more force to break)
w_class = ITEMSIZE_HUGE
body_part = UPPER_TORSO
vital = 1
@@ -59,7 +59,7 @@
organ_tag = BP_GROIN
icon_name = "groin"
max_damage = 100
- min_broken_damage = 35
+ min_broken_damage = 50 // CHOMPEdit: Increase all min_broken_damage
w_class = ITEMSIZE_LARGE
body_part = LOWER_TORSO
vital = 1
@@ -89,7 +89,7 @@
name = "left arm"
icon_name = "l_arm"
max_damage = 80
- min_broken_damage = 30
+ min_broken_damage = 40 // CHOMPEdit: Flat doubling of all min_broken_damage
w_class = ITEMSIZE_NORMAL
body_part = ARM_LEFT
parent_organ = BP_TORSO
@@ -129,7 +129,7 @@
name = "left leg"
icon_name = "l_leg"
max_damage = 80
- min_broken_damage = 30
+ min_broken_damage = 40 // CHOMPEdit: Increase all min_broken_damage
w_class = ITEMSIZE_NORMAL
body_part = LEG_LEFT
icon_position = LEFT
@@ -168,7 +168,7 @@
name = "left foot"
icon_name = "l_foot"
max_damage = 50
- min_broken_damage = 15
+ min_broken_damage = 30 // CHOMPEdit: Increase all min_broken_damage
w_class = ITEMSIZE_SMALL
body_part = FOOT_LEFT
icon_position = LEFT
@@ -213,7 +213,7 @@
name = "left hand"
icon_name = "l_hand"
max_damage = 50
- min_broken_damage = 15
+ min_broken_damage = 30 // CHOMPEdit: Increase all min_broken_damage
w_class = ITEMSIZE_SMALL
body_part = HAND_LEFT
parent_organ = BP_L_ARM
@@ -262,7 +262,7 @@
name = "head"
slot_flags = SLOT_BELT
max_damage = 75
- min_broken_damage = 35
+ min_broken_damage = 50 // CHOMPEdit: Increase all min_broken_damage
w_class = ITEMSIZE_NORMAL
body_part = HEAD
vital = 1
diff --git a/code/modules/organs/subtypes/unathi.dm b/code/modules/organs/subtypes/unathi.dm
index 759395dc37..29dfbcd22c 100644
--- a/code/modules/organs/subtypes/unathi.dm
+++ b/code/modules/organs/subtypes/unathi.dm
@@ -1,16 +1,16 @@
/obj/item/organ/external/chest/unathi
max_damage = 100
- min_broken_damage = 40
+ min_broken_damage = 80 // CHOMPEdit: Flat doubling of all min_broken_damage
encased = "upper ribplates"
/obj/item/organ/external/groin/unathi
max_damage = 100
- min_broken_damage = 40
+ min_broken_damage = 80 // CHOMPEdit: Flat doubling of all min_broken_damage
encased = "lower ribplates"
/obj/item/organ/external/head/unathi
max_damage = 75
- min_broken_damage = 35
+ min_broken_damage = 70 // CHOMPEdit: Flat doubling of all min_broken_damage
eye_icon = "eyes_s"
force = 5
throwforce = 10
diff --git a/code/modules/reagents/reactions/instant/instant_vr.dm b/code/modules/reagents/reactions/instant/instant_vr.dm
index 6c42a76a2a..7780e6c59c 100644
--- a/code/modules/reagents/reactions/instant/instant_vr.dm
+++ b/code/modules/reagents/reactions/instant/instant_vr.dm
@@ -204,242 +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
- blocked += typesof(/mob/living/simple_mob/horror)
- 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
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 86c5451629..38a10d88ec 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -20,7 +20,7 @@
var/vore_egg_type = "egg" // Default egg type.
var/feral = 0 // How feral the mob is, if at all. Does nothing for non xenochimera at the moment.
var/revive_ready = REVIVING_READY // Only used for creatures that have the xenochimera regen ability, so far.
- var/revive_finished = 0 // CHOMPEdit: Only used for xenochimera regen, allows us to find out when the regen will finish.
+ var/revive_finished = 0 // Only used for xenochimera regen, allows us to find out when the regen will finish.
var/metabolism = 0.0015
var/vore_taste = null // What the character tastes like
var/vore_smell = null // What the character smells like
@@ -45,11 +45,10 @@
var/regen_sounds = list(
'sound/effects/mob_effects/xenochimera/regen_1.ogg',
'sound/effects/mob_effects/xenochimera/regen_2.ogg',
- 'sound/effects/mob_effects/xenochimera/regen_3.ogg',
'sound/effects/mob_effects/xenochimera/regen_4.ogg',
+ 'sound/effects/mob_effects/xenochimera/regen_3.ogg',
'sound/effects/mob_effects/xenochimera/regen_5.ogg'
)
- // CHOMPEdit: Regen Sounds
//
// Hook for generic creation of stuff on new creatures
diff --git a/code/modules/xenobio/items/extracts.dm b/code/modules/xenobio/items/extracts.dm
index 3c86a278f6..3a79e3b0ff 100644
--- a/code/modules/xenobio/items/extracts.dm
+++ b/code/modules/xenobio/items/extracts.dm
@@ -1,3 +1,5 @@
+//VOREStation Note - we use different xenobio balance in extracts_vr, keep this unticked.
+
// Base
/obj/item/slime_extract
name = "slime extract"
diff --git a/code/modules/xenobio/items/extracts_vr.dm b/code/modules/xenobio/items/extracts_vr.dm
new file mode 100644
index 0000000000..00abebfcb1
--- /dev/null
+++ b/code/modules/xenobio/items/extracts_vr.dm
@@ -0,0 +1,1661 @@
+// Base
+/obj/item/slime_extract
+ name = "slime extract"
+ desc = "Goo extracted from a slime, which can do different things depending on its color and what it is injected with."
+ icon = 'icons/mob/slimes.dmi'
+ icon_state = "grey slime extract"
+ force = 1
+ w_class = ITEMSIZE_TINY
+ throwforce = 0
+ throw_speed = 3
+ throw_range = 6
+ origin_tech = list(TECH_BIO = 4)
+ var/uses = 1 // uses before it goes inert
+ var/enhanced = FALSE
+ var/slime_type
+ flags = OPENCONTAINER
+
+
+/obj/item/slime_extract/New()
+ ..()
+ create_reagents(60)
+
+/obj/item/slime_extract/attackby(obj/item/O, mob/user)
+ if(istype(O, /obj/item/slimepotion/enhancer))
+ if(enhanced)
+ to_chat(user, "You cannot enhance this extract further!")
+ return ..()
+ to_chat(user, "You apply the enhancer to the slime extract. It may now be reused one more time.")
+ playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
+ uses += 2
+ enhanced = TRUE
+ name = initial(name) // To remove the 'inert' part of the name.
+ qdel(O)
+ else if(istype(O, /obj/item/slimepotion/reinvigoration))
+ to_chat(user, "You apply the reinvigorator to the slime extract. It rapidly expands, creating a brand new slime!")
+ playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
+ new slime_type(get_turf(src))
+ qdel(O)
+ qdel(src)
+ ..()
+
+/obj/item/slime_extract/examine(mob/user)
+ . = ..()
+ if(uses)
+ . += "This extract has [uses] more use\s."
+ else
+ . += "This extract is inert."
+
+/decl/chemical_reaction/instant/slime
+ var/required = null
+
+/decl/chemical_reaction/instant/slime/can_happen(var/datum/reagents/holder)
+ if(holder.my_atom && istype(holder.my_atom, required))
+ var/obj/item/slime_extract/T = holder.my_atom
+ if(T.uses > 0)
+ return ..()
+ return FALSE
+
+/decl/chemical_reaction/instant/slime/on_reaction(var/datum/reagents/holder)
+ var/obj/item/slime_extract/T = holder.my_atom
+ T.uses--
+ if(T.uses <= 0)
+ T.visible_message("[bicon(T)]\The [T] goes inert.")
+ T.name = "inert [initial(T.name)]"
+
+
+// ***************
+// * Grey slimes *
+// ***************
+
+/obj/item/slime_extract/grey
+ name = "grey slime extract"
+ icon_state = "grey slime extract"
+ description_info = "When injected with phoron, this extract creates a grey slime. When injected with blood, this extract creates some monkey cubes. \
+ When injected with water, this extract creates some slime jelly."
+ slime_type = /mob/living/simple_mob/slime/xenobio
+
+
+/decl/chemical_reaction/instant/slime/grey_new_slime
+ name = "Slime Spawn"
+ id = "m_grey_spawn"
+ result = null
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/grey
+
+/decl/chemical_reaction/instant/slime/grey_new_slime/on_reaction(var/datum/reagents/holder)
+ holder.my_atom.visible_message("Infused with phoron, the core begins to quiver and grow, and soon a new baby slime emerges from it!")
+ new /mob/living/simple_mob/slime/xenobio(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/grey_monkey
+ name = "Slime Monkey"
+ id = "m_grey_monkey"
+ result = null
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/grey
+
+/decl/chemical_reaction/instant/slime/grey_monkey/on_reaction(var/datum/reagents/holder)
+ for(var/i = 1 to 4)
+ new /obj/item/weapon/reagent_containers/food/snacks/monkeycube(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/grey_slimejelly
+ name = "Slime Jelly"
+ id = "m_grey_jelly"
+ result = "slimejelly"
+ required_reagents = list("water" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/grey
+
+// ****************
+// * Metal slimes *
+// ****************
+
+/obj/item/slime_extract/metal
+ name = "metal slime extract"
+ icon_state = "metal slime extract"
+ description_info = "When injected with phoron, this extract creates some basic construction materials. When injected with blood, this extract creates some advanced construction materials. \
+ When injected with water, this extract creates some unorthodox materials. When injected with slime jelly, this extract creates some steel."
+ slime_type = /mob/living/simple_mob/slime/xenobio/metal
+
+
+/decl/chemical_reaction/instant/slime/metal_materials_basic
+ name = "Slime Basic Construction Materials"
+ id = "m_metal_basic"
+ result = null
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/metal
+
+/decl/chemical_reaction/instant/slime/metal_materials_basic/on_reaction(var/datum/reagents/holder)
+ for(var/i = 1 to 3)
+ var/type_to_spawn = pickweight(xenobio_metal_materials_normal)
+ new type_to_spawn(get_turf(holder.my_atom), 10)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/metal_materials_adv
+ name = "Slime Advanced Construction Materials"
+ id = "m_metal_adv"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/metal
+
+/decl/chemical_reaction/instant/slime/metal_materials_adv/on_reaction(var/datum/reagents/holder)
+ for(var/i = 1 to 2)
+ var/type_to_spawn = pickweight(xenobio_metal_materials_adv)
+ new type_to_spawn(get_turf(holder.my_atom), 10)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/metal_materials_weird
+ name = "Slime Weird Construction Materials"
+ id = "m_metal_weird"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/metal
+
+/decl/chemical_reaction/instant/slime/metal_materials_weird/on_reaction(var/datum/reagents/holder)
+ for(var/i = 1 to 3)
+ var/type_to_spawn = pickweight(xenobio_metal_materials_weird)
+ new type_to_spawn(get_turf(holder.my_atom), 5)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/metal_materials_steel
+ name = "Slime Weird Construction Materials"
+ id = "m_metal_steel"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/metal
+
+/decl/chemical_reaction/instant/slime/metal_materials_steel/on_reaction(var/datum/reagents/holder)
+ new /obj/item/stack/material/steel(get_turf(holder.my_atom), 25)
+ ..()
+
+// ***************
+// * Blue slimes *
+// ***************
+
+/obj/item/slime_extract/blue
+ name = "blue slime extract"
+ icon_state = "blue slime extract"
+ description_info = "When injected with phoron, this extract creates some frost oil. When injected with blood, this extract creates stability agent that can reduce slime's mutation chance. \
+ When injected with water, this extract creates a clamness wave that calms enraged slimes. When injected with slime jelly, this extract creates some cryotoxin."
+ slime_type = /mob/living/simple_mob/slime/xenobio/blue
+
+
+/decl/chemical_reaction/instant/slime/blue_frostoil
+ name = "Slime Frost Oil"
+ id = "m_blue_frostoil"
+ result = "frostoil"
+ required_reagents = list("phoron" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/blue
+
+
+/decl/chemical_reaction/instant/slime/blue_stability
+ name = "Slime Stability"
+ id = "m_blue_stability"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/blue
+
+/decl/chemical_reaction/instant/slime/blue_stability/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/stabilizer(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/blue_calm
+ name = "Slime Calm"
+ id = "m_blue_calm"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/blue
+
+/decl/chemical_reaction/instant/slime/blue_calm/on_reaction(var/datum/reagents/holder)
+ for(var/mob/living/simple_mob/slime/S in view(get_turf(holder.my_atom)))
+ if(S.stat)
+ continue
+
+ if(istype(S, /mob/living/simple_mob/slime/xenobio))
+ var/mob/living/simple_mob/slime/xenobio/X = S
+ if(X.harmless)
+ continue
+ if(!X.client)
+ X.relax()
+
+ S.remove_modifiers_of_type(/datum/modifier/berserk)
+
+ if(S.client) // Player slimes always have free will.
+ to_chat(S, "An intense wave of relaxing calm is felt from inside, but you remain in control of yourself.")
+
+ for(var/mob/living/carbon/human/H in view(get_turf(holder.my_atom)))
+ if(H.species.name == SPECIES_PROMETHEAN)
+ H.remove_modifiers_of_type(/datum/modifier/berserk)
+ to_chat(H, "An intense wave of relaxing calm is felt from inside, but you remain in control of yourself.")
+
+ playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/blue_cryotoxin
+ name = "Slime Cryotoxin"
+ id = "m_blue_cryotoxin"
+ result = "cryotoxin"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/blue
+
+// *****************
+// * Purple slimes *
+// *****************
+
+/obj/item/slime_extract/purple
+ name = "purple slime extract"
+ icon_state = "purple slime extract"
+ description_info = "When injected with phoron, this extract creates steroid agent, which can be used to increase amount of extracts in a slime. When injected with blood, this extract creates \
+ infertility agent, which can be used to decrease amount of slime's offspring. When injected with water, this extract creates shrink agent, which can be used to turn an adult slime into a baby. \
+ When injected with slime jelly, this extract creates a fertility agent, which can be used to increase amount of slime's offspring."
+ slime_type = /mob/living/simple_mob/slime/xenobio/purple
+
+
+/decl/chemical_reaction/instant/slime/purple_steroid
+ name = "Slime Steroid"
+ id = "m_purple_steroid"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/purple
+
+/decl/chemical_reaction/instant/slime/purple_steroid/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/steroid(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/purple_infertility
+ name = "Slime Infetility"
+ id = "m_purple_infertility"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/purple
+
+/decl/chemical_reaction/instant/slime/purple_infertility/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/infertility(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/purple_shrink
+ name = "Slime Shrink"
+ id = "m_purple_shrink"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/purple
+
+/decl/chemical_reaction/instant/slime/purple_shrink/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/shrink(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/purple_fertility
+ name = "Slime Fetility"
+ id = "m_purple_fertility"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/purple
+
+/decl/chemical_reaction/instant/slime/purple_fertility/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/fertility(get_turf(holder.my_atom))
+ ..()
+
+// *****************
+// * Orange slimes *
+// *****************
+
+/obj/item/slime_extract/orange
+ name = "orange slime extract"
+ icon_state = "orange slime extract"
+ description_info = "When injected with phoron, this extract creates a phoron fire. When injected with blood, this extract creates a heat wave. When injected with water, this extract creates \
+ some smoke. When injected with slime jelly, this extract creates some pyrotoxin."
+ slime_type = /mob/living/simple_mob/slime/xenobio/orange
+
+
+/decl/chemical_reaction/instant/slime/orange_fire
+ name = "Slime Fire"
+ id = "m_orange_fire"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/orange
+
+/decl/chemical_reaction/instant/slime/orange_fire/on_reaction(var/datum/reagents/holder)
+ log_and_message_admins("Orange extract reaction (fire) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]")
+ holder.my_atom.visible_message("\The [src] begins to vibrate violently!")
+ playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1)
+ spawn(5 SECONDS)
+ if(holder && holder.my_atom)
+ var/turf/simulated/T = get_turf(holder.my_atom)
+ if(!istype(T))
+ return
+
+ for(var/turf/simulated/target_turf in view(2, T))
+ target_turf.assume_gas("volatile_fuel", 33, 1500+T0C)
+ target_turf.assume_gas("oxygen", 66, 1500+T0C)
+ spawn(0)
+ target_turf.hotspot_expose(1500+T0C, 400)
+
+ playsound(T, 'sound/effects/phasein.ogg', 75, 1)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/orange_heatwave
+ name = "Slime Heat Wave"
+ id = "m_orange_heatwave"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/orange
+
+/decl/chemical_reaction/instant/slime/orange_heatwave/on_reaction(var/datum/reagents/holder)
+ var/turf/simulated/T = get_turf(holder.my_atom)
+ if(!T) // Nullspace lacks zones.
+ return
+
+ if(!istype(T))
+ return
+
+ var/zone/Z = T.zone
+ if(!Z) // Paranoid.
+ return
+
+ log_and_message_admins("Orange extract reaction (heat wave) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]")
+
+ var/list/nearby_things = view(T)
+
+ // Hurt mobs.
+ for(var/mob/living/L in nearby_things)
+ var/turf/simulated/their_turf = get_turf(L)
+ if(!istype(their_turf)) // Not simulated.
+ continue
+
+ if(!(their_turf in Z.contents)) // Not in the same zone.
+ continue
+
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ var/protection = H.get_heat_protection()
+
+ if(protection < 1)
+ var/cold_factor = abs(protection - 1)
+ H.bodytemperature = between(50, (H.bodytemperature - ((H.bodytemperature + 50) * cold_factor) ), H.bodytemperature)
+
+ if(protection < 0.7)
+ to_chat(L, "A scalding wave of heat overwhelms you!")
+ else
+ to_chat(L, "A scalding wave of heat passes by you, as your armor protects you from it.")
+ continue
+
+ // Now make it very cold.
+ var/datum/gas_mixture/env = T.return_air()
+ if(env)
+ // This is most likely physically impossible but when has that stopped slimes before?
+ env.add_thermal_energy(15 * 1000 * 1000)
+
+ playsound(T, 'sound/effects/phasein.ogg', 75, 1)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/orange_smoke
+ name = "Slime Smoke"
+ id = "m_orange_smoke"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/orange
+
+/decl/chemical_reaction/instant/slime/orange_smoke/on_reaction(var/datum/reagents/holder)
+ var/location = get_turf(holder.my_atom)
+ var/datum/effect/effect/system/smoke_spread/chem/S = new /datum/effect/effect/system/smoke_spread/chem
+ S.attach(location)
+ S.set_up(holder, 120, 0, location)
+ playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3)
+ spawn(0)
+ S.start()
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/orange_pyrotoxin
+ name = "Slime Pyrotoxin"
+ id = "m_orange_pyrotoxin"
+ result = "thermite_v"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/orange
+
+// *****************
+// * Yellow slimes *
+// *****************
+
+/obj/item/slime_extract/yellow
+ name = "yellow slime extract"
+ icon_state = "yellow slime extract"
+ description_info = "When injected with phoron, this extract creates a lightning strike. When injected with blood, this extract creates a slime flashlight. When injected with water \
+ this extract creates an EMP puls. When injected with slime jelly, this extract creates a self-charging slime battery."
+ slime_type = /mob/living/simple_mob/slime/xenobio/yellow
+
+
+/decl/chemical_reaction/instant/slime/yellow_lightning
+ name = "Slime Lightning"
+ id = "m_yellow_lightning"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/yellow
+
+/decl/chemical_reaction/instant/slime/yellow_lightning/on_reaction(var/datum/reagents/holder)
+ log_and_message_admins("Yellow extract reaction (lightning) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]")
+ holder.my_atom.visible_message("\The [src] begins to vibrate violently!")
+ playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1)
+ spawn(5 SECONDS)
+ if(holder && holder.my_atom)
+ lightning_strike(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/yellow_flashlight
+ name = "Slime Flashlight"
+ id = "m_yellow_flashlight"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/yellow
+
+/decl/chemical_reaction/instant/slime/yellow_flashlight/on_reaction(var/datum/reagents/holder)
+ new /obj/item/device/flashlight/slime(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/yellow_emp
+ name = "Slime EMP"
+ id = "m_yellow_emp"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/yellow
+
+/decl/chemical_reaction/instant/slime/yellow_emp/on_reaction(var/datum/reagents/holder)
+ log_and_message_admins("Yellow extract reaction (emp) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]")
+ holder.my_atom.visible_message("\The [src] begins to vibrate violently!")
+ playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1)
+ spawn(5 SECONDS)
+ if(holder && holder.my_atom)
+ empulse(get_turf(holder.my_atom), 2, 4, 7, 10) // As strong as a normal EMP grenade.
+ playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/yellow_battery
+ name = "Slime Cell"
+ id = "m_yellow_cell"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/yellow
+
+/decl/chemical_reaction/instant/slime/yellow_battery/on_reaction(var/datum/reagents/holder)
+ new /obj/item/weapon/cell/slime(get_turf(holder.my_atom))
+ ..()
+
+// ***************
+// * Gold slimes *
+// ***************
+
+/obj/item/slime_extract/gold
+ name = "gold slime extract"
+ icon_state = "gold slime extract"
+ description_info = "When injected with phoron, this extract creates a few random creatures. When injected with blood, this extract a random hostile creature. \
+ When injected with water, this extract creates a random passive creature. When injected with slime jelly, this extract creates some gold."
+ slime_type = /mob/living/simple_mob/slime/xenobio/gold
+
+
+/decl/chemical_reaction/instant/slime/gold_random_mobs
+ name = "Slime Random Mobs"
+ id = "m_gold_random_mobs"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/gold
+
+/decl/chemical_reaction/instant/slime/gold_random_mobs/on_reaction(var/datum/reagents/holder)
+ log_and_message_admins("Gold extract reaction (random mobs) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]")
+ var/type_to_spawn
+ var/list/all_spawnable_types = list()
+ all_spawnable_types += xenobio_gold_mobs_safe
+ all_spawnable_types += xenobio_gold_mobs_hostile
+ all_spawnable_types += xenobio_gold_mobs_birds
+ for(var/j = 1, j <= 3, j++)
+ if(prob(1))
+ type_to_spawn = pickweight(xenobio_gold_mobs_bosses)
+ else
+ type_to_spawn = pickweight(all_spawnable_types)
+
+ var/mob/living/C = new type_to_spawn(get_turf(holder.my_atom))
+ for(var/l = 1, l <= rand(1, 3), l++)
+ step(C, pick(NORTH,SOUTH,EAST,WEST))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/gold_hostile_mob
+ name = "Slime Hostile Mob"
+ id = "m_gold_hostile_mob"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/gold
+
+/decl/chemical_reaction/instant/slime/gold_hostile_mob/on_reaction(var/datum/reagents/holder)
+ log_and_message_admins("Gold extract reaction (dangerous mob) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]")
+ var/type_to_spawn = pickweight(xenobio_gold_mobs_hostile)
+ var/mob/living/C = new type_to_spawn(get_turf(holder.my_atom))
+ for(var/l = 1, l <= rand(1, 3), l++)
+ step(C, pick(NORTH,SOUTH,EAST,WEST))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/gold_safe_mob
+ name = "Slime Safe Mob"
+ id = "m_gold_safe_mob"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/gold
+
+/decl/chemical_reaction/instant/slime/gold_safe_mob/on_reaction(var/datum/reagents/holder)
+ var/type_to_spawn
+ if(prob(100/(xenobio_gold_mobs_safe.len + 1)))
+ type_to_spawn = pickweight(xenobio_gold_mobs_birds)
+ else
+ type_to_spawn = pickweight(xenobio_gold_mobs_safe)
+ var/mob/living/C = new type_to_spawn(get_turf(holder.my_atom))
+ for(var/l = 1, l <= rand(1, 3), l++)
+ step(C, pick(NORTH,SOUTH,EAST,WEST))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/gold_materials_gold
+ name = "Slime Gold"
+ id = "m_gold_gold"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/gold
+
+/decl/chemical_reaction/instant/slime/gold_materials_gold/on_reaction(var/datum/reagents/holder)
+ new /obj/item/stack/material/gold(get_turf(holder.my_atom), 10)
+ ..()
+
+// *****************
+// * Silver slimes *
+// *****************
+
+/obj/item/slime_extract/silver
+ name = "silver slime extract"
+ icon_state = "silver slime extract"
+ description_info = "When injected with phoron, this extract creates some basic science materials. When injected with blood, this extract creates some advanced science materials. When injected \
+ with water, this extract creates some completely random materials. When injected with slime jelly, this extract creates some silver."
+ slime_type = /mob/living/simple_mob/slime/xenobio/silver
+
+
+/decl/chemical_reaction/instant/slime/silver_materials_basic
+ name = "Slime Basic Science Materials"
+ id = "m_silver_basic"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/silver
+
+/decl/chemical_reaction/instant/slime/silver_materials_basic/on_reaction(var/datum/reagents/holder)
+ for(var/i = 1 to 2)
+ var/type_to_spawn = pickweight(xenobio_silver_materials_basic)
+ new type_to_spawn(get_turf(holder.my_atom), 5)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/silver_materials_adv
+ name = "Slime Advanced Science Materials"
+ id = "m_silver_adv"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/silver
+
+/decl/chemical_reaction/instant/slime/silver_materials_adv/on_reaction(var/datum/reagents/holder)
+ var/type_to_spawn = pickweight(xenobio_silver_materials_adv)
+ new type_to_spawn(get_turf(holder.my_atom), 3)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/silver_materials_random
+ name = "Slime Random Materials"
+ id = "m_silver_random"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/silver
+
+/decl/chemical_reaction/instant/slime/silver_materials_random/on_reaction(var/datum/reagents/holder)
+ var/type_to_spawn
+ var/amount = 5
+ var/all_spawnable_types = list()
+ all_spawnable_types += xenobio_metal_materials_normal
+ all_spawnable_types += xenobio_metal_materials_adv
+ all_spawnable_types += xenobio_metal_materials_weird
+ all_spawnable_types += xenobio_silver_materials_basic
+ all_spawnable_types += xenobio_silver_materials_adv
+ all_spawnable_types += xenobio_silver_materials_special
+ for(var/i = 1 to 3)
+ type_to_spawn = pickweight(all_spawnable_types)
+ if(type_to_spawn in xenobio_silver_materials_special)
+ amount = 1
+ new type_to_spawn(get_turf(holder.my_atom), amount)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/silver_materials_silver
+ name = "Slime Silver"
+ id = "m_silver_silver"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/silver
+
+/decl/chemical_reaction/instant/slime/silver_materials_silver/on_reaction(var/datum/reagents/holder)
+ new /obj/item/stack/material/silver(get_turf(holder.my_atom), 10)
+ ..()
+
+// **********************
+// * Dark Purple slimes *
+// **********************
+
+/obj/item/slime_extract/dark_purple
+ name = "dark purple slime extract"
+ icon_state = "dark purple slime extract"
+ description_info = "When injected with water, this extract creates some phoron. When injected with slime jelly, this extract creates some blood."
+ slime_type = /mob/living/simple_mob/slime/xenobio/dark_purple
+
+
+/decl/chemical_reaction/instant/slime/dark_purple_phoron
+ name = "Slime Phoron"
+ id = "m_darkpurple_phoron"
+ result = "phoron"
+ required_reagents = list("water" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/dark_purple
+
+
+/decl/chemical_reaction/instant/slime/dark_purple_blood
+ name = "Slime Blood"
+ id = "m_darkpurple_blood"
+ result = "blood"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/dark_purple
+
+// ********************
+// * Dark Blue slimes *
+// ********************
+
+/obj/item/slime_extract/dark_blue
+ name = "dark blue slime extract"
+ icon_state = "dark blue slime extract"
+ description_info = "When injected with phoron, this extract creates a cold wave. When injected with blood, this extract grants ability to resist temperature for a while. \
+ When injected with water, the water freezes. When injected with slime jelly, this extract creates a death agent, which can be used to instantly kill a slime."
+ slime_type = /mob/living/simple_mob/slime/xenobio/dark_blue
+
+
+/decl/chemical_reaction/instant/slime/dark_blue_cold_snap
+ name = "Slime Cold Snap"
+ id = "m_darkblue_coldsnap"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/dark_blue
+
+// This iterates over a ZAS zone's contents, so that things seperated in other zones aren't subjected to the temperature drop.
+/decl/chemical_reaction/instant/slime/dark_blue_cold_snap/on_reaction(var/datum/reagents/holder)
+ var/turf/simulated/T = get_turf(holder.my_atom)
+ if(!T) // Nullspace lacks zones.
+ return
+
+ if(!istype(T))
+ return
+
+ var/zone/Z = T.zone
+ if(!Z) // Paranoid.
+ return
+
+ log_and_message_admins("Dark Blue extract reaction (cold snap) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]")
+
+ var/list/nearby_things = view(T)
+
+ // Hurt mobs.
+ for(var/mob/living/L in nearby_things)
+ var/turf/simulated/their_turf = get_turf(L)
+ if(!istype(their_turf)) // Not simulated.
+ continue
+
+ if(!(their_turf in Z.contents)) // Not in the same zone.
+ continue
+
+ if(istype(L, /mob/living/simple_mob/slime))
+ var/mob/living/simple_mob/slime/S = L
+ if(S.cold_resist >= 1) // Immune to cold.
+ to_chat(S, "A chill is felt around you, however it cannot harm you.")
+ continue
+ if(S.client) // Don't instantly kill player slimes.
+ to_chat(S, "You feel your body crystalize as an intense chill overwhelms you!")
+ S.inflict_cold_damage(100)
+ else
+ S.inflict_cold_damage(200) // Metal slimes can survive this 'slime nuke'.
+ continue
+
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ var/protection = H.get_cold_protection()
+
+ if(protection < 1)
+ var/cold_factor = abs(protection - 1)
+ H.bodytemperature = between(50, (H.bodytemperature - ((H.bodytemperature - 50) * cold_factor) ), H.bodytemperature)
+
+ if(protection < 0.7)
+ to_chat(L, "A chilling wave of cold overwhelms you!")
+ else
+ to_chat(L, "A chilling wave of cold passes by you, as your armor protects you from it.")
+ continue
+
+ // Now make it very cold.
+ var/datum/gas_mixture/env = T.return_air()
+ if(env)
+ // This is most likely physically impossible but when has that stopped slimes before?
+ env.add_thermal_energy(-10 * 1000 * 1000) // For a moderately sized room this doesn't actually lower it that much.
+
+ playsound(T, 'sound/effects/phasein.ogg', 75, 1)
+
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/dark_blue_temp_resist
+ name = "Slime Temperature Resistance"
+ id = "m_darkblue_temperature_resist"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/dark_blue
+
+/decl/chemical_reaction/instant/slime/dark_blue_temp_resist/on_reaction(var/datum/reagents/holder)
+ for(var/mob/living/L in range(1, holder.my_atom))
+ L.add_modifier(/datum/modifier/slime_temp_resist, 5 MINUTES, src)
+ ..()
+
+/datum/modifier/slime_temp_resist
+ name = "slime temperature resistance"
+ desc = "You feel immune to heat and cold."
+ mob_overlay_state = "corona"
+
+ on_created_text = "A shield of goo surround you. It makes you feel protected against temperature."
+ on_expired_text = "The shield of goo has faded, and you feel vulnerable to temperature again."
+ stacks = MODIFIER_STACK_EXTEND
+
+ incoming_fire_damage_percent = 0.5
+ heat_protection = 1
+ cold_protection = 1
+
+
+/decl/chemical_reaction/instant/slime/dark_blue_ice
+ name = "Slime Ice"
+ id = "m_darkblue_ice"
+ result = "ice"
+ required_reagents = list("water" = 5)
+ result_amount = 5
+ required = /obj/item/slime_extract/dark_blue
+
+
+/decl/chemical_reaction/instant/slime/dark_blue_death
+ name = "Slime Death"
+ id = "m_darkblue_death"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/dark_blue
+
+/decl/chemical_reaction/instant/slime/dark_blue_death/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/death(get_turf(holder.my_atom))
+ ..()
+
+// **************
+// * Red slimes *
+// **************
+
+/obj/item/slime_extract/red
+ name = "red slime extract"
+ icon_state = "red slime extract"
+ description_info = "When injected with phoron, this extract creates a mutation agent, that can be used to increase a slime's mutation chance. When injected with blood, this extract causes \
+ nearby slimes to fall into rage. When injected with water, this extract creates some hot sauce. When injected with slime jelly, this extract creates a ferality agent, which makes slimes \
+ unreceptive to discipline."
+ slime_type = /mob/living/simple_mob/slime/xenobio/red
+
+
+/decl/chemical_reaction/instant/slime/red_mutation
+ name = "Slime Mutation"
+ id = "m_red_mutation"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/red
+
+/decl/chemical_reaction/instant/slime/red_mutation/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/mutator(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/red_enrage
+ name = "Slime Enrage"
+ id = "m_red_enrage"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/red
+
+/decl/chemical_reaction/instant/slime/red_enrage/on_reaction(var/datum/reagents/holder)
+ for(var/mob/living/simple_mob/slime/S in view(get_turf(holder.my_atom)))
+ if(S.stat)
+ continue
+
+ if(istype(S, /mob/living/simple_mob/slime/xenobio))
+ var/mob/living/simple_mob/slime/xenobio/X = S
+ if(X.harmless)
+ continue
+ if(!X.client)
+ X.enrage()
+
+ S.add_modifier(/datum/modifier/berserk, 30 SECONDS)
+
+ if(S.client) // Player slimes always have free will.
+ to_chat(S, "An intense wave of rage is felt from inside, but you remain in control of yourself.")
+
+ for(var/mob/living/carbon/human/H in view(get_turf(holder.my_atom)))
+ if(H.species.name == SPECIES_PROMETHEAN)
+ H.add_modifier(/datum/modifier/berserk, 30 SECONDS)
+ to_chat(H, "An intense wave of rage is felt from inside, but you remain in control of yourself.")
+
+ log_and_message_admins("Red extract reaction (enrage) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]")
+
+ playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/red_hotsauce
+ name = "Slime Hot Sauce"
+ id = "m_red_hotsauce"
+ result = "capsaicin"
+ required_reagents = list("water" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/red
+
+
+/decl/chemical_reaction/instant/slime/red_ferality
+ name = "Slime Ferality"
+ id = "m_red_ferality"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/red
+
+/decl/chemical_reaction/instant/slime/red_ferality/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/ferality(get_turf(holder.my_atom))
+ ..()
+
+// ***************
+// * Green slime *
+// ***************
+
+/obj/item/slime_extract/green
+ name = "green slime extract"
+ icon_state = "green slime extract"
+ description_info = "When injected with phoron, this extract creates a single radioactive pulse. When injected with blood, this extract creates a radioactive glob. When injected with water \
+ this extract creates some radium. When injected with slime jelly, this extract creates some uranium."
+ slime_type = /mob/living/simple_mob/slime/xenobio/green
+
+
+/decl/chemical_reaction/instant/slime/green_radpulse
+ name = "Slime Radiation Pulse"
+ id = "m_green_radpulse"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/green
+
+/decl/chemical_reaction/instant/slime/green_radpulse/on_reaction(var/datum/reagents/holder)
+ log_and_message_admins("Green extract reaction (radiation pulse) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]")
+ playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1)
+ holder.my_atom.visible_message("\The [holder.my_atom] begins to vibrate violently!")
+ spawn(5 SECONDS)
+ SSradiation.flat_radiate(src, 30, 7, TRUE)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/green_emitter
+ name = "Slime Radiation Emitter"
+ id = "m_green_emitter"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/green
+
+/decl/chemical_reaction/instant/slime/green_emitter/on_reaction(var/datum/reagents/holder)
+ log_and_message_admins("Green extract reaction (radiation emitter) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]")
+ new /obj/item/slime_irradiator(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/green_radium
+ name = "Slime Radium"
+ id = "m_green_radium"
+ result = "radium"
+ required_reagents = list("water" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/green
+
+
+/decl/chemical_reaction/instant/slime/green_uranium
+ name = "Slime Uranium"
+ id = "m_green_uranium"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/green
+
+/decl/chemical_reaction/instant/slime/green_uranium/on_reaction(var/datum/reagents/holder)
+ new /obj/item/stack/material/uranium(get_turf(holder.my_atom), 10)
+ ..()
+
+// ***************
+// * Pink slimes *
+// ***************
+
+/obj/item/slime_extract/pink
+ name = "pink slime extract"
+ icon_state = "pink slime extract"
+ description_info = "When injected with phoron, this extract creates some bone fixing agent. When injected with blood, this extract creates some clotting agent. When injected with water, this \
+ extract creates some organ healing agent. When injected with slime jelly, this extract creates a powerful regenerative wave."
+ slime_type = /mob/living/simple_mob/slime/xenobio/pink
+
+
+/decl/chemical_reaction/instant/slime/pink_bone_fix
+ name = "Slime Bone Med"
+ id = "m_pink_bone_fixer"
+ result = "slime_bone_fixer"
+ required_reagents = list("phoron" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/pink
+
+
+/decl/chemical_reaction/instant/slime/pink_clotting
+ name = "Slime Clotting Med"
+ id = "m_pink_clotting"
+ result = "slime_bleed_fixer"
+ required_reagents = list("blood" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/pink
+
+
+/decl/chemical_reaction/instant/slime/pink_organ_fix
+ name = "Slime Organ Med"
+ id = "m_pink_organ_fixer"
+ result = "slime_organ_fixer"
+ required_reagents = list("water" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/pink
+
+
+/decl/chemical_reaction/instant/slime/pink_heal_pulse
+ name = "Slime Heal Pulse"
+ id = "m_pink_heal_pulse"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/pink
+
+/decl/chemical_reaction/instant/slime/pink_heal_pulse/on_reaction(var/datum/reagents/holder)
+ for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
+ to_chat(C, "A wave of energy suddenly invigorates you.")
+ C.adjustBruteLoss(-25)
+ C.adjustFireLoss(-25)
+ C.adjustToxLoss(-25)
+ C.adjustOxyLoss(-25)
+ C.adjustBrainLoss(-25)
+ C.adjustCloneLoss(-25)
+ C.updatehealth()
+ ..()
+
+// **************
+// * Oil slimes *
+// **************
+
+/obj/item/slime_extract/oil
+ name = "oil slime extract"
+ icon_state = "oil slime extract"
+ description_info = "When injected with phoron, this extract creates some fuel. When injected with blood, this extract creates some cooking oil. When injected with water, this extract \
+ creates a fake explosion sound. When injected with slime jelly, this extract explodes."
+ slime_type = /mob/living/simple_mob/slime/xenobio/oil
+
+
+/decl/chemical_reaction/instant/slime/oil_fuel
+ name = "Slime Fuel"
+ id = "m_oil_fuel"
+ result = "fuel"
+ required_reagents = list("phoron" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/oil
+
+
+/decl/chemical_reaction/instant/slime/oil_oil
+ name = "Slime Oil"
+ id = "m_oil_oil"
+ result = "cookingoil"
+ required_reagents = list("blood" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/oil
+
+
+/decl/chemical_reaction/instant/slime/oil_fakesplosion
+ name = "Slime Fake Explosion"
+ id = "m_oil_fakeboom"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/oil
+
+/decl/chemical_reaction/instant/slime/oil_fakesplosion/on_reaction(var/datum/reagents/holder)
+ playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1)
+ explosion(get_turf(holder.my_atom), 0, 0, 0)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/oil_explosion
+ name = "Slime Explosion"
+ id = "m_oil_boom"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/oil
+
+/decl/chemical_reaction/instant/slime/oil_explosion/on_reaction(var/datum/reagents/holder)
+ ..()
+ var/obj/item/slime_extract/E = holder.my_atom
+ var/power = 1
+ if(E.enhanced)
+ power++
+ E.uses = 0
+
+ playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1)
+ holder.my_atom.visible_message("\The [holder.my_atom] begins to vibrate violently!")
+ log_and_message_admins("Oil extract reaction (explosion) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]")
+
+ spawn(5 SECONDS)
+ if(holder && holder.my_atom)
+ explosion(get_turf(holder.my_atom), 1 * power, 3 * power, 6 * power)
+
+ if(holder && holder.my_atom) // Explosion may or may not have deleted the extract.
+ qdel(holder.my_atom)
+
+// ********************
+// * Bluespace slimes *
+// ********************
+
+/obj/item/slime_extract/bluespace
+ name = "bluespace slime extract"
+ icon_state = "bluespace slime extract"
+ description_info = "When injected with phoron, this extract creates some bluespace crystals. When injected with blood, this extract creates a bluespace bag. When injected with water, this \
+ extract causes random teleportation. When injected with slime jelly, this extract creates a disposable precise teleportation tool."
+ slime_type = /mob/living/simple_mob/slime/xenobio/bluespace
+
+
+/decl/chemical_reaction/instant/slime/bluespace_crystals
+ name = "Slime Bluespace Crystals"
+ id = "m_bs_crystals"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/bluespace
+
+/decl/chemical_reaction/instant/slime/bluespace_crystals/on_reaction(var/datum/reagents/holder)
+ for(var/i = 1 to 5)
+ new /obj/item/slime_crystal(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/bluespace_pouch
+ name = "Slime Bluespace Pouch"
+ id = "m_bs_pouch"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/bluespace
+
+/decl/chemical_reaction/instant/slime/bluespace_pouch/on_reaction(var/datum/reagents/holder)
+ new /obj/item/weapon/storage/backpack/holding/slime(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/bluespace_chaotic_tele
+ name = "Slime Bluespace Chaos"
+ id = "m_bs_chaos"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/bluespace
+
+/decl/chemical_reaction/instant/slime/bluespace_chaotic_tele/on_reaction(var/datum/reagents/holder)
+ log_and_message_admins("Bluespace extract reaction (chaos teleport) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]")
+ for(var/mob/living/M in range(2,get_turf(holder.my_atom)))
+ if(M.buckled)
+ M.buckled.unbuckle_mob()
+
+ var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
+ sparks.set_up(3, 0, get_turf(M))
+ sparks.start()
+
+ M.forceMove(pick(trange(50, get_turf(holder.my_atom))))
+
+ sparks = new /datum/effect/effect/system/spark_spread()
+ sparks.set_up(3, 0, M.loc)
+ sparks.start()
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/bluespace_teleporter
+ name = "Slime Bluespace Teleporter"
+ id = "m_bs_teleporter"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/bluespace
+
+/decl/chemical_reaction/instant/slime/bluespace_teleporter/on_reaction(var/datum/reagents/holder)
+ new /obj/item/weapon/disposable_teleporter/slime(get_turf(holder.my_atom))
+ ..()
+
+// *******************
+// * Cerulean slimes *
+// *******************
+
+/obj/item/slime_extract/cerulean
+ name = "cerulean slime extract"
+ icon_state = "cerulean slime extract"
+ description_info = "When injected with phoron, this extract creates an enhancer agent, which can be used to increase amount of uses any extract has once. When injected with blood, this extact \
+ creates an invigoration agent, which can be used to create a slime out of an extract. When injected with water, this extract creates a mimic agent, which can copy properties of other agents. \
+ When injected with slime jelly, this extract creates a random agent."
+ slime_type = /mob/living/simple_mob/slime/xenobio/cerulean
+
+
+/decl/chemical_reaction/instant/slime/cerulean_enhancer
+ name = "Slime Enhancer"
+ id = "m_cerulean_enhancer"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/cerulean
+
+/decl/chemical_reaction/instant/slime/cerulean_enhancer/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/enhancer(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/cerulean_reinvigoration
+ name = "Slime Reinvigoration"
+ id = "m_cerulean_reinvigoration"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/cerulean
+
+/decl/chemical_reaction/instant/slime/cerulean_reinvigoration/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/reinvigoration(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/cerulean_potion_mimic
+ name = "Slime Potion Mimic"
+ id = "m_cerulean_potion_mimic"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/cerulean
+
+/decl/chemical_reaction/instant/slime/cerulean_potion_mimic/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/mimic(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/cerulean_random_potion
+ name = "Slime Random Potion"
+ id = "m_cerulean_random_potion"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/cerulean
+
+/decl/chemical_reaction/instant/slime/cerulean_random_potion/on_reaction(var/datum/reagents/holder)
+ var/spawn_type = pickweight(xenobio_cerulean_potions)
+ new spawn_type(get_turf(holder.my_atom))
+ ..()
+
+// ****************
+// * Amber slimes *
+// ****************
+
+/obj/item/slime_extract/amber
+ name = "amber slime extract"
+ icon_state = "amber slime extract"
+ description_info = "When injected with phoron, this extract creates a feeding agent, which can be used to instantly split a slime. When injected with blood, this extract creates some food. \
+ When injected with water, this extract creates some edible slime globs. When injected with slime jelly, this extract creates some super-nutritious slime goop."
+ slime_type = /mob/living/simple_mob/slime/xenobio/amber
+
+
+/decl/chemical_reaction/instant/slime/amber_slimefood
+ name = "Slime Feeding"
+ id = "m_amber_slime_food"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/amber
+
+/decl/chemical_reaction/instant/slime/amber_slimefood/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/feeding(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/amber_random_food
+ name = "Slime Random Food"
+ id = "m_amber_random_food"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/amber
+
+/decl/chemical_reaction/instant/slime/amber_random_food/on_reaction(var/datum/reagents/holder)
+ var/list/edibles = subtypesof(/obj/item/weapon/reagent_containers/food/snacks)
+
+ playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
+
+ for(var/i = 1 to rand(2, 4))
+ var/chosen = pick(edibles)
+ var/obj/B = new chosen
+ if(B)
+ B.loc = get_turf(holder.my_atom)
+ if(prob(50))
+ for(var/j = 1, j <= rand(1, 3), j++)
+ step(B, pick(NORTH,SOUTH,EAST,WEST))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/amber_snack
+ name = "Slime Snack"
+ id = "m_amber_snack"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/amber
+
+/decl/chemical_reaction/instant/slime/amber_snack/on_reaction(var/datum/reagents/holder)
+ for(var/i = 1 to rand(3, 5))
+ new /obj/item/weapon/reagent_containers/food/snacks/slime(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/amber_goop
+ name = "Slime Goop"
+ id = "m_amber_goop"
+ result = "slime_goop"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/amber
+
+// *******************
+// * Sapphire slimes *
+// *******************
+
+/obj/item/slime_extract/sapphire
+ name = "sapphire slime extract"
+ icon_state = "sapphire slime extract"
+ description_info = "When injected with phoron, this extract creates a promethean cube, which can be used to create a new promethean. When injected with blood, this extract creates some mutation \
+ toxin. When injected with water, this extract creates some plushies. When injected with slime jelly, this extract creates a sapience agent, which can be used to develop sentience in \
+ various creatures."
+ slime_type = /mob/living/simple_mob/slime/xenobio/sapphire
+
+
+/decl/chemical_reaction/instant/slime/sapphire_promethean
+ name = "Slime Promethean"
+ id = "m_sapphire_promethean"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/sapphire
+
+/decl/chemical_reaction/instant/slime/sapphire_promethean/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slime_cube(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/sapphire_mutation
+ name = "Slime Mutation Toxins"
+ id = "m_sapphire_mutation_tox"
+ result = "mutationtoxin"
+ required_reagents = list("blood" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/sapphire
+
+
+/decl/chemical_reaction/instant/slime/sapphire_plushies
+ name = "Slime Plushies"
+ id = "m_sapphire_plushies"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/sapphire
+
+/decl/chemical_reaction/instant/slime/sapphire_plushies/on_reaction(var/datum/reagents/holder)
+ var/spawn_type
+ var/list/possible_types = subtypesof(/obj/item/toy/plushie)
+ possible_types -= subtypesof(/obj/item/toy/plushie/fluff)
+ possible_types -= subtypesof(/obj/item/toy/plushie/therapy)
+ for(var/i = 1 to rand(3, 5))
+ spawn_type = pickweight(possible_types)
+ new spawn_type(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/sapphire_sapience
+ name = "Slime Sapience"
+ id = "m_sapphire_sapience"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/sapphire
+
+/decl/chemical_reaction/instant/slime/sapphire_sapience/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/sapience(get_turf(holder.my_atom))
+ ..()
+
+// ***************
+// * Ruby slimes *
+// ***************
+
+/obj/item/slime_extract/ruby
+ name = "ruby slime extract"
+ icon_state = "ruby slime extract"
+ description_info = "When injected with phoron, this extract grants extra strength for a time. When injected with blood, this extract causes a wave of pulling force. When injected with water, \
+ this extract creates some brute juice. When injected with slime jelly, this extract creates a pushing force."
+ slime_type = /mob/living/simple_mob/slime/xenobio/ruby
+
+/decl/chemical_reaction/instant/slime/ruby_swole
+ name = "Slime Strength"
+ id = "m_ruby_strength"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/ruby
+
+/decl/chemical_reaction/instant/slime/ruby_swole/on_reaction(var/datum/reagents/holder)
+ for(var/mob/living/L in range(1, holder.my_atom))
+ L.add_modifier(/datum/modifier/slime_strength, 10 MINUTES, src)
+ ..()
+
+/datum/modifier/slime_strength
+ name = "slime strength"
+ desc = "You feel much stronger than usual."
+ mob_overlay_state = "pink_sparkles"
+
+ on_created_text = "Twinkling spores of goo surround you. It makes you feel stronger and more robust."
+ on_expired_text = "The spores of goo have faded, and you feel your strength returning to what it was before."
+ stacks = MODIFIER_STACK_EXTEND
+
+ max_health_flat = 50
+ outgoing_melee_damage_percent = 2
+ disable_duration_percent = 0.5
+ incoming_damage_percent = 0.75
+
+
+/decl/chemical_reaction/instant/slime/ruby_pull
+ name = "Slime Pull"
+ id = "m_ruby_pull"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/ruby
+
+/decl/chemical_reaction/instant/slime/ruby_pull/on_reaction(var/datum/reagents/holder)
+ var/location = get_turf(holder.my_atom)
+ playsound(location, 'sound/weapons/gauss_shoot.ogg', 50, 1)
+ var/datum/effect/effect/system/grav_pull/s = new /datum/effect/effect/system/grav_pull
+ s.set_up(3, 3, location)
+ s.start()
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/ruby_brute_juice
+ name = "Slime Brute Juice"
+ id = "m_ruby_brute_juice"
+ result = "berserkmed"
+ required_reagents = list("water" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/ruby
+
+
+/decl/chemical_reaction/instant/slime/ruby_push
+ name = "Slime Push"
+ id = "m_ruby_push"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/ruby
+
+/decl/chemical_reaction/instant/slime/ruby_push/on_reaction(var/datum/reagents/holder)
+ var/location = get_turf(holder.my_atom)
+ for(var/X in orange(3, location))
+ var/atom/movable/AM = X
+ if(!ismovable(X) || istype(X, /obj/effect/overlay))
+ continue
+
+ if(isobj(X))
+ var/obj/O = X
+ if(O.anchored)
+ continue
+
+ var/throwdir = get_dir(location, AM)
+ AM.throw_at(get_edge_target_turf(AM, throwdir), 3, 1, src)
+
+ playsound(location, 'sound/weapons/gauss_shoot.ogg', 50, 1)
+ ..()
+
+// *****************
+// * Emerald slime *
+// *****************
+
+/obj/item/slime_extract/emerald
+ name = "emerald slime extract"
+ icon_state = "emerald slime extract"
+ description_info = "When injected with phoron, this extract grants extra agility, making you more evasive and fast-acting for a while. When injected with blood, this extract grants extra speed \
+ for a short time. When injected with water, this extract creates some hyperzine. When injected with slime jelly, this extract causes area around to become slippery for a time."
+ slime_type = /mob/living/simple_mob/slime/xenobio/emerald
+
+
+/decl/chemical_reaction/instant/slime/emerald_agility
+ name = "Slime Agility"
+ id = "m_emerald_agility"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/emerald
+
+/decl/chemical_reaction/instant/slime/emerald_agility/on_reaction(var/datum/reagents/holder)
+ for(var/mob/living/L in range(1, holder.my_atom))
+ L.add_modifier(/datum/modifier/slime_agility, 10 MINUTES, src)
+ ..()
+
+/datum/modifier/slime_agility
+ name = "slime agility"
+ desc = "You feel much more agile than usual."
+ mob_overlay_state = "green_sparkles"
+
+ on_created_text = "Twinkling spores of goo surround you. It makes you feel more agile."
+ on_expired_text = "The spores of goo have faded, and you feel your agility returning to what it was before."
+ stacks = MODIFIER_STACK_EXTEND
+
+ evasion = 45
+ attack_speed_percent = 0.5
+ disable_duration_percent = 0.5
+
+
+/decl/chemical_reaction/instant/slime/emerald_speed
+ name = "Slime Speed"
+ id = "m_emerald_speed"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/emerald
+
+/decl/chemical_reaction/instant/slime/emerald_speed/on_reaction(var/datum/reagents/holder)
+ for(var/mob/living/L in range(1, holder.my_atom))
+ L.add_modifier(/datum/modifier/slime_speed, 1 MINUTE, src)
+ ..()
+
+/datum/modifier/slime_speed
+ name = "slime speed"
+ desc = "You feel much faster than usual."
+ mob_overlay_state = "haste"
+
+ on_created_text = "Twinkling spores of goo surround you. It makes you feel very fast."
+ on_expired_text = "The spores of goo have faded, and you feel your speed returning to what it was before."
+ stacks = MODIFIER_STACK_EXTEND
+
+ slowdown = -3
+
+
+/decl/chemical_reaction/instant/slime/emerald_hyperzine
+ name = "Slime Hyperzine"
+ id = "m_emerald_hyperzine"
+ result = "hyperzine"
+ required_reagents = list("water" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/emerald
+
+
+/decl/chemical_reaction/instant/slime/emerald_hell
+ name = "Slime Hell"
+ id = "m_emerald_hell"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/emerald
+
+/decl/chemical_reaction/instant/slime/emerald_hell/on_reaction(var/datum/reagents/holder)
+ log_and_message_admins("Emerald extract reaction (slip hell) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]")
+ for(var/turf/simulated/T in trange(5, get_turf(holder.my_atom)))
+ if(!istype(T))
+ continue
+ T.wet = 1
+ T.freeze_floor()
+ ..()
+
+// *********************
+// * Light Pink slimes *
+// *********************
+
+/obj/item/slime_extract/light_pink
+ name = "light pink slime extract"
+ icon_state = "light pink slime extract"
+ description_info = "When injected with phoron, this extract creates a friendship agent, which can be used to make a slime or a creature consider you a friend. When injected with blood, \
+ this extract creates a loyalty agent, which can be used to make a slime or a creature think of those like you as their own. When injected with water, this extract creates a docility agent, \
+ which can be used to pacify a slime or a creature permanently. When injected with slime jelly, this extract creates an obedience agent, which can be used to instantly fully discipline a slime."
+ slime_type = /mob/living/simple_mob/slime/xenobio/light_pink
+
+
+/decl/chemical_reaction/instant/slime/light_pink_friendship
+ name = "Slime Friendship"
+ id = "m_lightpink_friendship"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/light_pink
+
+/decl/chemical_reaction/instant/slime/light_pink_friendship/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/friendship(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/light_pink_loyalty
+ name = "Slime Loyalty"
+ id = "m_lightpink_loyalty"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/light_pink
+
+/decl/chemical_reaction/instant/slime/light_pink_loyalty/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/loyalty(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/light_pink_docility
+ name = "Slime Docility"
+ id = "m_lightpink_docility"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/light_pink
+
+/decl/chemical_reaction/instant/slime/light_pink_docility/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/docility(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/light_pink_obedience
+ name = "Slime Obedience"
+ id = "m_lightpink_obedience"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/light_pink
+
+/decl/chemical_reaction/instant/slime/light_pink_obedience/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/obedience(get_turf(holder.my_atom))
+ ..()
+
+// ******************
+// * Rainbow slimes *
+// ******************
+
+
+/obj/item/slime_extract/rainbow
+ name = "rainbow slime extract"
+ icon_state = "rainbow slime extract"
+ description_info = "When injected with phoron, this extract will create a random slime. When injected with blood, this extract will create a random slime extract. When injected with water, \
+ this extract with create pretty colors. When injected with slime jelly, this extract will create unity agent, which can be used to make slime non-hostile to slimes of other colors."
+ slime_type = /mob/living/simple_mob/slime/xenobio/rainbow
+
+
+/decl/chemical_reaction/instant/slime/rainbow_random_slime
+ name = "Slime Random Slime"
+ id = "m_rainow_random_slime"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/rainbow
+
+/decl/chemical_reaction/instant/slime/rainbow_random_slime/on_reaction(var/datum/reagents/holder)
+ var/mob/living/simple_mob/slime/xenobio/S
+ var/list/slime_types = typesof(/mob/living/simple_mob/slime/xenobio)
+
+ while(slime_types.len)
+ S = pick(slime_types)
+ if(initial(S.rainbow_core_candidate) == TRUE)
+ break
+ else
+ slime_types -= S
+ S = null
+
+ if(S)
+ new S(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/rainbow_random_extract
+ name = "Slime Random Extract"
+ id = "m_rainow_random_extract"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/rainbow
+
+/decl/chemical_reaction/instant/slime/rainbow_random_extract/on_reaction(var/datum/reagents/holder)
+ var/spawn_type = pickweight(xenobio_rainbow_extracts)
+ new spawn_type(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/rainbow_colors
+ name = "Slime Colors"
+ id = "m_rainbow_colors"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/rainbow
+
+/decl/chemical_reaction/instant/slime/rainbow_colors/on_reaction(var/datum/reagents/holder)
+ for(var/mob/living/carbon/human/H in range(3, holder.my_atom))
+ H.druggy = max(H.druggy, 30)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/rainbow_unity
+ name = "Slime Unity"
+ id = "m_rainbow_unity"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/rainbow
+
+/decl/chemical_reaction/instant/slime/rainbow_unity/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/unity(get_turf(holder.my_atom))
+ ..()
\ No newline at end of file
diff --git a/code/modules/xenobio/items/slime_objects.dm b/code/modules/xenobio/items/slime_objects.dm
index 9a945e0058..72cc0e01e3 100644
--- a/code/modules/xenobio/items/slime_objects.dm
+++ b/code/modules/xenobio/items/slime_objects.dm
@@ -67,7 +67,6 @@
qdel(src)
-
// More or less functionally identical to the telecrystal tele.
/obj/item/slime_crystal
name = "lesser slime cystal"
@@ -101,6 +100,7 @@
safe_blink(AM, 14)
qdel(src)
+
/obj/item/weapon/disposable_teleporter/slime
name = "greater slime crystal"
desc = "A larger, gooier crystal."
@@ -112,7 +112,6 @@
origin_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 4)
-
// Very filling food.
/obj/item/weapon/reagent_containers/food/snacks/slime
name = "slimy clump"
@@ -125,4 +124,95 @@
/obj/item/weapon/reagent_containers/food/snacks/slime/Initialize()
. = ..()
- bitesize = 5
\ No newline at end of file
+ bitesize = 5
+
+
+//Flashlight
+
+/obj/item/device/flashlight/slime
+ gender = PLURAL
+ name = "glowing slime extract"
+ desc = "A slimy ball that appears to be glowing from bioluminesence."
+ icon = 'icons/obj/lighting.dmi'
+ icon_state = "floor1" //not a slime extract sprite but... something close enough!
+ item_state = "slime"
+ light_color = "#FFF423"
+ w_class = ITEMSIZE_TINY
+ light_range = 6
+ on = 1 //Bio-luminesence has one setting, on.
+ power_use = 0
+
+/obj/item/device/flashlight/slime/New()
+ ..()
+ set_light(light_range, light_power, light_color)
+
+/obj/item/device/flashlight/slime/update_brightness()
+ return
+
+/obj/item/device/flashlight/slime/attack_self(mob/user)
+ return //Bio-luminescence does not toggle.
+
+
+//Radiation Emitter
+
+/obj/item/slime_irradiator
+ name = "glowing slime extract"
+ desc = "A slimy ball that appears to be glowing from bioluminesence."
+ icon = 'icons/mob/slimes_vr.dmi'
+ icon_state = "irradiator"
+ light_color = "#00FF00"
+ light_power = 0.4
+ light_range = 2
+ w_class = ITEMSIZE_TINY
+
+/obj/item/slime_irradiator/New()
+ START_PROCESSING(SSobj, src)
+ set_light(light_range, light_power, light_color)
+ return ..()
+
+/obj/item/slime_irradiator/process()
+ SSradiation.radiate(src, 5)
+
+/obj/item/slime_irradiator/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
+
+//BS Pouch
+/obj/item/weapon/storage/backpack/holding/slime
+ name = "bluespace slime pouch"
+ desc = "A slimy pouch that opens into a localized pocket of bluespace."
+ icon_state = "slimepouch"
+
+
+
+//Slime Chems
+
+/datum/reagent/myelamine/slime
+ name = "Agent A"
+ id = "slime_bleed_fixer"
+ description = "A slimy liquid which appears to rapidly clot internal hemorrhages by increasing the effectiveness of platelets at low quantities. Toxic in high quantities."
+ taste_description = "slime"
+ overdose = 5
+
+/datum/reagent/osteodaxon/slime
+ name = "Agent B"
+ id = "slime_bone_fixer"
+ description = "A slimy liquid which can be used to heal bone fractures at low quantities. Toxic in high quantities."
+ taste_description = "slime"
+ overdose = 5
+
+/datum/reagent/peridaxon/slime
+ name = "Agent C"
+ id = "slime_organ_fixer"
+ description = "A slimy liquid which is used to encourage recovery of internal organs and nervous systems in low quantities. Toxic in high quantities."
+ taste_description = "slime"
+ overdose = 5
+
+/datum/reagent/nutriment/glucose/slime
+ name = "Slime Goop"
+ id = "slime_goop"
+ description = "A slimy liquid, with very compelling smell. Extremely nutritious."
+ color = "#FABA3A"
+ nutriment_factor = 30
+ taste_description = "slimy nectar"
\ No newline at end of file
diff --git a/code/modules/xenobio/items/slimepotions.dm b/code/modules/xenobio/items/slimepotions.dm
index 2a600fb801..11d2d07571 100644
--- a/code/modules/xenobio/items/slimepotions.dm
+++ b/code/modules/xenobio/items/slimepotions.dm
@@ -11,7 +11,7 @@
/obj/item/slimepotion/enhancer
name = "extract enhancer agent"
desc = "A potent chemical mix that will give a slime extract an additional two uses."
- icon_state = "potpurple"
+ icon_state = "potcyan"
description_info = "This will even work on inert slime extracts, if it wasn't enhanced before. Extracts enhanced cannot be enhanced again."
// Makes slimes less likely to mutate.
@@ -64,7 +64,7 @@
// Makes the slime friendly forever.
/obj/item/slimepotion/docility
- name = "docility agent"
+ name = "slime docility agent"
desc = "A potent chemical mix that nullifies a slime's hunger, causing it to become docile and tame. It might also work on other creatures?"
icon_state = "potlightpink"
description_info = "The target needs to be alive, not already passive, and be an animal or slime type entity."
@@ -178,7 +178,7 @@
desc = "A potent chemical mix that makes an animal deeply loyal to the species of whoever applies this, and will attack threats to them."
description_info = "The slime or other animal needs to be alive for this to work. The slime this is applied to will have their 'faction' change to \
the user's faction, which means the slime will attack things that are hostile to the user's faction, such as carp, spiders, and other slimes."
- icon_state = "potred"
+ icon_state = "potlightpink"
/obj/item/slimepotion/loyalty/attack(mob/living/simple_mob/M, mob/user)
if(!istype(M))
@@ -247,7 +247,7 @@
name = "slime feeding agent"
desc = "A potent chemical mix that will instantly sediate the slime."
description_info = "The slime needs to be alive for this to work. It will instantly grow the slime enough to reproduce."
- icon_state = "potyellow"
+ icon_state = "potorange"
/obj/item/slimepotion/feeding/attack(mob/living/simple_mob/slime/xenobio/M, mob/user)
if(!istype(M))
diff --git a/icons/inventory/back/item.dmi b/icons/inventory/back/item.dmi
index daa2c46449..230b3950c8 100644
Binary files a/icons/inventory/back/item.dmi and b/icons/inventory/back/item.dmi differ
diff --git a/icons/inventory/back/mob.dmi b/icons/inventory/back/mob.dmi
index 755a2d75d4..3f11cc9dc1 100644
Binary files a/icons/inventory/back/mob.dmi and b/icons/inventory/back/mob.dmi differ
diff --git a/icons/mob/alienanimals_x32.dmi b/icons/mob/alienanimals_x32.dmi
index b187ad5873..05b70ba657 100644
Binary files a/icons/mob/alienanimals_x32.dmi and b/icons/mob/alienanimals_x32.dmi differ
diff --git a/icons/mob/items/lefthand_holder.dmi b/icons/mob/items/lefthand_holder.dmi
index aa7e7807cc..56c51d0f5c 100644
Binary files a/icons/mob/items/lefthand_holder.dmi and b/icons/mob/items/lefthand_holder.dmi differ
diff --git a/icons/mob/items/righthand_holder.dmi b/icons/mob/items/righthand_holder.dmi
index bad25f481b..21659ece95 100644
Binary files a/icons/mob/items/righthand_holder.dmi and b/icons/mob/items/righthand_holder.dmi differ
diff --git a/icons/mob/slimes_vr.dmi b/icons/mob/slimes_vr.dmi
new file mode 100644
index 0000000000..4f7b901cfd
Binary files /dev/null and b/icons/mob/slimes_vr.dmi differ
diff --git a/maps/expedition_vr/space/fueldepot.dmm b/maps/expedition_vr/space/fueldepot.dmm
index 71b0150202..b877b6da94 100644
--- a/maps/expedition_vr/space/fueldepot.dmm
+++ b/maps/expedition_vr/space/fueldepot.dmm
@@ -1294,7 +1294,15 @@
icon_state = "1-4"
},
/turf/simulated/shuttle/plating/airless,
+<<<<<<< HEAD
/area/sc_away/fueldepot)
+=======
+/area/tether_away/fueldepot)
+"ow" = (
+/obj/machinery/vending/weeb,
+/turf/simulated/floor/tiled/techmaint/airless,
+/area/tether_away/fueldepot)
+>>>>>>> bd65b8dc0f... Merge pull request #12551 from BonniePandora/spaceslug
"rE" = (
/obj/machinery/atmospherics/pipe/manifold/visible/aux{
dir = 1
@@ -1339,7 +1347,15 @@
/obj/structure/table/rack/shelf/steel,
/obj/random/powercell,
/turf/simulated/floor/tiled/techmaint/airless,
+<<<<<<< HEAD
/area/sc_away/fueldepot)
+=======
+/area/tether_away/fueldepot)
+"Gh" = (
+/obj/machinery/vending/fitness,
+/turf/simulated/floor/tiled/techmaint/airless,
+/area/tether_away/fueldepot)
+>>>>>>> bd65b8dc0f... Merge pull request #12551 from BonniePandora/spaceslug
"IR" = (
/obj/machinery/atmospherics/pipe/simple/visible/aux{
dir = 8
@@ -1365,14 +1381,36 @@
/obj/structure/table/rack/steel,
/obj/item/weapon/storage/toolbox/mechanical,
/turf/simulated/floor/tiled/techmaint/airless,
+<<<<<<< HEAD
/area/sc_away/fueldepot)
+=======
+/area/tether_away/fueldepot)
+"QY" = (
+/obj/machinery/atmospherics/pipe/simple/visible/universal{
+ dir = 1
+ },
+/obj/structure/catwalk,
+/mob/living/simple_mob/vore/alienanimals/catslug/spaceslug,
+/turf/simulated/shuttle/plating/airless,
+/area/tether_away/fueldepot)
+>>>>>>> bd65b8dc0f... Merge pull request #12551 from BonniePandora/spaceslug
"Vy" = (
/obj/structure/cable{
icon_state = "2-8"
},
/obj/structure/catwalk,
/turf/simulated/shuttle/plating/airless,
+<<<<<<< HEAD
/area/sc_away/fueldepot)
+=======
+/area/tether_away/fueldepot)
+"XR" = (
+/obj/machinery/vending/foodfast{
+ dir = 0
+ },
+/turf/simulated/floor/tiled/techmaint/airless,
+/area/tether_away/fueldepot)
+>>>>>>> bd65b8dc0f... Merge pull request #12551 from BonniePandora/spaceslug
"Ys" = (
/obj/structure/table/steel_reinforced,
/turf/simulated/floor/tiled/techmaint/airless,
@@ -11246,7 +11284,7 @@ ao
aS
bc
bo
-bC
+QY
rE
cc
cn
@@ -11954,12 +11992,12 @@ aa
aG
aa
aF
-aG
+Gh
aG
bz
IR
aG
-aG
+XR
aF
aa
aG
@@ -12238,7 +12276,7 @@ aD
aM
aa
aF
-aG
+ow
bs
bz
bN
diff --git a/sound/voice/coyoteawoo2.ogg b/sound/voice/coyoteawoo2.ogg
new file mode 100644
index 0000000000..953d120a63
Binary files /dev/null and b/sound/voice/coyoteawoo2.ogg differ
diff --git a/sound/voice/coyoteawoo3.ogg b/sound/voice/coyoteawoo3.ogg
new file mode 100644
index 0000000000..ed92e884a0
Binary files /dev/null and b/sound/voice/coyoteawoo3.ogg differ
diff --git a/sound/voice/coyoteawoo4.ogg b/sound/voice/coyoteawoo4.ogg
new file mode 100644
index 0000000000..6dcc314f31
Binary files /dev/null and b/sound/voice/coyoteawoo4.ogg differ
diff --git a/sound/voice/coyoteawoo5.ogg b/sound/voice/coyoteawoo5.ogg
new file mode 100644
index 0000000000..2edb60e394
Binary files /dev/null and b/sound/voice/coyoteawoo5.ogg differ
diff --git a/vorestation.dme b/vorestation.dme
index cc1b73a0ac..de599fdda0 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2291,7 +2291,6 @@
#include "code\modules\emotes\definitions\audible.dm"
#include "code\modules\emotes\definitions\audible_belch.dm"
#include "code\modules\emotes\definitions\audible_cough.dm"
-#include "code\modules\emotes\definitions\audible_furry_ch.dm"
#include "code\modules\emotes\definitions\audible_furry_vr.dm"
#include "code\modules\emotes\definitions\audible_scream.dm"
#include "code\modules\emotes\definitions\audible_scream_ch.dm"
@@ -4378,9 +4377,10 @@
#include "code\modules\xenoarcheaology\tools\tools_pickaxe.dm"
#include "code\modules\xenoarcheaology\tools\tools_pickaxe_vr.dm"
#include "code\modules\xenoarcheaology\tools\tools_vr.dm"
-#include "code\modules\xenobio\items\extracts.dm"
+#include "code\modules\xenobio\items\extracts_vr.dm"
#include "code\modules\xenobio\items\slime_objects.dm"
#include "code\modules\xenobio\items\slimepotions.dm"
+#include "code\modules\xenobio\items\slimepotions_vr.dm"
#include "code\modules\xenobio\items\weapons.dm"
#include "code\modules\xenobio\machinery\processor.dm"
#include "code\modules\xgm\xgm_gas_data.dm"