From 707c75fbd88d33301f97766a94167e13fa9d22a8 Mon Sep 17 00:00:00 2001
From: CRUNCH <143041327+Fordoxia@users.noreply.github.com>
Date: Thu, 6 Nov 2025 05:49:11 +0000
Subject: [PATCH] Buffs Species Drinks (#30613)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Update alcohol.dm
* Update alcohol.dm
* drinks
* Update alcohol.dm
* Update alcohol.dm
* Update alcohol.dm
* WIP
* Fixed everything 😎
* Signal handler
* Update code/modules/reagents/chemistry/reagents/alcohol.dm
Signed-off-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
* Update code/modules/reagents/chemistry/reagents/alcohol.dm
Signed-off-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
---------
Signed-off-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
---
code/__DEFINES/dcs/datum_signals.dm | 3 +-
.../drinks/drinks/drinkingglass.dm | 38 +-
.../mob/living/carbon/human/human_mob.dm | 1 +
.../reagents/chemistry/reagents/alcohol.dm | 743 ++++++++++++------
.../chemistry/reagents/drinks_reagents.dm | 19 +-
5 files changed, 540 insertions(+), 264 deletions(-)
diff --git a/code/__DEFINES/dcs/datum_signals.dm b/code/__DEFINES/dcs/datum_signals.dm
index 7376c1113f5..c1ca2c4701a 100644
--- a/code/__DEFINES/dcs/datum_signals.dm
+++ b/code/__DEFINES/dcs/datum_signals.dm
@@ -43,7 +43,8 @@
#define COMSIG_SPECIES_LOSS "species_loss"
///from /datum/species/proc/spec_hitby()
#define COMSIG_SPECIES_HITBY "species_hitby"
-
+/// Fires after a carbon's species changes.
+#define COMSIG_AFTER_SPECIES_CHANGE "after_species_change"
// /datum/song
diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
index e44352ccd04..02bac16a11e 100644
--- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
@@ -69,8 +69,42 @@
/obj/item/reagent_containers/drinks/drinkingglass/syndicate_bomb
list_reagents = list("syndicatebomb" = 50)
+/obj/item/reagent_containers/drinks/drinkingglass/pina_colada
+ list_reagents = list("pinacolada" = 50)
+
+// All the species drinks
+/obj/item/reagent_containers/drinks/drinkingglass/acid_dreams
+ list_reagents = list("aciddreams" = 50)
+
+/obj/item/reagent_containers/drinks/drinkingglass/ahdomai_eclipse
+ list_reagents = list("ahdomaieclipse" = 50)
+
+/obj/item/reagent_containers/drinks/drinkingglass/beach_feast
+ list_reagents = list("beachfeast" = 50)
+
+/obj/item/reagent_containers/drinks/drinkingglass/die_seife
+ list_reagents = list("dieseife" = 50)
+
+/obj/item/reagent_containers/drinks/drinkingglass/diona_smash
+ list_reagents = list("dionasmash" = 50)
+
+/obj/item/reagent_containers/drinks/drinkingglass/fyrsskar_tears
+ list_reagents = list("fyrsskartears" = 50)
+
+/obj/item/reagent_containers/drinks/drinkingglass/howler
+ list_reagents = list("howler" = 50)
+
+/obj/item/reagent_containers/drinks/drinkingglass/islay_whiskey
+ list_reagents = list("islaywhiskey" = 50)
+
/obj/item/reagent_containers/drinks/drinkingglass/jungle_vox
list_reagents = list("junglevox" = 50)
-/obj/item/reagent_containers/drinks/drinkingglass/pina_colada
- list_reagents = list("pinacolada" = 50)
+/obj/item/reagent_containers/drinks/drinkingglass/slime_mold
+ list_reagents = list("slimemold" = 50)
+
+/obj/item/reagent_containers/drinks/drinkingglass/sontse
+ list_reagents = list("sontse" = 50)
+
+/obj/item/reagent_containers/drinks/drinkingglass/ultramatter
+ list_reagents = list("ultramatter" = 50)
diff --git a/code/modules/mob/living/carbon/human/human_mob.dm b/code/modules/mob/living/carbon/human/human_mob.dm
index 899ccec9beb..0524833feb8 100644
--- a/code/modules/mob/living/carbon/human/human_mob.dm
+++ b/code/modules/mob/living/carbon/human/human_mob.dm
@@ -1368,6 +1368,7 @@
update_mutantrace()
regenerate_icons()
+ SEND_SIGNAL(src, COMSIG_AFTER_SPECIES_CHANGE)
if(dna.species)
return TRUE
else
diff --git a/code/modules/reagents/chemistry/reagents/alcohol.dm b/code/modules/reagents/chemistry/reagents/alcohol.dm
index d138f3bb548..87c71e119fd 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol.dm
@@ -1530,265 +1530,6 @@
taste_description = "bilk, cream, and cold tears"
goal_difficulty = REAGENT_GOAL_EASY
-/datum/reagent/consumable/ethanol/sontse
- name = "Sontse"
- id = "sontse"
- description = "You see sun bobbing inside of this drink. How this is even possible?"
- color = "#DDB520" // rgb: 221, 181, 32
- alcohol_perc = 0.4
- drink_icon = "sontse"
- drink_name = "Sontse"
- drink_desc = "The Sun, The Sun, The Sun, The Sun, The Sun, THE SUN!"
- taste_description = "warmth and brightness"
- var/light_activated = FALSE
- goal_difficulty = REAGENT_GOAL_HARD
-
-/datum/reagent/consumable/ethanol/sontse/on_mob_life(mob/living/M)
- if(current_cycle != 5 || !ismoth(M))
- return ..()
- to_chat(M, "The Sun was within you all this time!")
- if(!light_activated)
- M.set_light(2)
- light_activated = TRUE
- return ..()
-
-/datum/reagent/consumable/ethanol/sontse/on_mob_delete(mob/living/M)
- if(!ismoth(M))
- return ..()
- to_chat(M, "The Sun within you subsides.")
- M.set_light(0)
- ..()
-
-/datum/reagent/consumable/ethanol/ahdomai_eclipse
- name = "Ahdomai's Eclipse"
- id = "ahdomaieclipse"
- description = "Blizzard in a glass. Tajaran signature drink!"
- color = "#DAE0E6" // rgb: 218, 224, 230
- alcohol_perc = 0.1
- drink_icon = "ahdomaieclipse"
- drink_name = "Ahdomai's Eclipse"
- drink_desc = "Blizzard in a glass. Tajaran signature drink!"
- taste_description = "ice"
- var/min_achievable_temp = 250
- goal_difficulty = REAGENT_GOAL_NORMAL
-
-/datum/reagent/consumable/ethanol/ahdomai_eclipse/on_mob_life(mob/living/M)
- . = ..()
- if(istajaran(M) && M.bodytemperature > min_achievable_temp)
- M.bodytemperature = max(min_achievable_temp, M.bodytemperature - (50 * TEMPERATURE_DAMAGE_COEFFICIENT))
-
-/datum/reagent/consumable/ethanol/beach_feast
- name = "Feast by the Beach"
- id = "beachfeast"
- description = "A classic Unathi drink. You can spot sand sediment at the bottom of the glass. The drink is hot as hell and more."
- color = "#E8E800" // rgb: 232, 232, 0
- alcohol_perc = 0.2
- drink_icon = "beachfeast"
- drink_name = "Feast by the Beach"
- drink_desc = "A classic Unathi drink. You can spot sand sediment at the bottom of the glass. The drink is hot as hell and more."
- taste_description = "sand"
- goal_difficulty = REAGENT_GOAL_NORMAL
-
-/datum/reagent/consumable/ethanol/beach_feast/on_mob_life(mob/living/M)
- if(!isunathi(M))
- return ..()
- if(M.bodytemperature < 360)
- M.bodytemperature = min(360, M.bodytemperature + (50 * TEMPERATURE_DAMAGE_COEFFICIENT))
- return ..()
-
-/datum/reagent/consumable/ethanol/jungle_vox
- name = "Jungle Vox"
- id = "junglevox"
- description = "Classy drink in a glass vox head with a bit of liquid nitrogen added on."
- color = "#1ED1CE" // rgb: 30, 209, 206
- alcohol_perc = 0.2
- drink_icon = "junglevox"
- drink_name = "Jungle Vox"
- drink_desc = "Classy drink in a glass vox head with a bit of liquid nitrogen added on."
- taste_description = "bubbles"
- goal_difficulty = REAGENT_GOAL_NORMAL
-
-/datum/reagent/consumable/ethanol/jungle_vox/on_mob_life(mob/living/M)
- if(current_cycle <= 5 || !isvox(M))
- return ..()
- if(M.health > 0)
- M.adjustOxyLoss(-1 * REAGENTS_EFFECT_MULTIPLIER, FALSE)
- M.AdjustLoseBreath(-2 SECONDS)
- return ..()
-
-/datum/reagent/consumable/ethanol/slime_mold
- name = "Slime Mold"
- id = "slimemold"
- description = "You can swear that this jelly looks alive."
- color = "#C20458" // rgb: 194, 4, 88
- alcohol_perc = 0.2
- drink_icon = "slimemold"
- drink_name = "Slime Mold"
- drink_desc = "You can swear that this jelly looks alive."
- taste_description = "jelly"
- goal_difficulty = REAGENT_GOAL_HARD
-
-/datum/reagent/consumable/ethanol/slime_mold/on_mob_life(mob/living/M)
- if(!isslimeperson(M))
- return ..()
- var/mob/living/carbon/human/H = M
- if(!(NO_BLOOD in H.dna.species.species_traits))
- if(H.blood_volume < BLOOD_VOLUME_NORMAL)
- H.blood_volume += REAGENTS_METABOLISM / 2 // half of the reagent is converted into blood, netting us just a little bit
- return ..()
-
-/datum/reagent/consumable/ethanol/die_seife
- name = "Die Seife"
- id = "dieseife"
- description = "There is a piece of soap at the bottom of the glass and it is slowly melting."
- color = "#9D9E89" // rgb: 157, 158, 137
- alcohol_perc = 0.2
- drink_icon = "dieseife"
- drink_name = "Die Seife"
- drink_desc = "There is a piece of soap at the bottom of the glass and it is slowly melting."
- taste_description = "soap"
- goal_difficulty = REAGENT_GOAL_NORMAL
-
-/datum/reagent/consumable/ethanol/die_seife/on_mob_life(mob/living/M)
- if(current_cycle % 10 != 0 || !isdrask(M))
- return ..()
-
- if(prob(50))
- to_chat(M, "Your skin emits a soapy liquid from its pores cleaning you in the process.")
- M.clean_blood()
- return ..()
-
-/datum/reagent/consumable/ethanol/acid_dreams
- name = "Acid Dreams"
- id = "aciddreams"
- description = "This one looks just weird and reeks of acid."
- color = "#B7FF6A" // rgb: 183, 255, 106
- alcohol_perc = 0.7
- drink_icon = "aciddreams"
- drink_name = "Acid Dreams"
- drink_desc = "This one looks just weird and reeks of acid."
- taste_description = "acid"
- goal_difficulty = REAGENT_GOAL_NORMAL
-
-/datum/reagent/consumable/ethanol/acid_dreams/on_mob_life(mob/living/M)
- if(current_cycle % 10 != 0 || !isgrey(M))
- return ..()
- if(prob(50))
- var/list/mob/living/targets = list()
- for(var/mob/living/L in orange(14, M))
- if(L.stat == DEAD || !L.client) //we don't care about dead mobs
- continue
- targets += L
- if(length(targets))
- var/mob/living/target = pick(targets)
- to_chat(target, "You feel that [M.name] is somewhere near.")
- return ..()
-
-/datum/reagent/consumable/ethanol/islay_whiskey
- name = "Islay Whiskey"
- id = "islaywhiskey"
- description = "Named in honor of one of the most gritty and earth smelling types of Whiskey of Earth, this drink is a treat for any Diona."
- color = "#461300" // rgb: 70, 19, 0
- alcohol_perc = 0.2
- drink_icon = "islaywhiskey"
- drink_name = "Islay Whiskey"
- drink_desc = "Named in honor of one of the most gritty and earth smelling types of Whiskey of Earth, this drink is a treat for any Diona."
- taste_description = "soil"
- goal_difficulty = REAGENT_GOAL_NORMAL
-
-/datum/reagent/consumable/ethanol/islay_whiskey/on_mob_life(mob/living/M)
- if(current_cycle <=5 || !isdiona(M))
- return ..()
-
- var/mob/living/carbon/human/H = M
- var/turf/T = get_turf(H)
- var/light_amount = min(1, T.get_lumcount()) - 0.5
-
- if(light_amount > 0.2 && !H.suiciding && H.health > 0)
- H.adjustBruteLoss(-0.25)
- H.adjustToxLoss(-0.25)
- H.adjustOxyLoss(-0.25)
- return ..()
-
-/datum/reagent/consumable/ethanol/ultramatter
- name = "Ultramatter"
- id = "ultramatter"
- description = "In the triangle of fire, this is apex of fuel."
- color = "#38004B" // rgb: 56, 0, 75
- alcohol_perc = 0.7
- drink_icon = "ultramatter"
- drink_name = "Ultramatter"
- drink_desc = "In the triangle of fire, this is apex of fuel."
- taste_description = "fire"
- var/on_fire = FALSE
- goal_difficulty = REAGENT_GOAL_HARD
-
-/datum/reagent/consumable/ethanol/ultramatter/on_mob_life(mob/living/M)
- // species agnostic as it is DRINKS on_fire, so only plasmaman can get it
- if(on_fire)
- M.adjust_fire_stacks(-1)
- on_fire = FALSE
-
- if(current_cycle % 10 != 0 || !isplasmaman(M))
- return ..()
-
- if(prob(30))
- var/mob/living/carbon/human/H = M
- to_chat(M, "You expell flaming substance from within your suit.")
- var/obj/item/clothing/under/plasmaman/suit = H.w_uniform
- if(suit)
- suit.next_extinguish = world.time + 10 SECONDS
- H.adjust_fire_stacks(1)
- H.IgniteMob()
- on_fire = TRUE
-
- return ..()
-
-/datum/reagent/consumable/ethanol/howler
- name = "Howler"
- id = "howler"
- description = "Old classic human drink that was adopted by Vulpkanin."
- color = "#EC6400" // rgb: 236, 100, 0
- alcohol_perc = 0.2
- drink_icon = "howler"
- drink_name = "Howler"
- drink_desc = "Old classic human drink that was adopted by Vulpkanin."
- taste_description = "citrus"
- goal_difficulty = REAGENT_GOAL_EASY
-
-/datum/reagent/consumable/ethanol/howler/on_mob_life(mob/living/M)
- if(!isvulpkanin(M))
- return ..()
-
- var/mob/living/carbon/human/H = M
- if(H.health > 0)
- H.adjustToxLoss(-0.5)
-
- return ..()
-
-/datum/reagent/consumable/ethanol/diona_smash
- name = "Diona Smash"
- id = "dionasmash"
- description = "Fake Diona is floating carelessly in the middle of this drink."
- color = "#00531D" // rgb: 0, 83, 29
- alcohol_perc = 0.7
- drink_icon = "dionasmash"
- drink_name = "Diona Smash"
- drink_desc = "Fake Diona is floating carelessly in the middle of this drink."
- taste_description = "the crunch"
- var/mutated = FALSE
- goal_difficulty = REAGENT_GOAL_NORMAL
-
-/datum/reagent/consumable/ethanol/diona_smash/on_mob_life(mob/living/M)
- if(mutated || !iskidan(M))
- return ..()
-
- to_chat(M, "Mmm, tasty.")
- nutriment_factor = 1 * REAGENTS_METABOLISM
- mutated = TRUE
-
- return ..()
-
/datum/reagent/consumable/ethanol/lager
name = "Lager"
id = "lager"
@@ -1817,3 +1558,487 @@
if(!(NO_BLOOD in H.dna.species.species_traits) && (H.blood_volume < BLOOD_VOLUME_NORMAL))
H.blood_volume += 0.4
return ..()
+
+// MARK: Species drinks
+/datum/reagent/consumable/ethanol/acid_dreams
+ name = "Acid Dreams"
+ id = "aciddreams"
+ description = "Cooked up in a single night by a bored Grey chemist killing time while waiting for a long synthesis to complete, this drink has become the stuff of legands across Mauna-b."
+ color = "#B7FF6A" // rgb: 183, 255, 106
+ alcohol_perc = 0.7
+ drink_icon = "aciddreams"
+ drink_name = "Acid Dreams"
+ drink_desc = "Cooked up in a single night by a bored Grey chemist killing time while waiting for a long synthesis to complete, this drink has become the stuff of legands across Mauna-b."
+ taste_description = "acid"
+ goal_difficulty = REAGENT_GOAL_NORMAL
+
+/datum/reagent/consumable/ethanol/acid_dreams/on_mob_add(mob/living/M)
+ if(isgrey(M))
+ to_chat(M, "Your mind expands and your eyes see the world for what it really is.")
+ M.Druggy(12 SECONDS)
+ ADD_TRAIT(M, TRAIT_NIGHT_VISION, id) // Powerful? Sure. But everyone knows you're there. Also you've got a druggy filter over your eyes.
+ RegisterSignal(M, COMSIG_AFTER_SPECIES_CHANGE, PROC_REF(on_species_change))
+ return ..()
+
+/datum/reagent/consumable/ethanol/acid_dreams/on_mob_life(mob/living/M)
+ if(!isgrey(M))
+ return ..()
+
+ // Your galaxy brain is now so big that you cannot contain all of your toughts, when they leak out people can smell your location!
+ // Everyone that smells your powerful thoughts knows exactly who you are, but their thoughts are too dim for you to isolate. You only know that between one and INFINITY people are there.
+ M.Druggy(4 SECONDS)
+ if(prob(36))
+ var/list/mob/living/target_list = list()
+ for(var/mob/living/L in orange(14, M))
+ if(L.stat == DEAD || !L.client)
+ continue
+ target_list += L
+ if(length(target_list))
+ for(var/mob/living/target in target_list)
+ to_chat(target, "You feel that [M.name] is somewhere near.")
+ to_chat(M, pick(
+ "The scent of your brainwaves intermingles with another!",
+ "Your synapses accidentally call out your name!",
+ "Your mind bumps into someone!",
+ "The eyes of other minds are staring at you from across the noosphere!")
+ )
+ return ..()
+
+/datum/reagent/consumable/ethanol/acid_dreams/on_mob_delete(mob/living/M)
+ if(isgrey(M))
+ to_chat(M, "Your mind shrinks down to its usual size and the world hides its secrets from you!")
+ REMOVE_TRAIT(M, TRAIT_NIGHT_VISION, id)
+ M.Druggy(0 SECONDS)
+ UnregisterSignal(M, COMSIG_AFTER_SPECIES_CHANGE)
+ return ..()
+
+/datum/reagent/consumable/ethanol/acid_dreams/proc/on_species_change(mob/living/M)
+ SIGNAL_HANDLER // COMSIG_AFTER_SPECIES_CHANGE
+ if(!isgrey(M))
+ REMOVE_TRAIT(M, TRAIT_NIGHT_VISION, id)
+ M.Druggy(0 SECONDS)
+ else
+ to_chat(M, "Your mind expands and your eyes see the world for what it really is.")
+ M.Druggy(12 SECONDS)
+ ADD_TRAIT(M, TRAIT_NIGHT_VISION, id)
+
+/datum/reagent/consumable/ethanol/ahdomai_eclipse
+ name = "Ahdomai's Eclipse"
+ id = "ahdomaieclipse"
+ description = "You see a fierce blizzard endlessly blowing inside this drink."
+ color = "#DAE0E6" // rgb: 218, 224, 230
+ alcohol_perc = 0.1
+ drink_icon = "ahdomaieclipse"
+ drink_name = "Ahdomai's Eclipse"
+ drink_desc = "A blizzard in a glass, however that works. Even the most distant of Tajaran will feel a strong connection to their homeworld through this drink."
+ taste_description = "ice"
+ var/min_achievable_temp = 250
+ goal_difficulty = REAGENT_GOAL_NORMAL
+
+/datum/reagent/consumable/ethanol/ahdomai_eclipse/on_mob_add(mob/living/M)
+ if(istajaran(M))
+ ADD_TRAIT(M, TRAIT_RESISTCOLD, id)
+ RegisterSignal(M, COMSIG_AFTER_SPECIES_CHANGE, PROC_REF(on_species_change))
+ return ..()
+
+/datum/reagent/consumable/ethanol/ahdomai_eclipse/on_mob_life(mob/living/M)
+ if(!istajaran(M))
+ return ..()
+
+ if(M.bodytemperature > min_achievable_temp)
+ M.bodytemperature = max(min_achievable_temp, M.bodytemperature - (80 * TEMPERATURE_DAMAGE_COEFFICIENT))
+ // Don't spam the chat too much.
+ if(prob(36) && M.getFireLoss())
+ to_chat(M, "The icy energies within you soothe your burns.")
+ var/update_flags = STATUS_UPDATE_NONE
+ var/mob/living/carbon/human/H = M
+ update_flags |= H.adjustFireLoss(-2 * REAGENTS_EFFECT_MULTIPLIER, FALSE)
+ return ..() | update_flags
+
+/datum/reagent/consumable/ethanol/ahdomai_eclipse/on_mob_delete(mob/living/M)
+ if(istajaran(M))
+ REMOVE_TRAIT(M, TRAIT_RESISTCOLD, id)
+ to_chat(M, "The raging blizzard within you subsides.")
+ UnregisterSignal(M, COMSIG_AFTER_SPECIES_CHANGE)
+ return ..()
+
+/datum/reagent/consumable/ethanol/ahdomai_eclipse/proc/on_species_change(mob/living/M)
+ SIGNAL_HANDLER // COMSIG_AFTER_SPECIES_CHANGE
+ if(!istajaran(M))
+ REMOVE_TRAIT(M, TRAIT_RESISTCOLD, id)
+ else
+ ADD_TRAIT(M, TRAIT_RESISTCOLD, id)
+
+/datum/reagent/consumable/ethanol/beach_feast
+ name = "Feast by the Beach"
+ id = "beachfeast"
+ description = "A classic Unathi drink. You can spot sand sediment at the bottom of the glass. The drink is hot as hell and more."
+ color = "#E8E800" // rgb: 232, 232, 0
+ alcohol_perc = 0.2
+ drink_icon = "beachfeast"
+ drink_name = "Feast by the Beach"
+ drink_desc = "A classic Unathi drink. You can spot sand sediment at the bottom of the glass. The drink is hot as hell and more."
+ taste_description = "sand"
+ goal_difficulty = REAGENT_GOAL_NORMAL
+ var/max_achievable_temp = 360
+ var/burn_modifier = 0.1 // 10 %.
+
+/datum/reagent/consumable/ethanol/beach_feast/on_mob_add(mob/living/M)
+ if(isunathi(M))
+ ADD_TRAIT(M, TRAIT_RESISTHEAT, id)
+ var/mob/living/carbon/human/H = M
+ H.dna.species.burn_mod -= burn_modifier
+ RegisterSignal(M, COMSIG_AFTER_SPECIES_CHANGE, PROC_REF(on_species_change))
+ return ..()
+
+/datum/reagent/consumable/ethanol/beach_feast/on_mob_life(mob/living/M)
+ if(!isunathi(M))
+ return ..()
+
+ if(M.bodytemperature < max_achievable_temp)
+ M.bodytemperature = min(max_achievable_temp, M.bodytemperature + (80 * TEMPERATURE_DAMAGE_COEFFICIENT))
+ return ..()
+
+/datum/reagent/consumable/ethanol/beach_feast/on_mob_delete(mob/living/M)
+ if(isunathi(M))
+ REMOVE_TRAIT(M, TRAIT_RESISTHEAT, id)
+ var/mob/living/carbon/human/H = M
+ H.dna.species.burn_mod += burn_modifier
+ UnregisterSignal(M, COMSIG_AFTER_SPECIES_CHANGE)
+ return ..()
+
+/datum/reagent/consumable/ethanol/beach_feast/proc/on_species_change(mob/living/M)
+ SIGNAL_HANDLER // COMSIG_AFTER_SPECIES_CHANGE
+ if(!isunathi(M))
+ // No need to change the burn modifier, it gets reset when species changes.
+ REMOVE_TRAIT(M, TRAIT_RESISTHEAT, id)
+ else
+ ADD_TRAIT(M, TRAIT_RESISTHEAT, id)
+ var/mob/living/carbon/human/H = M
+ H.dna.species.burn_mod -= burn_modifier
+
+/datum/reagent/consumable/ethanol/die_seife
+ name = "Die Seife"
+ id = "dieseife"
+ description = "There is a piece of soap at the bottom of the glass and it is slowly melting."
+ color = "#9D9E89" // rgb: 157, 158, 137
+ overdose_threshold = 20
+ allowed_overdose_process = TRUE
+ alcohol_perc = 0.2
+ drink_icon = "dieseife"
+ drink_name = "Die Seife"
+ drink_desc = "There is a piece of soap at the bottom of the glass and it is slowly melting."
+ taste_description = "soap"
+ goal_difficulty = REAGENT_GOAL_NORMAL
+
+/datum/reagent/consumable/ethanol/die_seife/on_mob_life(mob/living/M)
+ if(!isdrask(M))
+ return ..()
+
+ if(prob(50))
+ M.visible_message(
+ "A soapy liqid flows out of [M]'s pores, cleaning [M.p_them()].",
+ "Your skin emits a soapy liquid from its pores, cleaning you in the process.",
+ "A sickening oozing sound fills the air."
+ )
+ M.clean_blood()
+ return ..()
+
+/datum/reagent/consumable/ethanol/die_seife/overdose_process(mob/living/M, severity)
+ if(!isdrask(M))
+ return ..()
+
+ if(prob(5))
+ M.visible_message(
+ "A huge surge of soapy liqid gushes out of [M]'s pores and pools on the floor!",
+ "Your skin emits a surge of soapy liquid from its pores, cleaning you and the surrounding floor in the process.",
+ "A vile gushing sound fills the air followed by the splattering of a thick liquid on the floor!"
+ )
+ new /obj/effect/particle_effect/foam(M.loc)
+ return list(0)
+
+/datum/reagent/consumable/ethanol/diona_smash
+ name = "Diona Smash"
+ id = "dionasmash"
+ description = "Fake Diona is floating carelessly in the middle of this drink."
+ color = "#00531D" // rgb: 0, 83, 29
+ alcohol_perc = 0.7
+ drink_icon = "dionasmash"
+ drink_name = "Diona Smash"
+ drink_desc = "Fake Diona is floating carelessly in the middle of this drink."
+ taste_description = "the crunch"
+ nutriment_factor = 2 * REAGENTS_METABOLISM
+ goal_difficulty = REAGENT_GOAL_NORMAL
+ var/damage_mod = 4
+
+/datum/reagent/consumable/ethanol/diona_smash/on_mob_add(mob/living/M)
+ if(iskidan(M))
+ to_chat(M, "Delicious! You feel a surge of energy in your muscles, you feel like you can smash anything!")
+ var/mob/living/carbon/human/H = M
+ H.physiology.melee_bonus += damage_mod
+ RegisterSignal(M, COMSIG_AFTER_SPECIES_CHANGE, PROC_REF(on_species_change))
+ return ..()
+
+/datum/reagent/consumable/ethanol/diona_smash/on_mob_delete(mob/living/M)
+ if(iskidan(M))
+ to_chat(M, "You no longer have the energy to smash!")
+ var/mob/living/carbon/human/H = M
+ H.physiology.melee_bonus -= damage_mod
+ UnregisterSignal(M, COMSIG_AFTER_SPECIES_CHANGE)
+ return ..()
+
+/datum/reagent/consumable/ethanol/diona_smash/proc/on_species_change(mob/living/M)
+ SIGNAL_HANDLER // COMSIG_AFTER_SPECIES_CHANGE
+ if(iskidan(M))
+ var/mob/living/carbon/human/H = M
+ H.physiology.melee_bonus += damage_mod
+ to_chat(M, "You feel a surge of energy in your muscles, you feel like you can smash anything!")
+ // No need to change the damage modifier when turning into a non-Kidan, it gets reset when species changes.
+
+/datum/reagent/consumable/ethanol/howler
+ name = "Howler"
+ id = "howler"
+ description = "Old classic human drink that was adopted by Vulpkanin."
+ color = "#EC6400" // rgb: 236, 100, 0
+ alcohol_perc = 0.2
+ drink_icon = "howler"
+ drink_name = "Howler"
+ drink_desc = "Old classic human drink that was adopted by Vulpkanin."
+ taste_description = "citrus"
+ goal_difficulty = REAGENT_GOAL_EASY
+
+/datum/reagent/consumable/ethanol/howler/reaction_mob(mob/living/M, method = REAGENT_INGEST, volume)
+ if(isvulpkanin(M))
+ M.emote("howl")
+ return ..()
+
+/datum/reagent/consumable/ethanol/howler/on_mob_life(mob/living/M)
+ if(isvulpkanin(M))
+ var/mob/living/carbon/human/H = M
+ H.adjustToxLoss(-1 * REAGENTS_EFFECT_MULTIPLIER)
+ return ..()
+
+/datum/reagent/consumable/ethanol/islay_whiskey
+ name = "Islay Whiskey"
+ id = "islaywhiskey"
+ description = "Named in honor of one of the most gritty and earth smelling types of Whiskey of Earth, this drink is a treat for any Diona."
+ color = "#461300" // rgb: 70, 19, 0
+ alcohol_perc = 0.2
+ drink_icon = "islaywhiskey"
+ drink_name = "Islay Whiskey"
+ drink_desc = "Named in honor of one of the most gritty and earth smelling types of Whiskey of Earth, this drink is a treat for any Diona."
+ taste_description = "soil"
+ goal_difficulty = REAGENT_GOAL_NORMAL
+
+/datum/reagent/consumable/ethanol/islay_whiskey/on_mob_life(mob/living/M)
+ if(!isdiona(M))
+ return ..()
+
+ var/mob/living/carbon/human/H = M
+ var/turf/T = get_turf(H)
+ var/light_amount = min(1, T.get_lumcount()) - 0.5
+ if(light_amount > 0.2 && !H.suiciding)
+ H.adjustBruteLoss(-1 * REAGENTS_EFFECT_MULTIPLIER)
+ H.adjustToxLoss(-1 * REAGENTS_EFFECT_MULTIPLIER)
+ H.adjustOxyLoss(-1 * REAGENTS_EFFECT_MULTIPLIER)
+ return ..()
+
+/datum/reagent/consumable/ethanol/jungle_vox
+ name = "Jungle Vox"
+ id = "junglevox"
+ description = "Classy drink in a glass vox head with a bit of liquid nitrogen added on. Perfect for purging dust from a Vox's system."
+ color = "#1ED1CE" // rgb: 30, 209, 206
+ alcohol_perc = 0.2
+ drink_icon = "junglevox"
+ drink_name = "Jungle Vox"
+ drink_desc = "Classy drink in a glass vox head with a bit of liquid nitrogen added on. Perfect for purging dust from a Vox's system."
+ taste_description = "bubbles"
+ goal_difficulty = REAGENT_GOAL_NORMAL
+
+/datum/reagent/consumable/ethanol/jungle_vox/on_mob_add(mob/living/M)
+ if(isvox(M))
+ to_chat(M, "As the dust is filtered out of your lungs, it becomes much easier to breathe.")
+ ADD_TRAIT(M, TRAIT_NOBREATH, id)
+ RegisterSignal(M, COMSIG_AFTER_SPECIES_CHANGE, PROC_REF(on_species_change))
+ return ..()
+
+/datum/reagent/consumable/ethanol/jungle_vox/on_mob_life(mob/living/M)
+ if(!isvox(M))
+ return ..()
+
+ var/update_flags = STATUS_UPDATE_NONE
+ var/mob/living/carbon/human/H = M
+ update_flags |= H.adjustToxLoss(-1 * REAGENTS_EFFECT_MULTIPLIER, FALSE) // Dust.
+ update_flags |= H.adjustOxyLoss(-2 * REAGENTS_EFFECT_MULTIPLIER, FALSE)
+ update_flags |= H.AdjustLoseBreath(-2 SECONDS * REAGENTS_EFFECT_MULTIPLIER, FALSE)
+ return ..() | update_flags
+
+/datum/reagent/consumable/ethanol/jungle_vox/on_mob_delete(mob/living/M)
+ if(isvox(M))
+ to_chat(M, "Your lungs begin to feel dusty again...")
+ REMOVE_TRAIT(M, TRAIT_NOBREATH, id)
+ UnregisterSignal(M, COMSIG_AFTER_SPECIES_CHANGE)
+ return ..()
+
+/datum/reagent/consumable/ethanol/jungle_vox/proc/on_species_change(mob/living/M)
+ SIGNAL_HANDLER // COMSIG_AFTER_SPECIES_CHANGE
+ if(!isvox(M))
+ REMOVE_TRAIT(M, TRAIT_NOBREATH, id)
+ else
+ ADD_TRAIT(M, TRAIT_NOBREATH, id)
+ to_chat(M, "As the dust is filtered out of your lungs, it becomes much easier to breathe.")
+
+/datum/reagent/consumable/ethanol/slime_mold
+ name = "Slime Mold"
+ id = "slimemold"
+ description = "You can swear that this jelly looks alive."
+ color = "#C20458" // rgb: 194, 4, 88
+ alcohol_perc = 0.2
+ drink_icon = "slimemold"
+ drink_name = "Slime Mold"
+ drink_desc = "You can swear that this jelly looks alive."
+ taste_description = "jelly"
+ goal_difficulty = REAGENT_GOAL_HARD
+
+/datum/reagent/consumable/ethanol/slime_mold/on_mob_life(mob/living/M)
+ if(!isslimeperson(M))
+ return ..()
+
+ var/mob/living/carbon/human/H = M
+ if(!(NO_BLOOD in H.dna.species.species_traits))
+ if(H.blood_volume < BLOOD_VOLUME_NORMAL)
+ if(prob(36))
+ to_chat(M, "You feel a surge of invigoration flow through your veins!")
+ H.blood_volume += REAGENTS_METABOLISM
+ return ..()
+
+/datum/reagent/consumable/ethanol/sontse
+ name = "Sontse"
+ id = "sontse"
+ description = "The Sun, in a glass! The radiant energies of this drink will empower any Nian that consumes it."
+ color = "#DDB520" // rgb: 221, 181, 32
+ overdose_threshold = 20
+ allowed_overdose_process = TRUE
+ alcohol_perc = 0.4
+ drink_icon = "sontse"
+ drink_name = "Sontse"
+ drink_desc = "The Sun, in a glass! The radiant energies of this drink will empower any Nian that consumes it."
+ taste_description = "warmth and brightness"
+ goal_difficulty = REAGENT_GOAL_HARD
+ /// Exists purely because of changelings. I hate them.
+ var/activated = FALSE
+
+/datum/reagent/consumable/ethanol/sontse/on_mob_add(mob/living/M)
+ if(ismoth(M))
+ M.set_light(3, 4)
+ M.visible_message(
+ "[M] suddenly starts radiating a brillant light!",
+ "The Sun was within you all this time!"
+ )
+ RegisterSignal(M, COMSIG_AFTER_SPECIES_CHANGE, TYPE_PROC_REF(/datum/reagent/consumable/ethanol/sontse, on_species_change))
+
+/datum/reagent/consumable/ethanol/sontse/on_mob_life(mob/living/M)
+ if(!ismoth(M))
+ return ..()
+
+ if(prob(10))
+ M.reagents.add_reagent("oculine", 1)
+ return ..()
+
+/datum/reagent/consumable/ethanol/sontse/on_mob_delete(mob/living/M)
+ if(ismoth(M))
+ M.set_light(0, null)
+ M.visible_message(
+ "The radiant light of [M] fades away.",
+ "The Sun within you subsides."
+ )
+ UnregisterSignal(M, COMSIG_AFTER_SPECIES_CHANGE)
+ return ..()
+
+/datum/reagent/consumable/ethanol/sontse/overdose_process(mob/living/M, severity)
+ if(!ismoth(M))
+ return ..()
+
+ var/update_flags = STATUS_UPDATE_NONE
+ // The moth flew too close to the sun...
+ if(prob(30))
+ var/turf/T = M.loc
+ playsound(T, 'sound/weapons/sear.ogg', 100, TRUE)
+ new /obj/effect/dummy/lighting_obj(T, M.light_color, M.light_range + 3, M.light_power + 4, 2.6 DECISECONDS)
+ bang(T, holder.my_atom, 5, TRUE, FALSE)
+ update_flags |= M.adjustFireLoss(10 * REAGENTS_EFFECT_MULTIPLIER, FALSE)
+ M.bodytemperature += rand(15, 30)
+ M.visible_message(
+ "The radiant aura of [M] suddenly flares into a blinding flash!",
+ "THE SUN BURNS YOU!",
+ "You briefly feel a wave of warmth wash over you."
+ )
+ return list(0, update_flags)
+
+/datum/reagent/consumable/ethanol/sontse/proc/on_species_change(mob/living/M)
+ SIGNAL_HANDLER // COMSIG_AFTER_SPECIES_CHANGE
+ if(!ismoth(M))
+ M.set_light(0, null)
+ else
+ M.set_light(3, 4)
+ M.visible_message(
+ "[M] suddenly starts radiating a brillant light!",
+ "The Sun was within you all this time!"
+ )
+
+/datum/reagent/consumable/ethanol/ultramatter
+ name = "Ultramatter"
+ id = "ultramatter"
+ description = "In the triangle of fire, this is the apex of fuel. A sacred drink from Boron 5, it is used in cultural and religious events, and is regularly consumed by leadership of the Plasmamen as a show of status."
+ color = "#38004B" // rgb: 56, 0, 75
+ alcohol_perc = 0.7
+ drink_icon = "ultramatter"
+ drink_name = "Ultramatter"
+ drink_desc = "In the triangle of fire, this is the apex of fuel. A sacred drink from Boron 5, it is used in cultural and religious events, and is regularly consumed by leadership of the Plasmamen as a show of status."
+ taste_description = "fire"
+ goal_difficulty = REAGENT_GOAL_HARD
+ var/inflamed = FALSE
+
+/datum/reagent/consumable/ethanol/ultramatter/on_mob_add(mob/living/M)
+ if(isplasmaman(M))
+ ADD_TRAIT(M, TRAIT_RESISTHEAT, id)
+ RegisterSignal(M, COMSIG_AFTER_SPECIES_CHANGE, PROC_REF(on_species_change))
+ return ..()
+
+/datum/reagent/consumable/ethanol/ultramatter/on_mob_life(mob/living/M)
+ if(current_cycle <= 5)
+ return ..()
+
+ // Non plasmamen can be set on fire too. As a treat. :)
+ M.adjust_fire_stacks(3)
+ M.IgniteMob()
+ if(!isplasmaman(M))
+ return ..()
+
+ var/mob/living/carbon/human/H = M
+ var/obj/item/clothing/under/plasmaman/suit = H.w_uniform
+ if(suit)
+ suit.next_extinguish = world.time + 10 SECONDS
+ if(!inflamed)
+ M.visible_message(
+ "[M] expels a flaming substance and suddenly erupts into an inferno!",
+ "You expell flaming substance and become bathed in fire!",
+ "You hear spraying and fire igniting!"
+ )
+ inflamed = TRUE
+ return ..()
+
+/datum/reagent/consumable/ethanol/ultramatter/on_mob_delete(mob/living/M)
+ if(isplasmaman(M))
+ REMOVE_TRAIT(M, TRAIT_RESISTHEAT, id)
+ M.ExtinguishMob()
+ to_chat(M, "The fires surrounding you are quenched!")
+ UnregisterSignal(M, COMSIG_AFTER_SPECIES_CHANGE)
+ return ..()
+
+/datum/reagent/consumable/ethanol/ultramatter/proc/on_species_change(mob/living/M)
+ SIGNAL_HANDLER // COMSIG_AFTER_SPECIES_CHANGE
+ if(!isplasmaman(M))
+ REMOVE_TRAIT(M, TRAIT_RESISTHEAT, id)
+ else
+ ADD_TRAIT(M, TRAIT_RESISTHEAT, id)
diff --git a/code/modules/reagents/chemistry/reagents/drinks_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks_reagents.dm
index d71f3efa9c2..8b25d4a1f37 100644
--- a/code/modules/reagents/chemistry/reagents/drinks_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drinks_reagents.dm
@@ -757,11 +757,11 @@
/datum/reagent/consumable/drink/fyrsskar_tears
name = "Tears of Fyrsskar"
id = "fyrsskartears"
- description = "Plasmonic based drink that was consumed by ancient inhabitants of Skrellian homeworld."
+ description = "Plasmonic based drink that was consumed by ancient inhabitants of Skrellian homeworld to purge impurities."
color = "#C300AE" // rgb: 195, 0, 174
drink_icon = "fyrsskartears"
drink_name = "Tears of Fyrsskar"
- drink_desc = "Plasmonic based drink that was consumed by ancient inhabitants of Skrellian homeworld."
+ drink_desc = "Plasmonic based drink that was consumed by ancient inhabitants of Skrellian homeworld to purge impurities."
taste_description = "plasma"
var/alcohol_perc = 0.05
var/dizzy_adj = 6 SECONDS
@@ -769,10 +769,16 @@
/datum/reagent/consumable/drink/fyrsskar_tears/on_mob_add(mob/living/M)
if(isskrell(M))
ADD_TRAIT(M, TRAIT_ALCOHOL_TOLERANCE, id)
+ RegisterSignal(M, COMSIG_AFTER_SPECIES_CHANGE, PROC_REF(on_species_change))
+ return ..()
/datum/reagent/consumable/drink/fyrsskar_tears/on_mob_life(mob/living/M)
if(!isskrell(M))
return ..()
+
+ for(var/datum/reagent/R in M.reagents.reagent_list)
+ if(R != src)
+ M.reagents.remove_reagent(R.id, 5)
// imitate alcohol effects using current cycle
M.AdjustDrunk(alcohol_perc STATUS_EFFECT_CONSTANT)
M.AdjustDizzy(dizzy_adj, bound_upper = 1.5 MINUTES)
@@ -781,6 +787,15 @@
/datum/reagent/consumable/drink/fyrsskar_tears/on_mob_delete(mob/living/M)
if(isskrell(M))
REMOVE_TRAIT(M, TRAIT_ALCOHOL_TOLERANCE, id)
+ UnregisterSignal(M, COMSIG_AFTER_SPECIES_CHANGE)
+ return ..()
+
+/datum/reagent/consumable/drink/fyrsskar_tears/proc/on_species_change(mob/living/M)
+ SIGNAL_HANDLER // COMSIG_AFTER_SPECIES_CHANGE
+ if(!isskrell(M))
+ REMOVE_TRAIT(M, TRAIT_ALCOHOL_TOLERANCE, id)
+ else
+ ADD_TRAIT(M, TRAIT_ALCOHOL_TOLERANCE, id)
/datum/reagent/consumable/drink/lean
name = "Lean"