diff --git a/code/modules/mob/living/carbon/diona_base.dm b/code/modules/mob/living/carbon/diona_base.dm index 07b0b951304..f9984497239 100644 --- a/code/modules/mob/living/carbon/diona_base.dm +++ b/code/modules/mob/living/carbon/diona_base.dm @@ -32,6 +32,7 @@ var/list/diona_banned_languages = list( if (life_tick % 2 == 0)//Only fetch the lightlevel every other proc to save performance if (DS.last_location != loc || life_tick % 4 == 0)//Fetch it even less often if we haven't moved since last check light_amount = get_lightlevel_diona(DS) + DS.last_lightlevel = light_amount DS.stored_energy += light_amount @@ -306,6 +307,7 @@ var/list/diona_banned_languages = list( B.touch_turf(get_turf(src)) H.regenerate_icons() DS.LMS = min(2, DS.LMS)//Prevents a message about darkness in light areas + H.update_dionastats()//Re-find the organs in case they were lost or regained updatehealth() return @@ -328,9 +330,11 @@ var/list/diona_banned_languages = list( if (path) if (DS.stored_energy < REGROW_ENERGY_REQ) src << "You try to regrow a lost organ, but you lack the energy. Find more light!" + return if (H.nutrition < REGROW_FOOD_REQ) src << "You try to regrow a lost organ, but you lack the biomass. Find some food!" + return DS.stored_energy -= REGROW_ENERGY_REQ H.nutrition -= REGROW_FOOD_REQ @@ -340,6 +344,7 @@ var/list/diona_banned_languages = list( src << "You feel a shifting sensation inside you as your nymphs move apart to make space, forming a new [O.name]" H.regenerate_icons() DS.LMS = max(2, DS.LMS)//Prevents a message about darkness in light areas + H.update_dionastats()//Re-find the organs in case they were lost or regained updatehealth() return @@ -386,7 +391,7 @@ var/list/diona_banned_languages = list( DS.EP = DS.stored_energy / DS.max_energy if (DS.LMS == 1)//If we're full - if (DS.EP <= 0.8)//But at <=80% energy + if (DS.EP <= 0.8 && DS.last_lightlevel <= 0)//But at <=80% energy DS.LMS = 2 src << "The darkness makes you uncomfortable" @@ -394,7 +399,7 @@ var/list/diona_banned_languages = list( if (DS.EP >= 0.99) DS.LMS = 1 src << "You bask in the light" - else if (DS.EP <= 0.4) + else if (DS.EP <= 0.4 && DS.last_lightlevel <= 0) DS.LMS = 3 src << "You feel lethargic as your energy drains away. Find some light soon!" @@ -402,7 +407,7 @@ var/list/diona_banned_languages = list( if (DS.EP >= 0.5) DS.LMS = 2 src << "You feel a little more energised as you return to the light. Stay awhile" - else if (DS.EP <= 0.0) + else if (DS.EP <= 0.0 && DS.last_lightlevel <= 0) DS.LMS = 4 src << " You feel sensory distress as your tendrils start to wither in the darkness. You will die soon without light" //From here down, we immediately return to state 3 if we get any light @@ -410,7 +415,7 @@ var/list/diona_banned_languages = list( if (DS.EP > 0.0)//If there's any light at all, we can be saved src << "At long last, light! Treasure it, savour it, hold onto it" DS.LMS = 3 - else + else if(DS.last_lightlevel <= 0) var/HP = diona_get_health(DS) / DS.max_health//HP = health-percentage if (DS.LMS == 4) if (HP < 0.6) @@ -440,7 +445,7 @@ if (flashlight_active) //GETTER FUNCTIONS /mob/living/carbon/proc/get_lightlevel_diona(var/datum/dionastats/DS) - var/light_amount = 1.5 //how much light there is in the place, affects receiving nutrition and healing + var/light_amount = DIONA_MAX_LIGHT //how much light there is in the place, affects receiving nutrition and healing var/light_factor = 1//used for if a gestalt's response node is damaged. it will feed more slowly if (DS.light_organ) @@ -448,6 +453,8 @@ if (flashlight_active) light_factor = 0.55 else if (DS.light_organ.is_bruised()) light_factor = 0.8 + else if (DS.dionatype == 2) + light_factor = 0.55 var/turf/T = get_turf(src) var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T diff --git a/code/modules/mob/living/carbon/human/diona_gestalt.dm b/code/modules/mob/living/carbon/human/diona_gestalt.dm index c05aeaaa1f4..9fbded9679a 100644 --- a/code/modules/mob/living/carbon/human/diona_gestalt.dm +++ b/code/modules/mob/living/carbon/human/diona_gestalt.dm @@ -119,6 +119,9 @@ set category = "Abilities" set name = "Check light level" + if (!DS.light_organ || DS.light_organ.is_broken() || DS.light_organ.is_bruised()) + usr << span("danger", "Our response node is damaged or missing, without it we can't tell light from darkness. We can only hope this area is bright enough to let us regenerate it!") + return var/light = get_lightlevel_diona(DS) if (light <= -0.75) @@ -142,6 +145,8 @@ var/dark_consciousness = 120//How long this diona can stay on its feet and keep moving in darkness after energy is gone. var/dark_survival = 180//How long this diona can survive in darkness after energy is gone, before it dies + + var/MLS = (1.5 / 2.1)//Maximum (energy) lost per second, in total darkness DS = new/datum/dionastats() DS.max_energy = energy_duration * MLS @@ -157,6 +162,17 @@ if (istype(organ, /obj/item/organ/diona/nutrients)) DS.nutrient_organ = organ +//This proc can be called if some dionastats information needs to be refreshed or re-found +//Currently only used for refreshing organs +/mob/living/carbon/human/proc/update_dionastats() + DS.light_organ = null + DS.nutrient_organ = null + + for (var/organ in internal_organs) + if (istype(organ, /obj/item/organ/diona/node)) + DS.light_organ = organ + if (istype(organ, /obj/item/organ/diona/nutrients)) + DS.nutrient_organ = organ //Splitting functions //==================== diff --git a/code/modules/organs/organ_alien.dm b/code/modules/organs/organ_alien.dm index 4e15573124a..a92f4aa66bf 100644 --- a/code/modules/organs/organ_alien.dm +++ b/code/modules/organs/organ_alien.dm @@ -24,6 +24,8 @@ dislocated = -1 status = ORGAN_PLANT + + /obj/item/organ/external/diona/chest name = "core trunk" limb_name = "chest" @@ -136,7 +138,11 @@ var/mob/living/carbon/human/H = owner ..() if(!istype(H) || !H.organs || !H.organs.len) - H.death() + H.death()//if you somehow remove all of a gestalt's organs, it will dissolve into nymphs + + if (H.is_diona()) + spawn(1) + H.update_dionastats()//This ensures that the dionastats registers the removal of an organ /obj/item/organ/diona/process() @@ -183,6 +189,17 @@ if(!istype(H) || !H.organs || !H.organs.len) H.death() +/obj/item/organ/diona/removed() + var/mob/living/carbon/human/H = owner + ..() + if(!istype(H) || !H.organs || !H.organs.len) + H.death()//if you somehow remove all of a gestalt's organs, it will dissolve into nymphs + + if (H.is_diona()) + spawn(1) + H.update_dionastats()//This ensures that the dionastats registers the removal of an organ + + // These are different to the standard diona organs as they have a purpose in other // species (absorbing radiation and light respectively) /obj/item/organ/diona/nutrients @@ -412,7 +429,7 @@ icon_state = "tracheae" /obj/item/organ/vaurca/tracheae/removed() return */ - + // Skeleton limbs. /obj/item/organ/external/chest/skeleton name = "rib cage" @@ -420,7 +437,7 @@ /obj/item/organ/external/groin/skeleton name = "pelvis" vital = 0 - + /obj/item/organ/external/arm/skeleton dislocated = -1