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."