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.
This commit is contained in:
Mykhailo Bykhovtsev
2018-11-04 00:00:38 +02:00
committed by Erki
parent 8bfdd464d7
commit 581f9c6153
10 changed files with 71 additions and 26 deletions
+3 -2
View File
@@ -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(
"<span class='warning'>You begin to shift and quiver, feeling a stirring within your trunk</span>")
DS.regening_organ = TRUE
addtimer(CALLBACK(src, .proc/diona_regen_callback, path), 52)
to_chat(src, "<span class='notice'>You are trying to regrow a lost limb, this is a long and complicated process that will take 10 minutes!</span>")
addtimer(CALLBACK(src, .proc/diona_regen_callback, path), 10 MINUTES)
return
@@ -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)
+7 -7
View File
@@ -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())
@@ -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()
H.update_hair()
@@ -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"
+12 -9
View File
@@ -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 << "<span class='danger'>You struggle to speak with your dislocated jaw!</span>"
to_chat(src, "<span class='danger'>You struggle to speak with your dislocated jaw!</span>")
if(prob(10))
src << "<span class='danger'>You feel a sharp pain from your jaw as you speak!</span>"
to_chat(src, "<span class='danger'>You feel a sharp pain from your jaw as you speak!</span>")
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 << "<span class='warning'>You cannot speak in IC (Muted).</span>"
to_chat(src, "<span class='warning'>You cannot speak in IC (Muted).</span>")
return
if(stat)
@@ -197,17 +199,18 @@ proc/get_radio_key_from_channel(var/channel)
verb = say_quote(message, speaking)
if(is_muzzled())
src << "<span class='danger'>You're muzzled and cannot speak!</span>"
to_chat(src, "<span class='danger'>You're muzzled and cannot speak!</span>")
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)