diff --git a/code/modules/mob/living/carbon/diona_base.dm b/code/modules/mob/living/carbon/diona_base.dm
index 1234820d47b..6b20935655c 100644
--- a/code/modules/mob/living/carbon/diona_base.dm
+++ b/code/modules/mob/living/carbon/diona_base.dm
@@ -92,7 +92,7 @@ var/list/diona_banned_languages = list(
if(DS.nutrient_organ.is_bruised())
plus *= 0.5
plus = min(plus, max_nutrition - nutrition)
-
+
adjustNutritionLoss(-plus)
return plus*7 //The return value is the number of moles to remove from the local environment
@@ -299,7 +299,8 @@ var/list/diona_banned_languages = list(
"You begin to shift and quiver, feeling a stirring within your trunk")
DS.regening_organ = TRUE
- addtimer(CALLBACK(src, .proc/diona_regen_callback, path), 52)
+ to_chat(src, "You are trying to regrow a lost limb, this is a long and complicated process that will take 10 minutes!")
+ addtimer(CALLBACK(src, .proc/diona_regen_callback, path), 10 MINUTES)
return
diff --git a/code/modules/mob/living/carbon/human/diona_gestalt.dm b/code/modules/mob/living/carbon/human/diona_gestalt.dm
index 0b765c96624..fa6b2b4877f 100644
--- a/code/modules/mob/living/carbon/human/diona_gestalt.dm
+++ b/code/modules/mob/living/carbon/human/diona_gestalt.dm
@@ -14,7 +14,6 @@
var/datum/dionastats/DS
-
/mob/living/carbon/human/proc/setup_gestalt()
composition_reagent = "nutriment"//Dionae are plants, so eating them doesn't give animal protein
setup_dionastats()
@@ -22,7 +21,6 @@
verbs += /mob/living/carbon/human/proc/diona_split_nymph
verbs += /mob/living/proc/devour
-
spawn(10)
//This is delayed after a gestalt is spawned, to allow nymphs to be added to it before extras are created
//These initial nymphs are the nymph which grows into a gestalt, and any others it had inside it
@@ -236,6 +234,7 @@
if(!O || O.is_stump())
nymphs_to_kill_off += 1
+ var/total_nymph = 0
for(var/mob/living/carbon/alien/diona/D in src)
if(nymphs_to_kill_off > 0)
D.stat = DEAD
@@ -252,6 +251,7 @@
D.set_dir(pick(NORTH, SOUTH, EAST, WEST))
D.gestalt = null
if (D.stat != DEAD && D.health > (D.maxHealth*0.1))//If a nymph is alive and has enough health, it will emerge from the gestalt
+ total_nymph += 1
D.stat = CONSCIOUS
D.stunned = 0
D.update_verbs()
@@ -267,7 +267,9 @@
drop_from_inventory(W)
if (bestNymph)
+ var/split_reag_volume = src.reagents.total_volume / total_nymph // All nymps needs to get reagents of Gestal split between.
for(var/mob/living/carbon/alien/diona/D in nymphos)
+ src.reagents.trans_to_mob(D, split_reag_volume, CHEM_BLOOD)
D.master_nymph = bestNymph
D.birds_of_feather += nymphos
D.pixel_y += rand(-10,10)
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 6f0833da6a2..72a7a108f10 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -157,10 +157,13 @@
message = uppertext(message)
verb = "yells loudly"
- var/list/returns[3]
+ var/list/returns[4]
returns[1] = message
returns[2] = verb
returns[3] = speech_problem_flag
+ returns[4] = world.view
+
+ returns = species.handle_speech_problems(src, returns, message, verb, message_mode)
return returns
/mob/living/carbon/human/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
@@ -217,12 +220,9 @@
used_radios += r_ear
/mob/living/carbon/human/handle_speech_sound()
- if(species.speech_sounds && prob(species.speech_chance))
- var/list/returns[2]
- returns[1] = sound(pick(species.speech_sounds))
- returns[2] = 50
- return returns
- return ..()
+ var/list/returns = ..()
+ returns = species.handle_speech_sound(src, returns)
+ return returns
/mob/living/carbon/human/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null)
for(var/T in get_traumas())
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 82464b91966..6864ea39c24 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -512,7 +512,16 @@
/datum/species/proc/bullet_act(var/obj/item/projectile/P, var/def_zone, var/mob/living/carbon/human/H)
return 0
+/datum/species/proc/handle_speech_problems(mob/living/carbon/human/H, list/current_flags, message, message_verb, message_mode)
+ return current_flags
+
+/datum/species/proc/handle_speech_sound(mob/living/carbon/human/H, list/current_flags)
+ if(speech_sounds && prob(speech_chance))
+ current_flags[1] = sound(pick(speech_sounds))
+ current_flags[2] = 50
+ return current_flags
+
/datum/species/proc/set_default_hair(var/mob/living/carbon/human/H)
H.h_style = H.species.default_h_style
H.f_style = H.species.default_f_style
- H.update_hair()
\ No newline at end of file
+ H.update_hair()
diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm
index 68f73f3e739..39b711bffe2 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -343,6 +343,7 @@
sprint_speed_factor = 0.5 //Speed gained is minor
sprint_cost_factor = 0.8
climb_coeff = 1.3
+ vision_organ = "head"
max_hydration_factor = -1
@@ -403,6 +404,17 @@
// This proc sleeps. Async it.
INVOKE_ASYNC(H, /mob/living/carbon/human/proc/diona_split_into_nymphs)
+/datum/species/diona/handle_speech_problems(mob/living/carbon/human/H, list/current_flags, message, message_verb, message_mode)
+// Diona without head can live, but they cannot talk as loud anymore.
+ var/obj/item/organ/external/O = H.organs_by_name["head"]
+ current_flags[4] = O.is_stump() ? 3 : world.view
+ return current_flags
+
+/datum/species/diona/handle_speech_sound(mob/living/carbon/human/H, list/current_flags)
+ current_flags = ..()
+ var/obj/item/organ/external/O = H.organs_by_name["head"]
+ current_flags[3] = O.is_stump()
+ return current_flags
/datum/species/machine
name = "Baseline Frame"
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index d6d78d09cac..d8648496805 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -99,7 +99,7 @@ proc/get_radio_key_from_channel(var/channel)
return 0
/mob/living/proc/handle_speech_problems(var/message, var/verb, var/message_mode)
- var/list/returns[3]
+ var/list/returns[4]
var/speech_problem_flag = 0
if((HULK in mutations) && health >= 25 && length(message))
message = "[uppertext(message)]!!!"
@@ -122,13 +122,14 @@ proc/get_radio_key_from_channel(var/channel)
verb = pick("slobbers","slurs")
speech_problem_flag = 1
if(prob(50))
- src << "You struggle to speak with your dislocated jaw!"
+ to_chat(src, "You struggle to speak with your dislocated jaw!")
if(prob(10))
- src << "You feel a sharp pain from your jaw as you speak!"
+ to_chat(src, "You feel a sharp pain from your jaw as you speak!")
src.Weaken(3)
returns[1] = message
returns[2] = verb
returns[3] = speech_problem_flag
+ returns[4] = world.view
return returns
/mob/living/proc/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
@@ -139,9 +140,10 @@ proc/get_radio_key_from_channel(var/channel)
return 0
/mob/living/proc/handle_speech_sound()
- var/list/returns[2]
+ var/list/returns[3]
returns[1] = null
returns[2] = null
+ returns[3] = FALSE
return returns
/mob/living/proc/get_speech_ending(verb, var/ending)
@@ -155,7 +157,7 @@ proc/get_radio_key_from_channel(var/channel)
if(client)
if(client.prefs.muted & MUTE_IC)
- src << "You cannot speak in IC (Muted)."
+ to_chat(src, "You cannot speak in IC (Muted).")
return
if(stat)
@@ -197,17 +199,18 @@ proc/get_radio_key_from_channel(var/channel)
verb = say_quote(message, speaking)
if(is_muzzled())
- src << "You're muzzled and cannot speak!"
+ to_chat(src, "You're muzzled and cannot speak!")
return
message = trim_left(message)
-
+ var/message_range
if(!(speaking && (speaking.flags & NO_STUTTER)))
message = handle_autohiss(message, speaking)
var/list/handle_s = handle_speech_problems(message, verb, message_mode)
message = handle_s[1]
verb = handle_s[2]
+ message_range = handle_s[4]
if(!message || message == "")
return 0
@@ -228,9 +231,9 @@ proc/get_radio_key_from_channel(var/channel)
var/list/handle_v = handle_speech_sound()
var/sound/speech_sound = handle_v[1]
var/sound_vol = handle_v[2]
+ var/italics = handle_v[3]
+
- var/italics = 0
- var/message_range = world.view
//speaking into radios
if(used_radios.len)
diff --git a/code/modules/organs/subtypes/diona.dm b/code/modules/organs/subtypes/diona.dm
index 1af02f3c7e7..803550ee31e 100644
--- a/code/modules/organs/subtypes/diona.dm
+++ b/code/modules/organs/subtypes/diona.dm
@@ -178,8 +178,7 @@
dislocated = -1
joint = "structural ligament"
amputation_point = "branch"
-
-
+ vital = FALSE // Lore team requested this, not vital organ. We can still live without it.
/obj/item/organ/diona/process()
return
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
index 81ab53a3c96..a34437718ae 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
@@ -321,8 +321,11 @@
/datum/reagent/radium/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
M.apply_effect(10 * removed, IRRADIATE, blocked = 0) // Radium may increase your chances to cure a disease
- if(alien == IS_DIONA)
+ if(M.is_diona())
M.adjustToxLoss(-20 * removed)
+ M.adjustBruteLoss(-20 * removed)
+ M.adjustFireLoss(-20 * removed)
+ to_chat(M, "You feel an extreme energy as your body regenerates faster.")
return
if(M.virus2.len)
for(var/ID in M.virus2)
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
index 600676a5b48..7f7e9565eac 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
@@ -455,7 +455,7 @@
var/last_taste_time = -10000
/datum/reagent/hyronalin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
- if(alien == IS_DIONA)
+ if(M.is_diona())
if(last_taste_time + 950 < world.time) // Not to spam message
to_chat(M, "Your body withers as you feel a searing pain throughout.")
last_taste_time = world.time
@@ -478,7 +478,7 @@
var/last_taste_time = -10000
/datum/reagent/arithrazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
- if(alien == IS_DIONA)
+ if(M.is_diona())
if(last_taste_time + 450 < world.time) // Not to spam message
to_chat(M, "Your body withers as you feel a searing pain throughout.")
last_taste_time = world.time
diff --git a/html/changelogs/Sindorman-Diona.yml b/html/changelogs/Sindorman-Diona.yml
new file mode 100644
index 00000000000..f7477bde23c
--- /dev/null
+++ b/html/changelogs/Sindorman-Diona.yml
@@ -0,0 +1,16 @@
+author: PoZe
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - tweak: "Diona no longer splits after loosing head. However without head their speech range is reduced to 3 tiles and is muffled, and they go blind."
+ - tweak: "When Diona Gestalt splits all their reagents are transfered equally among nymphs. Meaning if you had some reagents that killed you, your nymphs might die as well."
+ - tweak: "Diona nymph is not affected same way by Arithrazine, Hyronalin, Radium."
+ - tweak: "Radium now heals brute, burn, and toxin damage for Diona Gestalt and numphs."
+ - tweak: "Time to regrow a limb for Diona was increased from 1 minutes to 10 minutes, if all requirements are met."