From 581f9c615309ab42d93af0e58cb89e09937ffd6e Mon Sep 17 00:00:00 2001 From: Mykhailo Bykhovtsev Date: Sat, 3 Nov 2018 15:00:38 -0700 Subject: [PATCH] Diona update (#5381) This was requested by Lore team. Diona no longer splits after loosing their head. Without head Diona's speech range is reduced to 3 tiles(number might be changed) and is muffled. Without head Diona goes blind Time to regenerate limb for Diona is increased from minute to 10 minutes. Fixes #5472 Fixes #5418 Diona will be notified when they attempt to regrow lost limb. Tiny code cleanup(replacing usr << with to_chat) Radium now cures burn, brute, toxin damage for Diona. All reagents that affect Diona gestalt now affect nymphs as well When being split diona Gestalt now distributes all reagents to nymphs equally. --- code/modules/mob/living/carbon/diona_base.dm | 5 +++-- .../mob/living/carbon/human/diona_gestalt.dm | 6 ++++-- code/modules/mob/living/carbon/human/say.dm | 14 ++++++------- .../living/carbon/human/species/species.dm | 11 +++++++++- .../carbon/human/species/station/station.dm | 12 +++++++++++ code/modules/mob/living/say.dm | 21 +++++++++++-------- code/modules/organs/subtypes/diona.dm | 3 +-- .../Chemistry-Reagents-Dispenser.dm | 5 ++++- .../Chemistry-Reagents-Medicine.dm | 4 ++-- html/changelogs/Sindorman-Diona.yml | 16 ++++++++++++++ 10 files changed, 71 insertions(+), 26 deletions(-) create mode 100644 html/changelogs/Sindorman-Diona.yml 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."