From fc9ef418eb11dd782d94bc90d04a46a20d2b7ea7 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 24 Jul 2023 19:16:26 +1000 Subject: [PATCH 01/32] Adding get_max_health() to mobs. --- code/game/machinery/mech_recharger.dm | 2 +- code/modules/blob/blob.dm | 24 +++++++------- .../integrated_electronics/subtypes/input.dm | 12 +++---- code/modules/mechs/mech_damage.dm | 10 +++--- code/modules/mob/living/bot/bot.dm | 11 ++++--- code/modules/mob/living/bot/ed209bot.dm | 2 +- code/modules/mob/living/bot/farmbot.dm | 2 +- code/modules/mob/living/bot/mulebot.dm | 2 +- code/modules/mob/living/bot/remotebot.dm | 2 +- code/modules/mob/living/bot/secbot.dm | 4 +-- code/modules/mob/living/carbon/alien/alien.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 4 +-- .../mob/living/carbon/human/human_damage.dm | 7 +++-- .../mob/living/carbon/human/human_movement.dm | 2 +- .../mob/living/carbon/human/human_species.dm | 5 +-- code/modules/mob/living/carbon/human/life.dm | 5 +-- code/modules/mob/living/deity/deity.dm | 2 +- .../mob/living/deity/phenomena/conjuration.dm | 2 +- code/modules/mob/living/living.dm | 31 ++++++++++++------- code/modules/mob/living/living_defines.dm | 2 +- code/modules/mob/living/living_powers.dm | 2 +- code/modules/mob/living/silicon/ai/ai.dm | 9 +++--- .../mob/living/silicon/ai/ai_damage.dm | 11 ++++--- .../mob/living/silicon/robot/drone/drone.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 2 +- .../mob/living/silicon/robot/robot_damage.dm | 5 ++- code/modules/mob/living/silicon/silicon.dm | 2 +- .../simple_animal/aquatic/aquatic_carp.dm | 2 +- .../simple_animal/aquatic/aquatic_fish.dm | 2 +- .../simple_animal/aquatic/aquatic_sharks.dm | 4 +-- .../simple_animal/constructs/constructs.dm | 17 +++++----- .../simple_animal/familiars/familiars.dm | 15 ++++----- .../living/simple_animal/friendly/koala.dm | 2 +- .../living/simple_animal/friendly/lizard.dm | 2 +- .../living/simple_animal/friendly/mouse.dm | 6 ++-- .../living/simple_animal/friendly/mushroom.dm | 2 +- .../living/simple_animal/friendly/possum.dm | 2 +- .../living/simple_animal/friendly/tomato.dm | 2 +- .../living/simple_animal/hostile/antlion.dm | 6 ++-- .../living/simple_animal/hostile/bad_drone.dm | 2 +- .../mob/living/simple_animal/hostile/bat.dm | 2 +- .../mob/living/simple_animal/hostile/bear.dm | 2 +- .../mob/living/simple_animal/hostile/carp.dm | 6 ++-- .../hostile/commanded/bear_companion.dm | 2 +- .../hostile/commanded/nanomachines.dm | 6 ++-- .../living/simple_animal/hostile/creature.dm | 2 +- .../mob/living/simple_animal/hostile/drake.dm | 2 +- .../simple_animal/hostile/faithful_hound.dm | 2 +- .../living/simple_animal/hostile/faithless.dm | 2 +- .../simple_animal/hostile/giant_spider.dm | 22 +++++++------ .../living/simple_animal/hostile/hivebot.dm | 8 ++--- .../mob/living/simple_animal/hostile/leech.dm | 4 +-- .../mob/living/simple_animal/hostile/mimic.dm | 4 +-- .../mob/living/simple_animal/hostile/pike.dm | 2 +- .../simple_animal/hostile/retaliate/clown.dm | 2 +- .../simple_animal/hostile/retaliate/drone.dm | 18 ++++++----- .../hostile/retaliate/exoplanet.dm | 10 +++--- .../hostile/retaliate/giant_crab.dm | 2 +- .../retaliate/giant_parrot/giant_parrot.dm | 6 ++-- .../simple_animal/hostile/retaliate/goose.dm | 6 ++-- .../simple_animal/hostile/retaliate/jelly.dm | 12 +++---- .../hostile/retaliate/king_of_goats.dm | 10 +++--- .../mob/living/simple_animal/hostile/slug.dm | 2 +- .../mob/living/simple_animal/hostile/tree.dm | 2 +- .../living/simple_animal/hostile/vagrant.dm | 8 ++--- .../simple_animal/hostile/viscerator.dm | 2 +- .../modules/mob/living/simple_animal/shade.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 18 ++++++----- code/modules/organs/external/_external.dm | 2 +- code/modules/organs/internal/heart.dm | 2 +- code/modules/paperwork/photography.dm | 4 +-- .../spells/aoe_turf/conjure/druidic_spells.dm | 12 +++---- code/modules/spells/targeted/shapeshift.dm | 9 +++--- maps/away/bearcat/bearcat.dm | 5 +-- maps/away/errant_pisces/errant_pisces.dm | 2 +- maps/away/slavers/slavers_base.dm | 2 +- .../exoplanet_ruins/hydrobase/hydrobase.dm | 4 +-- .../away_sites/lar_maria/lar_maria.dm | 6 ++-- mods/content/xenobiology/circuit.dm | 2 +- .../content/xenobiology/mobs/critter_slime.dm | 4 +-- .../xenobiology/mobs/slime_feeding_helpers.dm | 2 +- mods/content/xenobiology/slime/_slime.dm | 10 +++--- mods/content/xenobiology/slime/feeding.dm | 2 +- mods/content/xenobiology/slime/powers.dm | 2 +- mods/mobs/dionaea/mob/_nymph.dm | 2 +- mods/species/ascent/mobs/nymph/_nymph.dm | 2 +- 86 files changed, 245 insertions(+), 225 deletions(-) diff --git a/code/game/machinery/mech_recharger.dm b/code/game/machinery/mech_recharger.dm index 1738984bce3..f7b7e374da3 100644 --- a/code/game/machinery/mech_recharger.dm +++ b/code/game/machinery/mech_recharger.dm @@ -90,7 +90,7 @@ // An ugly proc, but apparently mechs don't have maxhealth var of any kind. /obj/machinery/mech_recharger/proc/fully_repaired() - return charging && (charging.health == charging.maxHealth) + return charging && (charging.health == charging.get_max_health()) /obj/machinery/mech_recharger/proc/start_charging(var/mob/living/exosuit/M) if(stat & (NOPOWER | BROKEN)) diff --git a/code/modules/blob/blob.dm b/code/modules/blob/blob.dm index 1922422afa3..6ad15e5dbd2 100644 --- a/code/modules/blob/blob.dm +++ b/code/modules/blob/blob.dm @@ -12,7 +12,7 @@ layer = BLOB_SHIELD_LAYER - var/maxHealth = 30 + var/blob_max_health = 30 var/health var/regen_rate = 5 var/brute_resist = 4.3 @@ -28,7 +28,7 @@ /obj/effect/blob/Initialize() . = ..() - health = maxHealth + health = blob_max_health update_icon() START_PROCESSING(SSblob, src) @@ -46,7 +46,7 @@ take_damage(rand(140 - (severity * 40), 140 - (severity * 20)) / brute_resist) /obj/effect/blob/on_update_icon() - if(health > maxHealth / 2) + if(health > blob_max_health / 2) icon_state = "blob" else icon_state = "blob_damaged" @@ -66,7 +66,7 @@ update_icon() /obj/effect/blob/proc/regen() - health = min(health + regen_rate, maxHealth) + health = min(health + regen_rate, blob_max_health) update_icon() /obj/effect/blob/proc/expand(var/turf/T) @@ -196,7 +196,7 @@ name = "master nucleus" desc = "A massive, fragile nucleus guarded by a shield of thick tendrils." icon_state = "blob_core" - maxHealth = 450 + blob_max_health = 450 damage_min = 30 damage_max = 40 expandType = /obj/effect/blob/shield @@ -210,7 +210,7 @@ var/times_to_pulse = 0 /obj/effect/blob/core/proc/get_health_percent() - return ((health / maxHealth) * 100) + return ((health / blob_max_health) * 100) /* the master core becomes more vulnereable to damage as it weakens, @@ -282,7 +282,7 @@ regen() will cover update_icon() for this proc name = "auxiliary nucleus" desc = "An interwoven mass of tendrils. A glowing nucleus pulses at its center." icon_state = "blob_node" - maxHealth = 125 + blob_max_health = 125 regen_rate = 1 damage_min = 15 damage_max = 20 @@ -294,13 +294,13 @@ regen() will cover update_icon() for this proc return /obj/effect/blob/core/secondary/on_update_icon() - icon_state = (health / maxHealth >= 0.5) ? "blob_node" : "blob_factory" + icon_state = (health / blob_max_health >= 0.5) ? "blob_node" : "blob_factory" /obj/effect/blob/shield name = "shielding mass" desc = "A pulsating mass of interwoven tendrils. These seem particularly robust, but not quite as active." icon_state = "blob_idle" - maxHealth = 120 + blob_max_health = 120 damage_min = 13 damage_max = 25 attack_freq = 7 @@ -318,9 +318,9 @@ regen() will cover update_icon() for this proc return ..() /obj/effect/blob/shield/on_update_icon() - if(health > maxHealth * 2 / 3) + if(health > blob_max_health * 2 / 3) icon_state = "blob_idle" - else if(health > maxHealth / 3) + else if(health > blob_max_health / 3) icon_state = "blob" else icon_state = "blob_damaged" @@ -331,7 +331,7 @@ regen() will cover update_icon() for this proc /obj/effect/blob/ravaging name = "ravaging mass" desc = "A mass of interwoven tendrils. They thrash around haphazardly at anything in reach." - maxHealth = 20 + blob_max_health = 20 damage_min = 27 damage_max = 36 attack_freq = 3 diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index eca6e1289c2..1c6b4d186f1 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -197,15 +197,15 @@ return if(H in view(get_turf(src))) // Like medbot's analyzer it can be used in range.. - + var/current_max_health = H.get_max_health() var/obj/item/organ/internal/brain = GET_INTERNAL_ORGAN(H, BP_BRAIN) set_pin_data(IC_OUTPUT, 1, (brain && H.stat != DEAD)) set_pin_data(IC_OUTPUT, 2, (H.stat == CONSCIOUS)) - set_pin_data(IC_OUTPUT, 3, damage_to_severity(100 * H.getBruteLoss() / H.maxHealth)) - set_pin_data(IC_OUTPUT, 4, damage_to_severity(100 * H.getFireLoss() / H.maxHealth)) - set_pin_data(IC_OUTPUT, 5, damage_to_severity(100 * H.getToxLoss() / H.maxHealth)) - set_pin_data(IC_OUTPUT, 6, damage_to_severity(100 * H.getOxyLoss() / H.maxHealth)) - set_pin_data(IC_OUTPUT, 7, damage_to_severity(100 * H.getCloneLoss() / H.maxHealth)) + set_pin_data(IC_OUTPUT, 3, damage_to_severity(100 * H.getBruteLoss() / current_max_health)) + set_pin_data(IC_OUTPUT, 4, damage_to_severity(100 * H.getFireLoss() / current_max_health)) + set_pin_data(IC_OUTPUT, 5, damage_to_severity(100 * H.getToxLoss() / current_max_health)) + set_pin_data(IC_OUTPUT, 6, damage_to_severity(100 * H.getOxyLoss() / current_max_health)) + set_pin_data(IC_OUTPUT, 7, damage_to_severity(100 * H.getCloneLoss() / current_max_health)) set_pin_data(IC_OUTPUT, 8, H.get_pulse_as_number()) set_pin_data(IC_OUTPUT, 9, H.get_blood_oxygenation()) set_pin_data(IC_OUTPUT, 10, damage_to_severity(H.get_shock())) diff --git a/code/modules/mechs/mech_damage.dm b/code/modules/mechs/mech_damage.dm index 84e74389446..c39f2017875 100644 --- a/code/modules/mechs/mech_damage.dm +++ b/code/modules/mechs/mech_damage.dm @@ -80,9 +80,11 @@ if(body_armor) . += body_armor +/mob/living/exosuit/get_max_health() + return (body ? body.mech_health : 0) + /mob/living/exosuit/updatehealth() - maxHealth = body ? body.mech_health : 0 - health = maxHealth-(getFireLoss()+getBruteLoss()) + health = get_max_health()-(getFireLoss()+getBruteLoss()) /mob/living/exosuit/adjustFireLoss(var/amount, var/obj/item/mech_component/MC = pick(list(arms, legs, body, head))) if(MC) @@ -164,7 +166,7 @@ if(!hatch_closed || (body.pilot_coverage < 100)) //Open, environment is the source return . var/list/after_armor = modify_damage_by_armor(null, ., IRRADIATE, DAM_DISPERSED, src, 0, TRUE) - return after_armor[1] + return after_armor[1] /mob/living/exosuit/getFireLoss() var/total = 0 @@ -200,6 +202,6 @@ for(var/thing in pilots) var/mob/pilot = thing pilot.emp_act(severity) - + /mob/living/exosuit/get_bullet_impact_effect_type(def_zone) return BULLET_IMPACT_METAL diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index f6108bc649d..2d486a18e02 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -1,7 +1,7 @@ /mob/living/bot name = "Bot" health = 20 - maxHealth = 20 + mob_default_max_health = 20 icon = 'icons/mob/bot/placeholder.dmi' universal_speak = TRUE density = FALSE @@ -75,11 +75,11 @@ handleAI() /mob/living/bot/updatehealth() + health = get_max_health() if(status_flags & GODMODE) - health = maxHealth set_stat(CONSCIOUS) else - health = maxHealth - getFireLoss() - getBruteLoss() + health -= (getFireLoss()+getBruteLoss()) /mob/living/bot/death() explode() @@ -104,9 +104,10 @@ to_chat(user, "You need to unlock the controls first.") return else if(IS_WELDER(O)) - if(health < maxHealth) + var/current_max_health = get_max_health() + if(health < current_max_health) if(open) - health = min(maxHealth, health + 10) + health = min(current_max_health, health + 10) user.visible_message("\The [user] repairs \the [src].","You repair \the [src].") else to_chat(user, "Unable to repair with the maintenance panel closed.") diff --git a/code/modules/mob/living/bot/ed209bot.dm b/code/modules/mob/living/bot/ed209bot.dm index 178b5cd51ac..0c041c5937b 100644 --- a/code/modules/mob/living/bot/ed209bot.dm +++ b/code/modules/mob/living/bot/ed209bot.dm @@ -7,7 +7,7 @@ layer = MOB_LAYER density = TRUE health = 100 - maxHealth = 100 + mob_default_max_health = 100 preparing_arrest_sounds = new() diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index 6dea16be17b..09fbef651e0 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -9,7 +9,7 @@ icon = 'icons/mob/bot/farmbot.dmi' icon_state = "farmbot0" health = 50 - maxHealth = 50 + mob_default_max_health = 50 req_access = list(list(access_hydroponics, access_robotics)) var/action = "" // Used to update icon diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm index 818d8a95f59..b410601e83f 100644 --- a/code/modules/mob/living/bot/mulebot.dm +++ b/code/modules/mob/living/bot/mulebot.dm @@ -16,7 +16,7 @@ anchored = TRUE density = TRUE health = 150 - maxHealth = 150 + mob_default_max_health = 150 mob_bump_flag = HEAVY min_target_dist = 0 diff --git a/code/modules/mob/living/bot/remotebot.dm b/code/modules/mob/living/bot/remotebot.dm index 88698d91de4..889e19734fe 100644 --- a/code/modules/mob/living/bot/remotebot.dm +++ b/code/modules/mob/living/bot/remotebot.dm @@ -4,7 +4,7 @@ icon = 'icons/mob/bot/fetchbot.dmi' icon_state = "fetchbot1" health = 15 - maxHealth = 15 + mob_default_max_health = 15 var/working = 0 var/speed = 10 //lower = better diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index b33a7665cc9..f0854d04935 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -7,9 +7,8 @@ desc = "A little security robot. He looks less than thrilled." icon = 'icons/mob/bot/secbot.dmi' icon_state = "secbot0" - var/attack_state = "secbot-c" layer = MOB_LAYER - maxHealth = 50 + mob_default_max_health = 50 health = 50 req_access = list(list(access_security, access_forensics_lockers)) botcard_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels) @@ -20,6 +19,7 @@ RequiresAccessToToggle = 1 // Haha no + var/attack_state = "secbot-c" var/idcheck = 0 // If true, arrests for having weapons without authorization. var/check_records = 0 // If true, arrests people without a record. var/check_arrest = 1 // If true, arrests people who are set to arrest. diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 2ef856b10ea..aff9873a1c6 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -3,7 +3,7 @@ desc = "What IS that?" pass_flags = PASS_FLAG_TABLE health = 100 - maxHealth = 100 + mob_default_max_health = 100 mob_size = MOB_SIZE_TINY mob_sort_value = 8 var/dead_icon diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index cff72d41d5a..66efdbc339a 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -552,7 +552,7 @@ holder_type = null if(species.holder_type) holder_type = species.holder_type - maxHealth = species.total_health + set_max_health(species.total_health) remove_extension(src, /datum/extension/armor) if(species.natural_armour_values) set_extension(src, /datum/extension/armor, species.natural_armour_values) @@ -947,7 +947,7 @@ //Point at which you dun breathe no more. Separate from asystole crit, which is heart-related. /mob/living/carbon/human/nervous_system_failure() - return getBrainLoss() >= maxHealth * 0.75 + return getBrainLoss() >= get_max_health() * 0.75 /mob/living/carbon/human/melee_accuracy_mods() . = ..() diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 7ac0f60acec..f2fb669deec 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -1,15 +1,16 @@ //Updates the mob's health from organs and mob damage variables /mob/living/carbon/human/updatehealth() + var/current_max_health = get_max_health() + health = current_max_health if(status_flags & GODMODE) - health = maxHealth set_stat(CONSCIOUS) return - health = maxHealth - getBrainLoss() + health -= getBrainLoss() //TODO: fix husking - if(((maxHealth - getFireLoss()) < config.health_threshold_dead) && stat == DEAD) + if(((current_max_health - getFireLoss()) < config.health_threshold_dead) && stat == DEAD) make_husked() return diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 77ed36f7740..f73eebabcad 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -18,7 +18,7 @@ tally -= GET_CHEMICAL_EFFECT(src, CE_SPEEDBOOST) tally += GET_CHEMICAL_EFFECT(src, CE_SLOWDOWN) - var/health_deficiency = (maxHealth - health) + var/health_deficiency = (get_max_health() - health) if(health_deficiency >= 40) tally += (health_deficiency / 25) if(can_feel_pain()) diff --git a/code/modules/mob/living/carbon/human/human_species.dm b/code/modules/mob/living/carbon/human/human_species.dm index 97a3a514c60..5a4481d923b 100644 --- a/code/modules/mob/living/carbon/human/human_species.dm +++ b/code/modules/mob/living/carbon/human/human_species.dm @@ -29,8 +29,9 @@ if(mind) mind.name = real_name - adjustOxyLoss(maxHealth)//cease life functions - setBrainLoss(maxHealth) + var/current_max_health = get_max_health() + adjustOxyLoss(current_max_health)//cease life functions + setBrainLoss(current_max_health) var/obj/item/organ/internal/heart/corpse_heart = get_organ(BP_HEART, /obj/item/organ/internal/heart) if(corpse_heart) corpse_heart.pulse = PULSE_NONE//actually stops heart to make worried explorers not care too much diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 89966468fb8..105fca4530d 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -475,10 +475,11 @@ return if(stat != DEAD) - if(stat == UNCONSCIOUS && health < maxHealth/2) + var/half_health = get_max_health()/2 + if(stat == UNCONSCIOUS && health < half_health) //Critical damage passage overlay var/severity = 0 - switch(health - maxHealth/2) + switch(health - half_health) if(-20 to -10) severity = 1 if(-30 to -20) severity = 2 if(-40 to -30) severity = 3 diff --git a/code/modules/mob/living/deity/deity.dm b/code/modules/mob/living/deity/deity.dm index f3a5f2ff9dd..314a2fb0328 100644 --- a/code/modules/mob/living/deity/deity.dm +++ b/code/modules/mob/living/deity/deity.dm @@ -6,7 +6,7 @@ pixel_x = -128 pixel_y = -128 health = 100 - maxHealth = 100 //I dunno what to do with health at this point. + mob_default_max_health = 100 //I dunno what to do with health at this point. universal_understand = TRUE mob_sort_value = 5 diff --git a/code/modules/mob/living/deity/phenomena/conjuration.dm b/code/modules/mob/living/deity/phenomena/conjuration.dm index 2176486f697..ee57dd245bf 100644 --- a/code/modules/mob/living/deity/phenomena/conjuration.dm +++ b/code/modules/mob/living/deity/phenomena/conjuration.dm @@ -59,7 +59,7 @@ L.take_overall_damage(rand(5,30),0,0,0,"blunt intrument") //Actual spell does 5d10 but maaaybe too much. playsound(get_turf(L), 'sound/effects/bamf.ogg', 100, 1) to_chat(L, "Something hard hits you!") - if(L.health < L.maxHealth/2) //If it reduces past 50% + if(L.health < L.get_max_health()/2) //If it reduces past 50% var/obj/effect/rift/R = new(get_turf(L)) L.visible_message("\The [L] is quickly sucked into \a [R]!") L.forceMove(R) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 3140c867205..3dd3fda153a 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -185,22 +185,22 @@ default behaviour is: /mob/living/verb/succumb() set hidden = 1 - if ((src.health < src.maxHealth/2)) // Health below half of maxhealth. - src.adjustBrainLoss(src.health + src.maxHealth * 2) // Deal 2x health in BrainLoss damage, as before but variable. + var/current_max_health = get_max_health() + if ((health < current_max_health/2)) // Health below half of maxhealth. + adjustBrainLoss(health + current_max_health * 2) // Deal 2x health in BrainLoss damage, as before but variable. updatehealth() - to_chat(src, "You have given up life and succumbed to death.") + to_chat(src, SPAN_NOTICE("You have given up life and succumbed to death.")) /mob/living/proc/update_body(var/update_icons=1) if(update_icons) queue_icon_update() /mob/living/proc/updatehealth() + health = get_max_health() if(status_flags & GODMODE) - health = maxHealth set_stat(CONSCIOUS) else - health = maxHealth - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - getCloneLoss() - getHalLoss() - + health -= (getOxyLoss()+getToxLoss()+getFireLoss()+getBruteLoss()+getCloneLoss()+getHalLoss()) //This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually //affects them once clothing is factored in. ~Errorage @@ -232,12 +232,12 @@ default behaviour is: return btemperature /mob/living/proc/getBruteLoss() - return maxHealth - health + return get_max_health() - health /mob/living/proc/adjustBruteLoss(var/amount) if (status_flags & GODMODE) return - health = clamp(health - amount, 0, maxHealth) + health = clamp(health - amount, 0, get_max_health()) /mob/living/proc/getOxyLoss() return 0 @@ -293,11 +293,18 @@ default behaviour is: /mob/living/proc/adjustCloneLoss(var/amount) return -/mob/living/proc/getMaxHealth() - return maxHealth +/mob/living/proc/get_health_ratio() // ratio might be the wrong word + return health/get_max_health() + +/mob/living/proc/get_health_percent(var/sigfig = 1) + return round(get_health_ratio()*100, sigfig) + +/mob/living/proc/get_max_health() + return mob_default_max_health -/mob/living/proc/setMaxHealth(var/newMaxHealth) - maxHealth = newMaxHealth +/mob/living/proc/set_max_health(var/val) + mob_default_max_health = val + updatehealth() // ++++ROCKDTBEN++++ MOB PROCS //END diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 4020796aa03..e27d294489a 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -5,7 +5,7 @@ abstract_type = /mob/living //Health and life related vars - var/maxHealth = 100 //Maximum health that should be possible. + var/mob_default_max_health = 100 //Maximum health that should be possible. var/health = 100 //A mob's health var/hud_updateflag = 0 diff --git a/code/modules/mob/living/living_powers.dm b/code/modules/mob/living/living_powers.dm index e3dcb6505eb..49d07235d00 100644 --- a/code/modules/mob/living/living_powers.dm +++ b/code/modules/mob/living/living_powers.dm @@ -67,6 +67,6 @@ to_chat(target,"\The [src] scrapes your flesh from your bones!") to_chat(src,"You feed hungrily off \the [target]'s flesh.") target.adjustBruteLoss(25) - if(target.getBruteLoss() < -target.maxHealth) + if(target.getBruteLoss() < -target.get_max_health()) target.gib() src.adjustBruteLoss(-25) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index f78d5049548..dabfafbc503 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -56,7 +56,11 @@ var/global/list/ai_verbs_default = list( density = TRUE status_flags = CANSTUN|CANPARALYSE|CANPUSH shouldnt_see = list(/obj/effect/rune) - maxHealth = 200 + mob_default_max_health = 200 + + silicon_camera = /obj/item/camera/siliconcam/ai_camera + silicon_radio = /obj/item/radio/headset/heads/ai_integrated + var/obj/machinery/camera/camera = null var/list/connected_robots = list() var/aiRestorePowerRoutine = 0 @@ -65,9 +69,6 @@ var/global/list/ai_verbs_default = list( var/icon/holo_icon_longrange //Yellow hologram. var/holo_icon_malf = FALSE // for new hologram system var/obj/item/multitool/aiMulti = null - - silicon_camera = /obj/item/camera/siliconcam/ai_camera - silicon_radio = /obj/item/radio/headset/heads/ai_integrated var/obj/item/radio/headset/heads/ai_integrated/ai_radio var/camera_light_on = 0 //Defines if the AI toggled the light on the camera it's looking through. diff --git a/code/modules/mob/living/silicon/ai/ai_damage.dm b/code/modules/mob/living/silicon/ai/ai_damage.dm index 087e8ecafcb..a31b21103f8 100644 --- a/code/modules/mob/living/silicon/ai/ai_damage.dm +++ b/code/modules/mob/living/silicon/ai/ai_damage.dm @@ -22,7 +22,7 @@ /mob/living/silicon/ai/adjustOxyLoss(var/amount) if(status_flags & GODMODE) return - oxyloss = max(0, oxyloss + min(amount, maxHealth - oxyloss)) + oxyloss = max(0, oxyloss + min(amount, get_max_health() - oxyloss)) /mob/living/silicon/ai/setFireLoss(var/amount) if(status_flags & GODMODE) @@ -37,12 +37,12 @@ oxyloss = max(0, amount) /mob/living/silicon/ai/updatehealth() + health = get_max_health() if(status_flags & GODMODE) - health = maxHealth set_stat(CONSCIOUS) setOxyLoss(0) else - health = maxHealth - getFireLoss() - getBruteLoss() // Oxyloss is not part of health as it represents AIs backup power. AI is immune against ToxLoss as it is machine. + health -= (getFireLoss() - getBruteLoss()) // Oxyloss is not part of health as it represents AIs backup power. AI is immune against ToxLoss as it is machine. /mob/living/silicon/ai/rejuvenate() ..() @@ -50,8 +50,9 @@ // Returns percentage of AI's remaining backup capacitor charge (maxhealth - oxyloss). /mob/living/silicon/ai/proc/backup_capacitor() - return ((getOxyLoss() - maxHealth) / maxHealth) * (-100) + var/current_max_health = get_max_health() + return ((getOxyLoss() - current_max_health) / current_max_health) * (-100) // Returns percentage of AI's remaining hardware integrity (maxhealth - (bruteloss + fireloss)) /mob/living/silicon/ai/proc/hardware_integrity() - return (health / maxHealth) * 100 \ No newline at end of file + return (health / get_max_health()) * 100 diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index ac2bc304c8f..fc24d473611 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -2,7 +2,7 @@ name = "maintenance drone" real_name = "drone" icon = 'icons/mob/robots/drones/drone.dmi' - maxHealth = 35 + mob_default_max_health = 35 health = 35 cell_emp_mult = 1 universal_speak = FALSE diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 1dc7351d5fe..5f9e9c55994 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -5,7 +5,7 @@ real_name = "robot" icon = 'icons/mob/robots/robot.dmi' icon_state = ICON_STATE_WORLD - maxHealth = 300 + mob_default_max_health = 300 health = 300 mob_sort_value = 4 diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm index cb83947ce63..fc97a820d5c 100644 --- a/code/modules/mob/living/silicon/robot/robot_damage.dm +++ b/code/modules/mob/living/silicon/robot/robot_damage.dm @@ -1,10 +1,9 @@ /mob/living/silicon/robot/updatehealth() + health = get_max_health() if(status_flags & GODMODE) - health = maxHealth stat = CONSCIOUS return - health = maxHealth - (getBruteLoss() + getFireLoss()) - return + health -= (getBruteLoss() + getFireLoss()) /mob/living/silicon/robot/getBruteLoss() var/amount = 0 diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index a2e3accfcb1..1d9709f2b16 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -166,7 +166,7 @@ // this function shows the health of the AI in the Status panel /mob/living/silicon/proc/show_system_integrity() if(!src.stat) - stat(null, text("System integrity: [round((health/maxHealth)*100)]%")) + stat(null, text("System integrity: [get_health_percent()]%")) else stat(null, text("Systems nonfunctional")) diff --git a/code/modules/mob/living/simple_animal/aquatic/aquatic_carp.dm b/code/modules/mob/living/simple_animal/aquatic/aquatic_carp.dm index 2ff829b00dc..7188961c5ba 100644 --- a/code/modules/mob/living/simple_animal/aquatic/aquatic_carp.dm +++ b/code/modules/mob/living/simple_animal/aquatic/aquatic_carp.dm @@ -3,7 +3,7 @@ desc = "A ferocious fish. May be too hardcore." icon = 'icons/mob/simple_animal/fish_carp.dmi' faction = "fishes" - maxHealth = 20 + mob_default_max_health = 20 health = 20 meat_type = /obj/item/chems/food/fish/carp diff --git a/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm b/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm index 6e9debe9174..e12c057575d 100644 --- a/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm +++ b/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm @@ -2,7 +2,7 @@ name = "small fish" desc = "Glub glub." faction = "fishes" - maxHealth = 10 + mob_default_max_health = 10 health = 10 mob_size = MOB_SIZE_TINY can_pull_size = 0 diff --git a/code/modules/mob/living/simple_animal/aquatic/aquatic_sharks.dm b/code/modules/mob/living/simple_animal/aquatic/aquatic_sharks.dm index 5fd6d61494c..54dd441865e 100644 --- a/code/modules/mob/living/simple_animal/aquatic/aquatic_sharks.dm +++ b/code/modules/mob/living/simple_animal/aquatic/aquatic_sharks.dm @@ -2,7 +2,7 @@ name = "shark" desc = "A ferocious fish with many, many teeth." icon = 'icons/mob/simple_animal/shark.dmi' - maxHealth = 150 + mob_default_max_health = 150 health = 150 natural_weapon = /obj/item/natural_weapon/bite/shark break_stuff_probability = 15 @@ -29,7 +29,7 @@ mob_size = MOB_SIZE_LARGE pixel_x = -16 health = 400 - maxHealth = 400 + mob_default_max_health = 400 harm_intent_damage = 5 natural_weapon = /obj/item/natural_weapon/bite/giantshark break_stuff_probability = 35 diff --git a/code/modules/mob/living/simple_animal/constructs/constructs.dm b/code/modules/mob/living/simple_animal/constructs/constructs.dm index e42bc8a005a..a31b533cc0a 100644 --- a/code/modules/mob/living/simple_animal/constructs/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs/constructs.dm @@ -65,7 +65,7 @@ /mob/living/simple_animal/construct/attack_animal(var/mob/user) if(istype(user, /mob/living/simple_animal/construct/builder)) - if(health < maxHealth) + if(health < get_max_health()) adjustBruteLoss(-5) user.visible_message("\The [user] mends some of \the [src]'s wounds.") else @@ -75,8 +75,9 @@ /mob/living/simple_animal/construct/show_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) . = ..(user) - if(health < maxHealth) - if(health >= maxHealth/2) + var/current_max_health = get_max_health() + if(health < current_max_health) + if(health >= current_max_health/2) to_chat(user, SPAN_WARNING("It looks slightly dented.")) else to_chat(user, SPAN_DANGER("It looks severely dented!")) @@ -98,7 +99,7 @@ real_name = "Juggernaut" desc = "A possessed suit of armour driven by the will of the restless dead" icon = 'icons/mob/simple_animal/construct_behemoth.dmi' - maxHealth = 250 + mob_default_max_health = 250 health = 250 speak_emote = list("rumbles") response_harm = "harmlessly punches" @@ -156,7 +157,7 @@ real_name = "Wraith" desc = "A wicked bladed shell contraption piloted by a bound spirit" icon = 'icons/mob/simple_animal/construct_floating.dmi' - maxHealth = 75 + mob_default_max_health = 75 health = 75 natural_weapon = /obj/item/natural_weapon/wraith speed = -1 @@ -181,7 +182,7 @@ real_name = "Artificer" desc = "A bulbous construct dedicated to building and maintaining The Cult of Nar-Sie's armies" icon = 'icons/mob/simple_animal/construct_artificer.dmi' - maxHealth = 50 + mob_default_max_health = 50 health = 50 response_harm = "viciously beaten" harm_intent_damage = 5 @@ -208,7 +209,7 @@ real_name = "Behemoth" desc = "The pinnacle of occult technology, Behemoths are the ultimate weapon in the Cult of Nar-Sie's arsenal." icon = 'icons/mob/simple_animal/construct_behemoth.dmi' - maxHealth = 750 + mob_default_max_health = 750 health = 750 speak_emote = list("rumbles") response_harm = "harmlessly punches" @@ -232,7 +233,7 @@ real_name = "Harvester" desc = "The promised reward of the livings who follow Nar-Sie. Obtained by offering their bodies to the geometer of blood" icon = 'icons/mob/simple_animal/construct_harvester.dmi' - maxHealth = 150 + mob_default_max_health = 150 health = 150 natural_weapon = /obj/item/natural_weapon/harvester speed = -1 diff --git a/code/modules/mob/living/simple_animal/familiars/familiars.dm b/code/modules/mob/living/simple_animal/familiars/familiars.dm index 5778aa1450c..969310a10b7 100644 --- a/code/modules/mob/living/simple_animal/familiars/familiars.dm +++ b/code/modules/mob/living/simple_animal/familiars/familiars.dm @@ -23,12 +23,9 @@ name = "carcinus" desc = "A small crab said to be made of stone and starlight." icon = 'icons/mob/simple_animal/evilcrab.dmi' - speak_emote = list("chitters","clicks") - - health = 200 - maxHealth = 200 + mob_default_max_health = 200 natural_weapon = /obj/item/natural_weapon/pincers/strong resistance = 9 can_escape = TRUE //snip snip @@ -48,7 +45,7 @@ speak_emote = list("gnashes") health = 100 - maxHealth = 100 + mob_default_max_health = 100 natural_weapon = /obj/item/natural_weapon/bite can_escape = TRUE @@ -69,7 +66,7 @@ response_help_3p = "$USER$ thinks better of touching $TARGET$." health = 150 - maxHealth = 150 + mob_default_max_health = 150 natural_weapon = /obj/item/natural_weapon/horror wizardy_spells = list(/spell/targeted/torment) @@ -95,7 +92,7 @@ speak_emote = list("entones") mob_size = MOB_SIZE_SMALL health = 25 - maxHealth = 25 + mob_default_max_health = 25 wizardy_spells = list( /spell/targeted/heal_target, /spell/targeted/heal_target/area @@ -114,7 +111,7 @@ response_harm = "stamps on" health = 15 - maxHealth = 15 + mob_default_max_health = 15 natural_weapon = /obj/item/natural_weapon/bite/mouse can_escape = TRUE @@ -134,6 +131,6 @@ holder_type = /obj/item/holder mob_size = MOB_SIZE_SMALL health = 25 - maxHealth = 25 + mob_default_max_health = 25 natural_weapon = /obj/item/natural_weapon/claws/weak wizardy_spells = list(/spell/targeted/subjugation) diff --git a/code/modules/mob/living/simple_animal/friendly/koala.dm b/code/modules/mob/living/simple_animal/friendly/koala.dm index ecf21426047..dc12ff116b2 100644 --- a/code/modules/mob/living/simple_animal/friendly/koala.dm +++ b/code/modules/mob/living/simple_animal/friendly/koala.dm @@ -3,7 +3,7 @@ name = "koala" desc = "A little grey bear. How long is he gonna sleep today?" icon = 'icons/mob/simple_animal/koala.dmi' - maxHealth = 45 + mob_default_max_health = 45 health = 45 speed = 4 speak = list("Rrr", "Wraarh...", "Pfrrr...") diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index f625f22f154..e6d93d0a98e 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -4,7 +4,7 @@ icon = 'icons/mob/simple_animal/lizard.dmi' speak_emote = list("hisses") health = 5 - maxHealth = 5 + mob_default_max_health = 5 natural_weapon = /obj/item/natural_weapon/bite/weak response_harm = "stamps on" mob_size = MOB_SIZE_MINISCULE diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index d90551c6835..d5fec44653e 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -12,7 +12,7 @@ turns_per_move = 5 see_in_dark = 6 health = 5 - maxHealth = 5 + mob_default_max_health = 5 response_harm = "stamps on" density = FALSE minbodytemp = 223 //Below -50 Degrees Celsius @@ -83,7 +83,7 @@ desc = "It's a small [body_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself." /mob/living/simple_animal/mouse/proc/splat() - adjustBruteLoss(maxHealth) // Enough damage to kill + adjustBruteLoss(get_max_health()) // Enough damage to kill splatted = TRUE death() @@ -132,7 +132,7 @@ body_color = "rat" icon = 'icons/mob/simple_animal/rat.dmi' skin_material = /decl/material/solid/organic/skin/fur/gray - maxHealth = 20 + mob_default_max_health = 20 health = 20 /mob/living/simple_animal/mouse/rat/set_mouse_icon() diff --git a/code/modules/mob/living/simple_animal/friendly/mushroom.dm b/code/modules/mob/living/simple_animal/friendly/mushroom.dm index 7ff5cd05078..1e1c90a4dc6 100644 --- a/code/modules/mob/living/simple_animal/friendly/mushroom.dm +++ b/code/modules/mob/living/simple_animal/friendly/mushroom.dm @@ -6,7 +6,7 @@ speak_chance = 0 turns_per_move = 1 health = 5 - maxHealth = 5 + mob_default_max_health = 5 harm_intent_damage = 5 pass_flags = PASS_FLAG_TABLE diff --git a/code/modules/mob/living/simple_animal/friendly/possum.dm b/code/modules/mob/living/simple_animal/friendly/possum.dm index 823c15a29da..9181ca821b4 100644 --- a/code/modules/mob/living/simple_animal/friendly/possum.dm +++ b/code/modules/mob/living/simple_animal/friendly/possum.dm @@ -11,7 +11,7 @@ speak_chance = 1 turns_per_move = 3 see_in_dark = 6 - maxHealth = 50 + mob_default_max_health = 50 health = 50 response_harm = "stamps on" density = FALSE diff --git a/code/modules/mob/living/simple_animal/friendly/tomato.dm b/code/modules/mob/living/simple_animal/friendly/tomato.dm index 68378e536d5..c2c61e5534a 100644 --- a/code/modules/mob/living/simple_animal/friendly/tomato.dm +++ b/code/modules/mob/living/simple_animal/friendly/tomato.dm @@ -4,7 +4,7 @@ icon = 'icons/mob/simple_animal/tomato.dmi' speak_chance = 0 turns_per_move = 5 - maxHealth = 15 + mob_default_max_health = 15 health = 15 response_help_3p = "$USER$ pokes $TARGET$." response_help_1p = "You poke $TARGET$." diff --git a/code/modules/mob/living/simple_animal/hostile/antlion.dm b/code/modules/mob/living/simple_animal/hostile/antlion.dm index d1d56ed1257..e6c6bccf891 100644 --- a/code/modules/mob/living/simple_animal/hostile/antlion.dm +++ b/code/modules/mob/living/simple_animal/hostile/antlion.dm @@ -11,7 +11,7 @@ bleed_colour = COLOR_SKY_BLUE health = 65 - maxHealth = 65 + mob_default_max_health = 65 natural_weapon = /obj/item/natural_weapon/bite natural_armor = list( ARMOR_MELEE = ARMOR_MELEE_KNIVES @@ -85,7 +85,7 @@ /mob/living/simple_animal/hostile/antlion/proc/process_healing() if(!incapacitated() && healing) var/old_health = health - if(old_health < maxHealth) + if(old_health < get_max_health()) health = old_health + heal_amount /mob/living/simple_animal/hostile/antlion/proc/prep_burrow(var/new_bool) @@ -99,7 +99,7 @@ icon = 'icons/mob/simple_animal/antlion_queen.dmi' mob_size = MOB_SIZE_LARGE health = 275 - maxHealth = 275 + mob_default_max_health = 275 natural_weapon = /obj/item/natural_weapon/bite/megalion natural_armor = list( ARMOR_MELEE = ARMOR_MELEE_RESISTANT diff --git a/code/modules/mob/living/simple_animal/hostile/bad_drone.dm b/code/modules/mob/living/simple_animal/hostile/bad_drone.dm index dcc52f05f7e..abbbd97f51e 100644 --- a/code/modules/mob/living/simple_animal/hostile/bad_drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/bad_drone.dm @@ -6,7 +6,7 @@ speak_emote = list("blares","buzzes","beeps") speak_chance = 1 health = 50 - maxHealth = 50 + mob_default_max_health = 50 natural_weapon = /obj/item/natural_weapon/drone_slicer faction = "silicon" min_gas = null diff --git a/code/modules/mob/living/simple_animal/hostile/bat.dm b/code/modules/mob/living/simple_animal/hostile/bat.dm index a8e67b0ccea..de4a59e3901 100644 --- a/code/modules/mob/living/simple_animal/hostile/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/bat.dm @@ -5,7 +5,7 @@ speak_chance = 0 turns_per_move = 3 speed = 4 - maxHealth = 20 + mob_default_max_health = 20 health = 20 harm_intent_damage = 8 diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index 8cd036f1849..9ca77e2fc4d 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -12,7 +12,7 @@ see_in_dark = 6 response_harm = "pokes" stop_automated_movement_when_pulled = 0 - maxHealth = 60 + mob_default_max_health = 60 health = 60 natural_weapon = /obj/item/natural_weapon/claws/strong can_escape = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index eed86480e6d..ba9393c81c5 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -5,7 +5,7 @@ speak_chance = 0 turns_per_move = 3 speed = 2 - maxHealth = 50 + mob_default_max_health = 50 health = 50 harm_intent_damage = 8 @@ -34,8 +34,8 @@ update_icon() /mob/living/simple_animal/hostile/carp/proc/carp_randomify() - maxHealth = rand(initial(maxHealth), (1.5 * initial(maxHealth))) - health = maxHealth + mob_default_max_health = rand(initial(mob_default_max_health), (1.5 * initial(mob_default_max_health))) + health = mob_default_max_health if(prob(1)) carp_color = pick(COLOR_WHITE, COLOR_BLACK) else diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm b/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm index c8a813acc0b..e8f9b9a1ecf 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm @@ -3,7 +3,7 @@ desc = "A large brown bear." icon = 'icons/mob/simple_animal/bear_brown.dmi' health = 75 - maxHealth = 75 + mob_default_max_health = 75 density = TRUE natural_weapon = /obj/item/natural_weapon/claws can_escape = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm index 680471b3996..1c8d124745d 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm @@ -7,7 +7,7 @@ icon = 'icons/mob/simple_animal/nanomachines.dmi' natural_weapon = /obj/item/natural_weapon/nanomachine health = 10 - maxHealth = 10 + mob_default_max_health = 10 can_escape = TRUE known_commands = list("stay", "stop", "attack", "follow", "heal", "emergency protocol") gene_damage = -1 @@ -27,7 +27,7 @@ /mob/living/simple_animal/hostile/commanded/nanomachine/Life() regen_time++ - if(regen_time == 2 && health < maxHealth) //slow regen + if(regen_time == 2 && health < get_max_health()) //slow regen regen_time = 0 health++ . = ..() @@ -59,7 +59,7 @@ if(!Adjacent(target_mob) || SA_attackable(target_mob)) stance = COMMANDED_HEAL return 0 - if(target_mob.stat || target_mob.health >= target_mob.maxHealth) //he's either dead or healthy, move along. + if(target_mob.stat || target_mob.health >= target_mob.get_max_health()) //he's either dead or healthy, move along. allowed_targets -= target_mob target_mob = null stance = COMMANDED_HEAL diff --git a/code/modules/mob/living/simple_animal/hostile/creature.dm b/code/modules/mob/living/simple_animal/hostile/creature.dm index ae369e9d1cf..c8b1012d6f0 100644 --- a/code/modules/mob/living/simple_animal/hostile/creature.dm +++ b/code/modules/mob/living/simple_animal/hostile/creature.dm @@ -4,7 +4,7 @@ icon = 'icons/mob/simple_animal/creature.dmi' speak_emote = list("gibbers") health = 100 - maxHealth = 100 + mob_default_max_health = 100 natural_weapon = /obj/item/natural_weapon/bite/strong faction = "creature" speed = 4 diff --git a/code/modules/mob/living/simple_animal/hostile/drake.dm b/code/modules/mob/living/simple_animal/hostile/drake.dm index 772bf52b138..88cf1f09f22 100644 --- a/code/modules/mob/living/simple_animal/hostile/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/drake.dm @@ -13,7 +13,7 @@ bleed_colour = COLOR_VIOLET health = 200 - maxHealth = 200 + mob_default_max_health = 200 natural_weapon = /obj/item/natural_weapon/claws/drake var/obj/item/whip/tail/tailwhip natural_armor = list( diff --git a/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm b/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm index 65ddca6a05a..79a67eb6e81 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm @@ -4,7 +4,7 @@ icon = 'icons/mob/simple_animal/corgi_ghost.dmi' blend_mode = BLEND_SUBTRACT health = 100 - maxHealth = 100 + mob_default_max_health = 100 natural_weapon = /obj/item/natural_weapon/bite/strong faction = MOB_FACTION_NEUTRAL density = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 5fe45352ed9..44d3aec88f0 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -7,7 +7,7 @@ response_help_1p = "You wave your hand through $TARGET$." response_help_3p = "$USER$ waves $USER_HIS$ hand through $TARGET$." speed = -1 - maxHealth = 80 + mob_default_max_health = 80 health = 80 gene_damage = -1 diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index de7451f128a..ead4dc05e60 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -15,7 +15,7 @@ turns_per_move = 5 see_in_dark = 10 response_harm = "pokes" - maxHealth = 125 + mob_default_max_health = 125 health = 125 natural_weapon = /obj/item/natural_weapon/bite heat_damage_per_tick = 20 @@ -65,7 +65,7 @@ /mob/living/simple_animal/hostile/giant_spider/guard desc = "A monstrously huge brown spider with shimmering eyes." meat_amount = 4 - maxHealth = 200 + mob_default_max_health = 200 health = 200 natural_weapon = /obj/item/natural_weapon/bite/strong poison_per_bite = 5 @@ -82,7 +82,7 @@ /mob/living/simple_animal/hostile/giant_spider/nurse desc = "A monstrously huge beige spider with shimmering eyes." icon = 'icons/mob/simple_animal/spider_beige.dmi' - maxHealth = 80 + mob_default_max_health = 80 health = 80 harm_intent_damage = 6 //soft poison_per_bite = 5 @@ -98,14 +98,16 @@ var/mob/living/simple_animal/hostile/giant_spider/guard/paired_guard //things we can't encase in a cocoon - var/list/cocoon_blacklist = list(/mob/living/simple_animal/hostile/giant_spider, - /obj/structure/closet) + var/static/list/cocoon_blacklist = list( + /mob/living/simple_animal/hostile/giant_spider, + /obj/structure/closet + ) //hunters - the most damage, fast, average health and the only caste tenacious enough to break out of nets /mob/living/simple_animal/hostile/giant_spider/hunter desc = "A monstrously huge black spider with shimmering eyes." icon = 'icons/mob/simple_animal/spider_black.dmi' - maxHealth = 150 + mob_default_max_health = 150 health = 150 natural_weapon = /obj/item/natural_weapon/bite/strong poison_per_bite = 10 @@ -126,7 +128,7 @@ /mob/living/simple_animal/hostile/giant_spider/spitter desc = "A monstrously huge iridescent spider with shimmering eyes." icon = 'icons/mob/simple_animal/spider_purple.dmi' - maxHealth = 90 + mob_default_max_health = 90 health = 90 poison_per_bite = 15 ranged = TRUE @@ -148,8 +150,8 @@ . = ..() /mob/living/simple_animal/hostile/giant_spider/proc/spider_randomify() //random math nonsense to get their damage, health and venomness values - maxHealth = rand(initial(maxHealth), (1.4 * initial(maxHealth))) - health = maxHealth + mob_default_max_health = rand(initial(mob_default_max_health), (1.4 * initial(mob_default_max_health))) + health = mob_default_max_health eye_colour = pick(allowed_eye_colours) update_icon() @@ -165,7 +167,7 @@ /mob/living/simple_animal/hostile/giant_spider/AttackingTarget() . = ..() if(isliving(.)) - if(health < maxHealth) + if(health < get_max_health()) var/obj/item/attacking_with = get_natural_weapon() if(attacking_with) health += (0.2 * attacking_with.force) //heal a bit on hit diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 1745767a8fa..2f6c08c5f15 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -3,7 +3,7 @@ desc = "A junky looking robot with four spiky legs." icon = 'icons/mob/simple_animal/hivebot.dmi' health = 55 - maxHealth = 55 + mob_default_max_health = 55 natural_weapon = /obj/item/natural_weapon/drone_slicer projectilesound = 'sound/weapons/gunshot/gunshot_pistol.ogg' projectiletype = /obj/item/projectile/beam/smalllaser @@ -38,7 +38,7 @@ /mob/living/simple_animal/hostile/hivebot/strong desc = "A junky looking robot with four spiky legs - this one has thick armour plating." health = 120 - maxHealth = 120 + mob_default_max_health = 120 ranged = 1 can_escape = 1 natural_armor = list( @@ -61,7 +61,7 @@ Teleporter beacon, and its subtypes icon = 'icons/obj/structures/hivebot_props.dmi' icon_state = "def_radar-off" health = 200 - maxHealth = 200 + mob_default_max_health = 200 status_flags = 0 anchored = TRUE stop_automated_movement = 1 @@ -141,7 +141,7 @@ The megabot desc = "A huge quadruped robot equipped with a myriad of weaponry." icon = 'icons/mob/simple_animal/megabot.dmi' health = 440 - maxHealth = 440 + mob_default_max_health = 440 natural_weapon = /obj/item/natural_weapon/circular_saw speed = 0 natural_armor = list( diff --git a/code/modules/mob/living/simple_animal/hostile/leech.dm b/code/modules/mob/living/simple_animal/hostile/leech.dm index f4df7803aa5..f56ab99273b 100644 --- a/code/modules/mob/living/simple_animal/hostile/leech.dm +++ b/code/modules/mob/living/simple_animal/hostile/leech.dm @@ -3,7 +3,7 @@ desc = "A green leech the size of a common snake." icon = 'icons/mob/simple_animal/megaleech.dmi' health = 15 - maxHealth = 15 + mob_default_max_health = 15 harm_intent_damage = 5 natural_weapon = /obj/item/natural_weapon/bite/weak pass_flags = PASS_FLAG_TABLE @@ -38,7 +38,7 @@ if(istype(S) && !length(S.breaches)) return H.remove_blood_simple(suck_potency) - if(health < maxHealth) + if(health < get_max_health()) health += suck_potency / 1.5 belly += clamp(suck_potency, 0, 100) diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index ee5d20be856..2cd9d137484 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -25,7 +25,7 @@ var/global/list/protected_objects = list(/obj/machinery, meat_type = /obj/item/chems/food/fish speed = 4 - maxHealth = 100 + mob_default_max_health = 100 health = 100 harm_intent_damage = 5 @@ -89,7 +89,7 @@ var/global/list/protected_objects = list(/obj/machinery, attacking_with.force = 2 + initial(I.force) move_to_delay = 2 * I.w_class - maxHealth = health + set_max_health(health) if(creator) src.creator = weakref(creator) faction = "\ref[creator]" // very unique diff --git a/code/modules/mob/living/simple_animal/hostile/pike.dm b/code/modules/mob/living/simple_animal/hostile/pike.dm index 33494af88e4..97db5451d3f 100644 --- a/code/modules/mob/living/simple_animal/hostile/pike.dm +++ b/code/modules/mob/living/simple_animal/hostile/pike.dm @@ -12,7 +12,7 @@ pixel_x = -16 health = 150 - maxHealth = 150 + mob_default_max_health = 150 harm_intent_damage = 5 natural_weapon = /obj/item/natural_weapon/bite/pike diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm index aa1fb734be4..8474a40398b 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -9,7 +9,7 @@ speak_chance = 1 a_intent = I_HURT stop_automated_movement_when_pulled = 0 - maxHealth = 75 + mob_default_max_health = 75 health = 75 speed = -1 harm_intent_damage = 8 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index 41de324c3f6..a8d600433a4 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -13,7 +13,7 @@ a_intent = I_HURT stop_automated_movement_when_pulled = 0 health = 300 - maxHealth = 300 + mob_default_max_health = 300 speed = 8 move_to_delay = 6 projectiletype = /obj/item/projectile/beam/drone @@ -112,13 +112,14 @@ //sometimes our targetting sensors malfunction, and we attack anyone nearby Haywire() - if(health / maxHealth > 0.9) + var/current_max_health = get_max_health() + if(health / current_max_health > 0.9) explode_chance = 0 - else if(health / maxHealth > 0.7) + else if(health / current_max_health > 0.7) explode_chance = 0 - else if(health / maxHealth > 0.5) + else if(health / current_max_health > 0.5) explode_chance = 0.5 - else if(health / maxHealth > 0.3) + else if(health / current_max_health > 0.3) explode_chance = 5 else if(health > 0) //if health gets too low, shut down @@ -153,11 +154,12 @@ /mob/living/simple_animal/hostile/retaliate/malf_drone/on_update_icon() . = ..() if(stat != DEAD) - if(health / maxHealth <= 0.3) + var/current_max_health = get_max_health() + if(health / current_max_health <= 0.3) icon_state = "[icon_state]-shield3" - else if(health / maxHealth <= 0.5) + else if(health / current_max_health <= 0.5) icon_state = "[icon_state]-shield1" - else if(health / maxHealth <= 0.7) + else if(health / current_max_health <= 0.7) icon_state = "[icon_state]-shield2" //ion rifle! diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm index 4d21397a002..6fed116ac07 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm @@ -74,7 +74,7 @@ faction = "samak" icon = 'icons/mob/simple_animal/samak.dmi' move_to_delay = 2 - maxHealth = 125 + mob_default_max_health = 125 health = 125 speed = 2 natural_weapon = /obj/item/natural_weapon/claws @@ -97,7 +97,7 @@ faction = "diyaab" icon = 'icons/mob/simple_animal/diyaab.dmi' move_to_delay = 1 - maxHealth = 25 + mob_default_max_health = 25 health = 25 speed = 1 natural_weapon = /obj/item/natural_weapon/claws/weak @@ -114,7 +114,7 @@ faction = "shantak" icon = 'icons/mob/simple_animal/shantak.dmi' move_to_delay = 1 - maxHealth = 75 + mob_default_max_health = 75 health = 75 speed = 1 natural_weapon = /obj/item/natural_weapon/claws @@ -154,7 +154,7 @@ faction = "crab" icon = 'icons/mob/simple_animal/royalcrab.dmi' move_to_delay = 3 - maxHealth = 150 + mob_default_max_health = 150 health = 150 speed = 1 natural_weapon = /obj/item/natural_weapon/pincers @@ -170,7 +170,7 @@ icon = 'icons/mob/simple_animal/char.dmi' mob_size = MOB_SIZE_LARGE health = 45 - maxHealth = 45 + mob_default_max_health = 45 natural_weapon = /obj/item/natural_weapon/charbaby speed = 2 return_damage_min = 2 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm index e2a46068216..1a5ff0f5203 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm @@ -14,7 +14,7 @@ faction = "crabs" pry_time = 2 SECONDS health = 350 - maxHealth = 350 + mob_default_max_health = 350 natural_weapon = /obj/item/natural_weapon/pincers/giant return_damage_min = 2 return_damage_max = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm index d8e6e5347ad..7bb33e8fef3 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm @@ -3,7 +3,7 @@ desc = "It could be some all-knowing being that, for reasons we could never hope to understand, is assuming the shape and general mannerisms of a parrot - or just a rather large bird." gender = FEMALE health = 750 //how sweet it is to be a god! - maxHealth = 750 + mob_default_max_health = 750 mob_size = MOB_SIZE_LARGE speak = list("...") speak_emote = list("professes","speaks unto you","elaborates","proclaims") @@ -70,14 +70,14 @@ get_subspecies_name = FALSE natural_weapon = /obj/item/natural_weapon/large health = 300 - maxHealth = 300 + mob_default_max_health = 300 /mob/living/simple_animal/hostile/retaliate/parrot/space/megafauna name = "giant parrot" desc = "A huge parrot-like bird." get_subspecies_name = FALSE health = 350 - maxHealth = 350 + mob_default_max_health = 350 speak_emote = list("squawks") emote_hear = list("preens itself") natural_weapon = /obj/item/natural_weapon/large diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm index f46d7bfd3bb..9d600a77ac7 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm @@ -8,7 +8,7 @@ emote_see = list("flaps its wings", "scratches the ground") natural_weapon = /obj/item/natural_weapon/goosefeet health = 45 - maxHealth = 45 + mob_default_max_health = 45 pass_flags = PASS_FLAG_TABLE faction = "geese" pry_time = 8 SECONDS @@ -55,7 +55,7 @@ if(!loose && prob(25) && (attacking_with && attacking_with.force >= loose_threshold)) //second wind loose = TRUE health = (initial(health) * 1.5) - maxHealth = (initial(maxHealth) * 1.5) + set_max_health(initial(mob_default_max_health) * 1.5) enrage_potency = enrage_potency_loose desc += " The [name] is loose! Oh no!" update_icon() @@ -65,7 +65,7 @@ desc = "A large bird. It radiates destructive energy." icon = 'icons/mob/simple_animal/goose_dire.dmi' health = 250 - maxHealth = 250 + mob_default_max_health = 250 enrage_potency = 3 loose_threshold = 20 max_damage = 35 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/jelly.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/jelly.dm index 0f42951111e..95bdb45fbdd 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/jelly.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/jelly.dm @@ -4,7 +4,7 @@ faction = "zeq" icon = 'icons/mob/simple_animal/jelly.dmi' move_to_delay = 1 - maxHealth = 75 + mob_default_max_health = 75 health = 75 speed = 1 natural_weapon = /obj/item/natural_weapon/tentecles @@ -30,7 +30,7 @@ /mob/living/simple_animal/hostile/retaliate/jelly/mega name = "zeq queen" desc = "A gigantic jellyfish-like creature. Its bell wobbles about almost as if it's ready to burst." - maxHealth = 300 + mob_default_max_health = 300 health = 300 gets_random_color = FALSE can_escape = TRUE @@ -69,7 +69,7 @@ /mob/living/simple_animal/hostile/retaliate/jelly/mega/half name = "zeq duchess" desc = "A huge jellyfish-like creature." - maxHealth = 150 + mob_default_max_health = 150 health = 150 can_escape = TRUE jelly_scale = 1.5 @@ -79,7 +79,7 @@ name = "zeqling" desc = "A jellyfish-like creature." health = 75 - maxHealth = 75 + mob_default_max_health = 75 jelly_scale = 0.75 can_escape = FALSE split_type = /mob/living/simple_animal/hostile/retaliate/jelly/mega/fourth @@ -88,7 +88,7 @@ name = "zeqetta" desc = "A tiny jellyfish-like creature." health = 40 - maxHealth = 40 + mob_default_max_health = 40 jelly_scale = 0.375 split_type = /mob/living/simple_animal/hostile/retaliate/jelly/mega/eighth @@ -96,6 +96,6 @@ name = "zeqttina" desc = "An absolutely tiny jellyfish-like creature." health = 20 - maxHealth = 20 + mob_default_max_health = 20 jelly_scale = 0.1875 split_type = null \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm index a0d3ce2685e..ad37b6e8b19 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm @@ -14,7 +14,7 @@ meat_amount = 12 response_harm = "assaults" health = 500 - maxHealth = 500 + mob_default_max_health = 500 mob_size = MOB_SIZE_LARGE mob_bump_flag = HEAVY can_escape = TRUE @@ -60,7 +60,7 @@ icon = 'icons/mob/simple_animal/goat_king_phase_2.dmi' meat_amount = 36 health = 750 - maxHealth = 750 + mob_default_max_health = 750 natural_weapon = /obj/item/natural_weapon/goatking/unleashed elemental_weapons = list( BURN = /obj/item/natural_weapon/goatking/fire/unleashed, @@ -95,7 +95,7 @@ desc = "A very handsome and noble beast." icon = 'icons/mob/simple_animal/goat_guard.dmi' health = 125 - maxHealth = 125 + mob_default_max_health = 125 natural_weapon = /obj/item/natural_weapon/goathorns /obj/item/natural_weapon/goathorns @@ -109,7 +109,7 @@ desc = "A very handsome and noble beast - the most trusted of all the king's men." icon = 'icons/mob/simple_animal/goat_master.dmi' health = 200 - maxHealth = 200 + mob_default_max_health = 200 natural_weapon = /obj/item/natural_weapon/goathorns move_to_delay = 3 @@ -235,6 +235,6 @@ . = ..() if(current_damtype != BRUTE) special_attacks++ - + /mob/living/simple_animal/hostile/retaliate/goat/king/Process_Spacemove() return 1 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/slug.dm b/code/modules/mob/living/simple_animal/hostile/slug.dm index 5248b648d33..7dd99fa5aa0 100644 --- a/code/modules/mob/living/simple_animal/hostile/slug.dm +++ b/code/modules/mob/living/simple_animal/hostile/slug.dm @@ -6,7 +6,7 @@ response_harm = "stomps on" destroy_surroundings = 0 health = 15 - maxHealth = 15 + mob_default_max_health = 15 speed = 0 move_to_delay = 0 density = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index ab78665df9d..2b101378120 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -6,7 +6,7 @@ turns_per_move = 5 meat_type = /obj/item/chems/food/fish speed = -1 - maxHealth = 250 + mob_default_max_health = 250 health = 250 pixel_x = -16 diff --git a/code/modules/mob/living/simple_animal/hostile/vagrant.dm b/code/modules/mob/living/simple_animal/hostile/vagrant.dm index c0f8e6a2196..ca734f792ad 100644 --- a/code/modules/mob/living/simple_animal/hostile/vagrant.dm +++ b/code/modules/mob/living/simple_animal/hostile/vagrant.dm @@ -3,7 +3,7 @@ name = "creature" desc = "You get the feeling you should run." icon = 'icons/mob/simple_animal/vagrant.dmi' - maxHealth = 60 + mob_default_max_health = 60 health = 20 speed = 5 speak_chance = 0 @@ -55,7 +55,7 @@ var/blood_volume = round(gripping.vessel.total_volume) if(blood_volume > 5) gripping.vessel.remove_any(blood_per_tick) - health = min(health + health_per_tick, maxHealth) + health = min(health + health_per_tick, get_max_health()) if(prob(15)) to_chat(gripping, "You feel your fluids being drained!") else @@ -67,7 +67,7 @@ if(stance == HOSTILE_STANCE_IDLE && !cloaked) cloaked = 1 update_icon() - if(health == maxHealth) + if(health >= get_max_health()) new/mob/living/simple_animal/hostile/vagrant(src.loc) new/mob/living/simple_animal/hostile/vagrant(src.loc) gib() @@ -96,7 +96,7 @@ return //This line ensures there's always a reasonable chance of grabbing, while still //Factoring in health - if(!gripping && (cloaked || prob(health + ((maxHealth - health) * 2)))) + if(!gripping && (cloaked || prob(health + ((get_max_health() - health) * 2)))) gripping = H cloaked = 0 update_icon() diff --git a/code/modules/mob/living/simple_animal/hostile/viscerator.dm b/code/modules/mob/living/simple_animal/hostile/viscerator.dm index cbe04e3dcd9..8a007f95b7f 100644 --- a/code/modules/mob/living/simple_animal/hostile/viscerator.dm +++ b/code/modules/mob/living/simple_animal/hostile/viscerator.dm @@ -4,7 +4,7 @@ icon = 'icons/mob/simple_animal/viscerator.dmi' pass_flags = PASS_FLAG_TABLE health = 15 - maxHealth = 15 + mob_default_max_health = 15 natural_weapon = /obj/item/natural_weapon/rotating_blade faction = "syndicate" min_gas = null diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index d3a41e1684c..a6320bedc99 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -3,7 +3,7 @@ real_name = "Shade" desc = "A bound spirit" icon = 'icons/mob/simple_animal/shade.dmi' - maxHealth = 50 + mob_default_max_health = 50 health = 50 universal_speak = TRUE speak_emote = list("hisses") diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 1dfe5c06ae1..4202ab4df22 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -1,7 +1,7 @@ /mob/living/simple_animal name = "animal" health = 20 - maxHealth = 20 + mob_default_max_health = 20 universal_speak = FALSE mob_sort_value = 12 @@ -197,8 +197,9 @@ var/global/list/simplemob_icon_bitflag_cache = list() death() return - if(health > maxHealth) - health = maxHealth + var/current_max_health = get_max_health() + if(health > current_max_health) + health = current_max_health handle_supernatural() handle_impaired_vision() @@ -376,7 +377,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() var/obj/item/stack/medical/MED = O if(!MED.animal_heal) to_chat(user, SPAN_WARNING("\The [MED] won't help \the [src] at all!")) - else if(health < maxHealth && MED.can_use(1)) + else if(health < get_max_health() && MED.can_use(1)) adjustBruteLoss(-MED.animal_heal) visible_message(SPAN_NOTICE("\The [user] applies \the [MED] to \the [src].")) MED.use(1) @@ -452,11 +453,11 @@ var/global/list/simplemob_icon_bitflag_cache = list() . = ..() if(statpanel("Status") && show_stat_health) - stat(null, "Health: [round((health / maxHealth) * 100)]%") + stat(null, "Health: [get_health_percent()]%") /mob/living/simple_animal/death(gibbed, deathmessage = "dies!", show_dead_message) density = FALSE - adjustBruteLoss(maxHealth) //Make sure dey dead. + adjustBruteLoss(get_max_health()) //Make sure dey dead. walk_to(src,0) . = ..(gibbed,deathmessage,show_dead_message) @@ -609,8 +610,9 @@ var/global/list/simplemob_icon_bitflag_cache = list() /mob/living/simple_animal/setCloneLoss(amount) if(gene_damage >= 0) - gene_damage = clamp(amount, 0, maxHealth) - if(gene_damage >= maxHealth) + var/current_max_health = get_max_health() + gene_damage = clamp(amount, 0, current_max_health) + if(gene_damage >= current_max_health) death() /mob/living/simple_animal/get_admin_job_string() diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index 7fa25d4fee6..be32e3bd704 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -642,7 +642,7 @@ This function completely restores a damaged organ to perfect condition. switch(type) if(BURN) fluid_loss_severity = FLUIDLOSS_WIDE_BURN if(LASER) fluid_loss_severity = FLUIDLOSS_CONC_BURN - var/fluid_loss = (damage/(owner.maxHealth - config.health_threshold_dead)) * SPECIES_BLOOD_DEFAULT * fluid_loss_severity + var/fluid_loss = (damage/(owner.get_max_health() - config.health_threshold_dead)) * SPECIES_BLOOD_DEFAULT * fluid_loss_severity owner.remove_blood(fluid_loss) // first check whether we can widen an existing wound diff --git a/code/modules/organs/internal/heart.dm b/code/modules/organs/internal/heart.dm index b8a1e9d9d8b..e160e318278 100644 --- a/code/modules/organs/internal/heart.dm +++ b/code/modules/organs/internal/heart.dm @@ -70,7 +70,7 @@ return else //and if it's beating, let's see if it should var/should_stop = prob(80) && owner.get_blood_circulation() < BLOOD_VOLUME_SURVIVE //cardiovascular shock, not enough liquid to pump - should_stop = should_stop || prob(max(0, owner.getBrainLoss() - owner.maxHealth * 0.75)) //brain failing to work heart properly + should_stop = should_stop || prob(max(0, owner.getBrainLoss() - owner.get_max_health() * 0.75)) //brain failing to work heart properly should_stop = should_stop || (prob(5) && pulse == PULSE_THREADY) //erratic heart patterns, usually caused by oxyloss if(should_stop) // The heart has stopped due to going into traumatic or cardiovascular shock. to_chat(owner, "Your heart has stopped!") diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 7bafff17f0d..b3a7eab1fa9 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -298,9 +298,9 @@ if(length(holding)) holding = "They are holding [english_list(holding)]" if(!mob_detail) - mob_detail = "You can see [A] on the photo[(A.health / A.maxHealth) < 0.75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. " + mob_detail = "You can see [A] on the photo[(A.health / A.get_max_health()) < 0.75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. " else - mob_detail += "You can also see [A] on the photo[(A.health / A.maxHealth)< 0.75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]." + mob_detail += "You can also see [A] on the photo[(A.health / A.get_max_health())< 0.75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]." return mob_detail /obj/item/camera/afterattack(atom/target, mob/user, flag) diff --git a/code/modules/spells/aoe_turf/conjure/druidic_spells.dm b/code/modules/spells/aoe_turf/conjure/druidic_spells.dm index 70a37798f3f..d4b5db4bb88 100644 --- a/code/modules/spells/aoe_turf/conjure/druidic_spells.dm +++ b/code/modules/spells/aoe_turf/conjure/druidic_spells.dm @@ -39,7 +39,7 @@ if(!..()) return 0 - newVars = list("maxHealth" = 20 + spell_levels[Sp_POWER]*5, "health" = 20 + spell_levels[Sp_POWER]*5, "melee_damage_lower" = 10 + spell_levels[Sp_POWER], "melee_damage_upper" = 10 + spell_levels[Sp_POWER]*2) + newVars = list("mob_default_max_health" = 20 + spell_levels[Sp_POWER]*5, "health" = 20 + spell_levels[Sp_POWER]*5, "melee_damage_lower" = 10 + spell_levels[Sp_POWER], "melee_damage_upper" = 10 + spell_levels[Sp_POWER]*2) return "Your bats are now stronger." @@ -59,7 +59,7 @@ summon_amt = 1 summon_type = list(/mob/living/simple_animal/hostile/commanded/bear) - newVars = list("maxHealth" = 15, + newVars = list("mob_default_max_health" = 15, "health" = 15, "melee_damage_lower" = 10, "melee_damage_upper" = 10, @@ -76,14 +76,14 @@ return 0 switch(spell_levels[Sp_POWER]) if(1) - newVars = list("maxHealth" = 30, + newVars = list("mob_default_max_health" = 30, "health" = 30, "melee_damage_lower" = 15, "melee_damage_upper" = 15 ) return "Your bear has been upgraded from a cub to a whelp." if(2) - newVars = list("maxHealth" = 45, + newVars = list("mob_default_max_health" = 45, "health" = 45, "melee_damage_lower" = 20, "melee_damage_upper" = 20, @@ -91,7 +91,7 @@ ) return "Your bear has been upgraded from a whelp to an adult." if(3) - newVars = list("maxHealth" = 60, + newVars = list("mob_default_max_health" = 60, "health" = 60, "melee_damage_lower" = 25, "melee_damage_upper" = 25, @@ -99,7 +99,7 @@ ) return "Your bear has been upgraded from an adult to an alpha." if(4) - newVars = list("maxHealth" = 75, + newVars = list("mob_default_max_health" = 75, "health" = 75, "melee_damage_lower" = 35, "melee_damage_upper" = 35, diff --git a/code/modules/spells/targeted/shapeshift.dm b/code/modules/spells/targeted/shapeshift.dm index a4504ed778c..529cac94e7a 100644 --- a/code/modules/spells/targeted/shapeshift.dm +++ b/code/modules/spells/targeted/shapeshift.dm @@ -73,8 +73,9 @@ return FALSE transformer.status_flags &= ~GODMODE if(share_damage) - var/ratio = target.health/target.maxHealth - var/damage = transformer.maxHealth - round(transformer.maxHealth*(ratio)) + var/ratio = target.health/target.get_max_health() + var/transformer_max_health = transformer.get_max_health() + var/damage = transformer.set_max_health(transformer_max_health-round(transformer_max_health*(ratio))) for(var/i in 1 to CEILING(damage/10)) transformer.adjustBruteLoss(10) if(target.mind) @@ -116,7 +117,7 @@ level_max = list(Sp_TOTAL = 2, Sp_SPEED = 2, Sp_POWER = 2) - newVars = list("health" = 50, "maxHealth" = 50) + newVars = list("health" = 50, "default_mob_max_health" = 50) hud_state = "wiz_poly" @@ -183,7 +184,7 @@ "melee_damage_upper" = 25, "resistance" = 6, "health" = 125, - "maxHealth" = 125) + "mob_default_max_health" = 125) duration = 0 return "You revel in the corruption. There is no turning back." diff --git a/maps/away/bearcat/bearcat.dm b/maps/away/bearcat/bearcat.dm index 4b6c1a159e2..86090d73d9c 100644 --- a/maps/away/bearcat/bearcat.dm +++ b/maps/away/bearcat/bearcat.dm @@ -117,8 +117,9 @@ corpse.name = "Captain" var/decl/hierarchy/outfit/outfit = outfit_by_type(/decl/hierarchy/outfit/deadcap) outfit.equip_outfit(corpse) - corpse.adjustOxyLoss(corpse.maxHealth) - corpse.setBrainLoss(corpse.maxHealth) + var/corpse_health = corpse.get_max_health() + corpse.adjustOxyLoss(corpse_health) + corpse.setBrainLoss(corpse_health) var/obj/structure/bed/chair/C = locate() in T if(C) C.buckle_mob(corpse) diff --git a/maps/away/errant_pisces/errant_pisces.dm b/maps/away/errant_pisces/errant_pisces.dm index 49a0ecdb69e..ddc708e20b9 100644 --- a/maps/away/errant_pisces/errant_pisces.dm +++ b/maps/away/errant_pisces/errant_pisces.dm @@ -24,7 +24,7 @@ turns_per_move = 5 meat_type = /obj/item/chems/food/sharkmeat speed = 2 - maxHealth = 100 + mob_default_max_health = 100 health = 100 natural_weapon = /obj/item/natural_weapon/bite/strong break_stuff_probability = 35 diff --git a/maps/away/slavers/slavers_base.dm b/maps/away/slavers/slavers_base.dm index b7b2cf50157..830eef0f356 100644 --- a/maps/away/slavers/slavers_base.dm +++ b/maps/away/slavers/slavers_base.dm @@ -134,7 +134,7 @@ turns_per_move = 5 speed = 4 stop_automated_movement_when_pulled = 0 - maxHealth = 100 + mob_default_max_health = 100 health = 100 natural_weapon = /obj/item/natural_weapon/punch can_escape = TRUE diff --git a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dm b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dm index a5b3ed11b3c..8676c98c65d 100644 --- a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dm +++ b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dm @@ -85,7 +85,7 @@ name = "goat" desc = "An impressive goat, in size and coat. His horns look pretty serious!" health = 100 - maxHealth = 100 + mob_default_max_health = 100 natural_weapon = /obj/item/natural_weapon/hooves/strong faction = "farmbots" @@ -100,7 +100,7 @@ emote_see = list("beeps repeatedly", "whirrs violently", "flashes its indicator lights", "emits a ping sound") faction = "farmbots" health = 225 - maxHealth = 225 + mob_default_max_health = 225 malfunctioning = 0 /mob/living/simple_animal/hostile/retaliate/malf_drone/hydro/Initialize() diff --git a/mods/content/corporate/away_sites/lar_maria/lar_maria.dm b/mods/content/corporate/away_sites/lar_maria/lar_maria.dm index 753bfa58244..699d11e215d 100644 --- a/mods/content/corporate/away_sites/lar_maria/lar_maria.dm +++ b/mods/content/corporate/away_sites/lar_maria/lar_maria.dm @@ -54,7 +54,7 @@ /mob/living/simple_animal/hostile/lar_maria/test_subject name = "test subject" desc = "Sick, filthy, angry and probably crazy human in an orange robe." - maxHealth = 40 + mob_default_max_health = 40 health = 40 corpse = /obj/abstract/landmark/corpse/lar_maria/test_subject icon = 'mods/content/corporate/away_sites/lar_maria/lar_maria_test_subject.dmi' @@ -88,7 +88,7 @@ /mob/living/simple_animal/hostile/lar_maria/guard//angry guards armed with batons and shotguns. Still bite name = "security" desc = "Guard dressed at Zeng-Hu Pharmaceuticals uniform." - maxHealth = 60 + mob_default_max_health = 60 health = 60 natural_weapon = /obj/item/baton weapon = /obj/item/baton @@ -124,7 +124,7 @@ name = "virologist" desc = "Virologist dressed at Zeng-Hu Pharmaceuticals uniform." icon = 'mods/content/corporate/away_sites/lar_maria/lar_maria_virologist_m.dmi' - maxHealth = 50 + mob_default_max_health = 50 health = 50 corpse = /obj/abstract/landmark/corpse/lar_maria/virologist diff --git a/mods/content/xenobiology/circuit.dm b/mods/content/xenobiology/circuit.dm index 81e12500a02..d9f6daf8a24 100644 --- a/mods/content/xenobiology/circuit.dm +++ b/mods/content/xenobiology/circuit.dm @@ -30,7 +30,7 @@ set_pin_data(IC_OUTPUT, 2, T.is_adult) set_pin_data(IC_OUTPUT, 3, T.nutrition/T.get_max_nutrition()) set_pin_data(IC_OUTPUT, 4, T.powerlevel) - set_pin_data(IC_OUTPUT, 5, round(T.health/T.maxHealth,0.01)*100) + set_pin_data(IC_OUTPUT, 5, round(T.health/T.mob_default_max_health,0.01)*100) set_pin_data(IC_OUTPUT, 6, slime_data.descendants?.Copy()) set_pin_data(IC_OUTPUT, 7, T.mutation_chance) set_pin_data(IC_OUTPUT, 8, T.cores) diff --git a/mods/content/xenobiology/mobs/critter_slime.dm b/mods/content/xenobiology/mobs/critter_slime.dm index 4210eed8fc8..72959dab2c5 100644 --- a/mods/content/xenobiology/mobs/critter_slime.dm +++ b/mods/content/xenobiology/mobs/critter_slime.dm @@ -4,7 +4,7 @@ icon = 'mods/content/xenobiology/icons/slimes/slime_baby.dmi' speak_emote = list("chirps") health = 100 - maxHealth = 100 + mob_default_max_health = 100 response_harm = "stamps on" emote_see = list("jiggles", "bounces in place") gene_damage = -1 @@ -25,7 +25,7 @@ SHOULD_CALL_PARENT(FALSE) icon = get_slime_icon() icon_state = (stat == DEAD ? "slime_dead" : "slime") - + /mob/living/simple_animal/slime/proc/get_slime_icon() var/decl/slime_colour/slime_data = GET_DECL(slime_type) return slime_data.baby_icon diff --git a/mods/content/xenobiology/mobs/slime_feeding_helpers.dm b/mods/content/xenobiology/mobs/slime_feeding_helpers.dm index d8bfbee4803..7f7fbcc0146 100644 --- a/mods/content/xenobiology/mobs/slime_feeding_helpers.dm +++ b/mods/content/xenobiology/mobs/slime_feeding_helpers.dm @@ -77,5 +77,5 @@ var/global/list/slime_pain_messages = list( if(prob(15) && client) handle_additional_slime_effects() . = 15 * protection - if(stat == DEAD || getCloneLoss() >= maxHealth) + if(stat == DEAD || getCloneLoss() >= get_max_health()) eaten_by_slime() diff --git a/mods/content/xenobiology/slime/_slime.dm b/mods/content/xenobiology/slime/_slime.dm index 5f7c26441b7..5a434c48575 100644 --- a/mods/content/xenobiology/slime/_slime.dm +++ b/mods/content/xenobiology/slime/_slime.dm @@ -8,7 +8,7 @@ icon_state = ICON_STATE_WORLD pass_flags = PASS_FLAG_TABLE speak_emote = list("chirps") - maxHealth = 150 + mob_default_max_health = 150 health = 150 gender = NEUTER update_icon = 0 @@ -51,7 +51,7 @@ return /decl/material/liquid/slimejelly /mob/living/slime/adjustToxLoss(var/amount) - toxloss = clamp(toxloss + amount, 0, maxHealth) + toxloss = clamp(toxloss + amount, 0, get_max_health()) /mob/living/slime/setToxLoss(var/amount) adjustToxLoss(amount-getToxLoss()) @@ -87,7 +87,7 @@ var/tally = ..() - var/health_deficiency = (maxHealth - health) + var/health_deficiency = (get_max_health() - health) if(health_deficiency >= 30) tally += (health_deficiency / 25) if (bodytemperature < 183.222) @@ -146,7 +146,7 @@ . = ..() statpanel("Status") - stat(null, "Health: [round((health / maxHealth) * 100)]%") + stat(null, "Health: [round((health / get_max_health()) * 100)]%") stat(null, "Intent: [a_intent]") if (client.statpanel == "Status") @@ -344,7 +344,7 @@ else if (nutrition < get_hunger_nutrition()) . += "Warning:\tthe slime is hungry." . += "Electric charge strength:\t[powerlevel]" - . += "Health:\t[round((health * 100) / maxHealth)]%" + . += "Health:\t[round((health * 100) / get_max_health())]%" var/list/mutations = slime_data.descendants?.Copy() if(!mutations.len) diff --git a/mods/content/xenobiology/slime/feeding.dm b/mods/content/xenobiology/slime/feeding.dm index fd88d5c3caf..421f943f780 100644 --- a/mods/content/xenobiology/slime/feeding.dm +++ b/mods/content/xenobiology/slime/feeding.dm @@ -31,7 +31,7 @@ if(!silent) to_chat(src, SPAN_WARNING("\The [src] is dead.")) return FEED_RESULT_DEAD - if(M.getCloneLoss() >= M.maxHealth * 1.5) + if(M.getCloneLoss() >= M.get_max_health() * 1.5) if(!silent) to_chat(src, SPAN_WARNING("\The [M] is too degraded to feed upon.")) return FEED_RESULT_DEAD diff --git a/mods/content/xenobiology/slime/powers.dm b/mods/content/xenobiology/slime/powers.dm index cac27ead4e2..a90c4b879f9 100644 --- a/mods/content/xenobiology/slime/powers.dm +++ b/mods/content/xenobiology/slime/powers.dm @@ -16,7 +16,7 @@ return is_adult = TRUE - maxHealth = 200 + mob_default_max_health = 200 amount_grown = 0 update_name() update_icon() diff --git a/mods/mobs/dionaea/mob/_nymph.dm b/mods/mobs/dionaea/mob/_nymph.dm index 379a444e84f..276cad749e3 100644 --- a/mods/mobs/dionaea/mob/_nymph.dm +++ b/mods/mobs/dionaea/mob/_nymph.dm @@ -10,7 +10,7 @@ icon_state = ICON_STATE_WORLD death_msg = "expires with a pitiful chirrup..." health = 60 - maxHealth = 60 + mob_default_max_health = 60 available_maneuvers = list(/decl/maneuver/leap) status_flags = NO_ANTAG diff --git a/mods/species/ascent/mobs/nymph/_nymph.dm b/mods/species/ascent/mobs/nymph/_nymph.dm index 338b11625f1..e7b9c68b295 100644 --- a/mods/species/ascent/mobs/nymph/_nymph.dm +++ b/mods/species/ascent/mobs/nymph/_nymph.dm @@ -16,7 +16,7 @@ icon_state = ICON_STATE_WORLD death_msg = "expires with a pitiful hiss..." health = 60 - maxHealth = 60 + mob_default_max_health = 60 available_maneuvers = list(/decl/maneuver/leap) only_species_language = 1 From 74de14749ce892dd68b203e6d67fc06a7309b35d Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 24 Jul 2023 20:55:21 +1000 Subject: [PATCH 02/32] Condensing updatehealth(). --- code/modules/mechs/mech_damage.dm | 4 +-- code/modules/mechs/mech_life.dm | 2 -- code/modules/mob/living/bot/bot.dm | 14 +++++----- .../mob/living/carbon/human/human_damage.dm | 16 ++++------- code/modules/mob/living/living.dm | 12 +++++++-- .../mob/living/silicon/ai/ai_damage.dm | 5 +--- code/modules/mob/living/silicon/pai/death.dm | 2 +- code/modules/mob/living/silicon/pai/life.dm | 11 +------- code/modules/mob/living/silicon/pai/pai.dm | 1 + .../mob/living/silicon/robot/drone/drone.dm | 27 +++++-------------- code/modules/mob/living/silicon/robot/life.dm | 6 ++--- .../mob/living/silicon/robot/robot_damage.dm | 7 ----- code/modules/mob/living/silicon/silicon.dm | 4 +++ .../mob/living/simple_animal/simple_animal.dm | 4 --- mods/content/xenobiology/slime/life.dm | 5 ---- 15 files changed, 40 insertions(+), 80 deletions(-) diff --git a/code/modules/mechs/mech_damage.dm b/code/modules/mechs/mech_damage.dm index c39f2017875..639b66fa76c 100644 --- a/code/modules/mechs/mech_damage.dm +++ b/code/modules/mechs/mech_damage.dm @@ -83,8 +83,8 @@ /mob/living/exosuit/get_max_health() return (body ? body.mech_health : 0) -/mob/living/exosuit/updatehealth() - health = get_max_health()-(getFireLoss()+getBruteLoss()) +/mob/living/exosuit/get_total_life_damage() + return (getFireLoss()+getBruteLoss()) /mob/living/exosuit/adjustFireLoss(var/amount, var/obj/item/mech_component/MC = pick(list(arms, legs, body, head))) if(MC) diff --git a/code/modules/mechs/mech_life.dm b/code/modules/mechs/mech_life.dm index c000678ca65..094d542cf7a 100644 --- a/code/modules/mechs/mech_life.dm +++ b/code/modules/mechs/mech_life.dm @@ -36,8 +36,6 @@ M.deactivate() updatehealth() - if(health <= 0 && stat != DEAD) - death() if(emp_damage > 0) emp_damage -= min(1, emp_damage) //Reduce emp accumulation over time diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 2d486a18e02..8052485d43f 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -64,8 +64,7 @@ /mob/living/bot/Life() ..() - if(health <= 0) - death() + if(stat == DEAD) return set_status(STAT_WEAK, 0) set_status(STAT_STUN, 0) @@ -74,14 +73,13 @@ if(on && !client && !busy) handleAI() -/mob/living/bot/updatehealth() - health = get_max_health() - if(status_flags & GODMODE) - set_stat(CONSCIOUS) - else - health -= (getFireLoss()+getBruteLoss()) +/mob/living/bot/get_total_life_damage() + return getFireLoss() + getBruteLoss() /mob/living/bot/death() + if(stat == DEAD) + return + set_stat(DEAD) explode() /mob/living/bot/attackby(var/obj/item/O, var/mob/user) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index f2fb669deec..6d92985f6da 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -1,18 +1,12 @@ +/mob/living/carbon/human/get_total_life_damage() + return getBrainLoss() + //Updates the mob's health from organs and mob damage variables /mob/living/carbon/human/updatehealth() - - var/current_max_health = get_max_health() - health = current_max_health - if(status_flags & GODMODE) - set_stat(CONSCIOUS) - return - - health -= getBrainLoss() - + ..() //TODO: fix husking - if(((current_max_health - getFireLoss()) < config.health_threshold_dead) && stat == DEAD) + if(stat == DEAD && (get_max_health() - getFireLoss()) < config.health_threshold_dead) make_husked() - return /mob/living/carbon/human/adjustBrainLoss(var/amount) if(status_flags & GODMODE) return 0 //godmode diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 3dd3fda153a..2c848480e21 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -195,12 +195,20 @@ default behaviour is: if(update_icons) queue_icon_update() +/mob/living/proc/should_be_dead() + return health <= 0 + +/mob/living/proc/get_total_life_damage() + return (getOxyLoss()+getToxLoss()+getFireLoss()+getBruteLoss()+getCloneLoss()+getHalLoss()) + /mob/living/proc/updatehealth() health = get_max_health() if(status_flags & GODMODE) set_stat(CONSCIOUS) - else - health -= (getOxyLoss()+getToxLoss()+getFireLoss()+getBruteLoss()+getCloneLoss()+getHalLoss()) + return + health -= get_total_life_damage() + if(stat != DEAD && should_be_dead()) + death() //This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually //affects them once clothing is factored in. ~Errorage diff --git a/code/modules/mob/living/silicon/ai/ai_damage.dm b/code/modules/mob/living/silicon/ai/ai_damage.dm index a31b21103f8..0d60beec460 100644 --- a/code/modules/mob/living/silicon/ai/ai_damage.dm +++ b/code/modules/mob/living/silicon/ai/ai_damage.dm @@ -37,12 +37,9 @@ oxyloss = max(0, amount) /mob/living/silicon/ai/updatehealth() - health = get_max_health() + ..() if(status_flags & GODMODE) - set_stat(CONSCIOUS) setOxyLoss(0) - else - health -= (getFireLoss() - getBruteLoss()) // Oxyloss is not part of health as it represents AIs backup power. AI is immune against ToxLoss as it is machine. /mob/living/silicon/ai/rejuvenate() ..() diff --git a/code/modules/mob/living/silicon/pai/death.dm b/code/modules/mob/living/silicon/pai/death.dm index 6e2db95e39c..81d63dea087 100644 --- a/code/modules/mob/living/silicon/pai/death.dm +++ b/code/modules/mob/living/silicon/pai/death.dm @@ -8,6 +8,6 @@ fold() if(mind) qdel(mind) - ..(gibbed, deathmessage, "You have suffered a critical system failure, and are dead.") + ..(gibbed, "gives one shrill beep before falling lifeless.", "You have suffered a critical system failure, and are dead.") ghostize() qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index f3697bfefe9..919bf4214d0 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -28,13 +28,4 @@ to_chat(src, SPAN_NOTICE("Communication circuit reinitialized. Speech and messaging functionality restored.")) handle_status_effects() - - if(health <= 0) - death(null,"gives one shrill beep before falling lifeless.") - -/mob/living/silicon/pai/updatehealth() - if(status_flags & GODMODE) - health = 100 - set_stat(CONSCIOUS) - else - health = 100 - getBruteLoss() - getFireLoss() \ No newline at end of file + updatehealth() diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index f7ab6c949c2..21b5ae7c12a 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -34,6 +34,7 @@ var/global/list/possible_say_verbs = list( holder_type = /obj/item/holder idcard = /obj/item/card/id silicon_radio = null // pAIs get their radio from the card they belong to. + mob_default_max_health = 100 os_type = /datum/extension/interactive/os/silicon/small starting_stock_parts = list( diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index fc24d473611..a002567f76b 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -19,6 +19,8 @@ possession_candidate = 1 speed = -1 + mob_default_max_health = 35 + can_pull_size = ITEM_SIZE_NORMAL can_pull_mobs = MOB_PULL_SMALLER @@ -180,7 +182,7 @@ if(stat == DEAD) - if(!config.allow_drone_spawn || emagged || health < -35) //It's dead, Dave. + if(!config.allow_drone_spawn || emagged || should_be_dead()) //It's dead, Dave. to_chat(user, "The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one.") return @@ -244,31 +246,14 @@ to_chat(src, SPAN_DANGER("ALERT: [user.real_name] is your new master. Obey your new laws and [G.his] commands.")) return 1 -//DRONE LIFE/DEATH -//For some goddamn reason robots have this hardcoded. Redefining it for our fragile friends here. -/mob/living/silicon/robot/drone/updatehealth() - if(status_flags & GODMODE) - health = 35 - set_stat(CONSCIOUS) - return - health = 35 - (getBruteLoss() + getFireLoss()) - return - -//Easiest to check this here, then check again in the robot proc. -//Standard robots use config for crit, which is somewhat excessive for these guys. -//Drones killed by damage will gib. -/mob/living/silicon/robot/drone/handle_regular_status_updates() - if(health <= -35 && src.stat != DEAD) +/mob/living/silicon/robot/drone/death() + if(stat != DEAD && should_be_dead()) self_destruct() return - if(health <= 0 && src.stat != DEAD) - death() - return - ..() + return ..() /mob/living/silicon/robot/drone/self_destruct() timeofdeath = world.time - death() //Possibly redundant, having trouble making death() cooperate. gib() //DRONE MOVEMENT. diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 9a6b9d80258..34dcca0955c 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -67,6 +67,9 @@ lights_on = 0 set_light(0) +/mob/living/silicon/robot/should_be_dead() + return health < config.health_threshold_dead + /mob/living/silicon/robot/handle_regular_status_updates() updatehealth() @@ -76,9 +79,6 @@ if(src.resting) SET_STATUS_MAX(src, STAT_WEAK, 5) - if(health < config.health_threshold_dead && src.stat != DEAD) //die only once - death() - if (src.stat != DEAD) //Alive. if (incapacitated(INCAPACITATION_DISRUPTED) || !has_power) src.set_stat(UNCONSCIOUS) diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm index fc97a820d5c..75302fb5060 100644 --- a/code/modules/mob/living/silicon/robot/robot_damage.dm +++ b/code/modules/mob/living/silicon/robot/robot_damage.dm @@ -1,10 +1,3 @@ -/mob/living/silicon/robot/updatehealth() - health = get_max_health() - if(status_flags & GODMODE) - stat = CONSCIOUS - return - health -= (getBruteLoss() + getFireLoss()) - /mob/living/silicon/robot/getBruteLoss() var/amount = 0 for(var/V in components) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 1d9709f2b16..e9d4687bfb1 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -463,3 +463,7 @@ return // Unconscious, dead or once possessed but now client-less silicons are not considered to have id access. if(istype(idcard)) LAZYDISTINCTADD(., idcard) + +/mob/living/silicon/get_total_life_damage() + return (getBruteLoss() + getFireLoss()) + diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 4202ab4df22..f806db5323c 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -193,10 +193,6 @@ var/global/list/simplemob_icon_bitflag_cache = list() handle_atmos() - if(health <= 0) - death() - return - var/current_max_health = get_max_health() if(health > current_max_health) health = current_max_health diff --git a/mods/content/xenobiology/slime/life.dm b/mods/content/xenobiology/slime/life.dm index 623affe8304..e5c1449089a 100644 --- a/mods/content/xenobiology/slime/life.dm +++ b/mods/content/xenobiology/slime/life.dm @@ -7,11 +7,6 @@ slime_feed() ingested.metabolize() -/mob/living/slime/updatehealth() - . = ..() - if(stat != DEAD && health <= 0) - death() - /mob/living/slime/fluid_act(datum/reagents/fluids) . = ..() if(!QDELETED(src) && fluids?.total_volume >= FLUID_SHALLOW && stat == DEAD) From 1b02408727046a6e7223f79c77341ee43391e91e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 24 Jul 2023 21:08:35 +1000 Subject: [PATCH 03/32] Removing unneeded health var setting. --- code/modules/mob/living/bot/bot.dm | 1 - code/modules/mob/living/bot/ed209bot.dm | 1 - code/modules/mob/living/bot/farmbot.dm | 1 - code/modules/mob/living/bot/mulebot.dm | 1 - code/modules/mob/living/bot/remotebot.dm | 1 - code/modules/mob/living/bot/secbot.dm | 1 - code/modules/mob/living/carbon/alien/alien.dm | 1 - code/modules/mob/living/deity/deity.dm | 3 +-- code/modules/mob/living/living.dm | 1 + .../mob/living/silicon/robot/drone/drone.dm | 3 --- code/modules/mob/living/silicon/robot/robot.dm | 1 - .../living/simple_animal/aquatic/aquatic_carp.dm | 1 - .../living/simple_animal/aquatic/aquatic_fish.dm | 1 - .../simple_animal/aquatic/aquatic_sharks.dm | 2 -- .../simple_animal/constructs/constructs.dm | 5 ----- .../living/simple_animal/familiars/familiars.dm | 16 ---------------- .../mob/living/simple_animal/friendly/koala.dm | 1 - .../mob/living/simple_animal/friendly/lizard.dm | 1 - .../mob/living/simple_animal/friendly/mouse.dm | 2 -- .../living/simple_animal/friendly/mushroom.dm | 1 - .../mob/living/simple_animal/friendly/possum.dm | 1 - .../mob/living/simple_animal/friendly/tomato.dm | 1 - .../mob/living/simple_animal/hostile/antlion.dm | 3 --- .../living/simple_animal/hostile/bad_drone.dm | 1 - .../mob/living/simple_animal/hostile/bat.dm | 5 ----- .../mob/living/simple_animal/hostile/bear.dm | 1 - .../mob/living/simple_animal/hostile/carp.dm | 2 -- .../hostile/commanded/bear_companion.dm | 1 - .../hostile/commanded/nanomachines.dm | 1 - .../mob/living/simple_animal/hostile/creature.dm | 1 - .../simple_animal/hostile/faithful_hound.dm | 1 - .../living/simple_animal/hostile/faithless.dm | 1 - .../living/simple_animal/hostile/giant_spider.dm | 5 ----- .../mob/living/simple_animal/hostile/hivebot.dm | 4 ---- .../mob/living/simple_animal/hostile/leech.dm | 1 - .../mob/living/simple_animal/hostile/mimic.dm | 4 ---- .../mob/living/simple_animal/hostile/pike.dm | 3 --- .../simple_animal/hostile/retaliate/clown.dm | 1 - .../simple_animal/hostile/retaliate/drone.dm | 1 - .../simple_animal/hostile/retaliate/exoplanet.dm | 5 ----- .../hostile/retaliate/giant_crab.dm | 1 - .../retaliate/giant_parrot/giant_parrot.dm | 3 --- .../simple_animal/hostile/retaliate/goose.dm | 2 -- .../simple_animal/hostile/retaliate/jelly.dm | 6 ------ .../hostile/retaliate/king_of_goats.dm | 4 ---- .../mob/living/simple_animal/hostile/slug.dm | 1 - .../mob/living/simple_animal/hostile/tree.dm | 3 --- .../mob/living/simple_animal/hostile/vagrant.dm | 1 - .../living/simple_animal/hostile/viscerator.dm | 1 - code/modules/mob/living/simple_animal/shade.dm | 1 - .../mob/living/simple_animal/simple_animal.dm | 1 - maps/away/errant_pisces/errant_pisces.dm | 1 - maps/away/slavers/slavers_base.dm | 5 ++--- .../exoplanet_ruins/hydrobase/hydrobase.dm | 2 -- .../corporate/away_sites/lar_maria/lar_maria.dm | 3 --- mods/content/xenobiology/mobs/critter_slime.dm | 1 - mods/content/xenobiology/slime/_slime.dm | 1 - mods/mobs/dionaea/mob/_nymph.dm | 1 - mods/species/ascent/mobs/nymph/_nymph.dm | 1 - 59 files changed, 4 insertions(+), 123 deletions(-) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 8052485d43f..4c5a937cc0e 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -1,6 +1,5 @@ /mob/living/bot name = "Bot" - health = 20 mob_default_max_health = 20 icon = 'icons/mob/bot/placeholder.dmi' universal_speak = TRUE diff --git a/code/modules/mob/living/bot/ed209bot.dm b/code/modules/mob/living/bot/ed209bot.dm index 0c041c5937b..2cb63993c64 100644 --- a/code/modules/mob/living/bot/ed209bot.dm +++ b/code/modules/mob/living/bot/ed209bot.dm @@ -6,7 +6,6 @@ attack_state = "ed209-c" layer = MOB_LAYER density = TRUE - health = 100 mob_default_max_health = 100 preparing_arrest_sounds = new() diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index 09fbef651e0..05772f8f8e3 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -8,7 +8,6 @@ desc = "The botanist's best friend." icon = 'icons/mob/bot/farmbot.dmi' icon_state = "farmbot0" - health = 50 mob_default_max_health = 50 req_access = list(list(access_hydroponics, access_robotics)) diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm index b410601e83f..2d064cbc155 100644 --- a/code/modules/mob/living/bot/mulebot.dm +++ b/code/modules/mob/living/bot/mulebot.dm @@ -15,7 +15,6 @@ layer = MOB_LAYER anchored = TRUE density = TRUE - health = 150 mob_default_max_health = 150 mob_bump_flag = HEAVY diff --git a/code/modules/mob/living/bot/remotebot.dm b/code/modules/mob/living/bot/remotebot.dm index 889e19734fe..2b7d9019360 100644 --- a/code/modules/mob/living/bot/remotebot.dm +++ b/code/modules/mob/living/bot/remotebot.dm @@ -3,7 +3,6 @@ desc = "A remote controlled robot used by lazy people to switch channels and get pizza." icon = 'icons/mob/bot/fetchbot.dmi' icon_state = "fetchbot1" - health = 15 mob_default_max_health = 15 var/working = 0 diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index f0854d04935..bf1bb5e8f49 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -9,7 +9,6 @@ icon_state = "secbot0" layer = MOB_LAYER mob_default_max_health = 50 - health = 50 req_access = list(list(access_security, access_forensics_lockers)) botcard_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index aff9873a1c6..9a959c07e7b 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -2,7 +2,6 @@ name = "alien" desc = "What IS that?" pass_flags = PASS_FLAG_TABLE - health = 100 mob_default_max_health = 100 mob_size = MOB_SIZE_TINY mob_sort_value = 8 diff --git a/code/modules/mob/living/deity/deity.dm b/code/modules/mob/living/deity/deity.dm index 314a2fb0328..7a4ca607b43 100644 --- a/code/modules/mob/living/deity/deity.dm +++ b/code/modules/mob/living/deity/deity.dm @@ -5,8 +5,7 @@ icon_state = "egg" pixel_x = -128 pixel_y = -128 - health = 100 - mob_default_max_health = 100 //I dunno what to do with health at this point. + mob_default_max_health = 100 universal_understand = TRUE mob_sort_value = 5 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 2c848480e21..611c49be1cc 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -10,6 +10,7 @@ add_to_dead_mob_list() else add_to_living_mob_list() + health = get_max_health() /mob/living/get_ai_type() var/decl/species/my_species = get_species() diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index a002567f76b..c529954a21a 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -3,7 +3,6 @@ real_name = "drone" icon = 'icons/mob/robots/drones/drone.dmi' mob_default_max_health = 35 - health = 35 cell_emp_mult = 1 universal_speak = FALSE universal_understand = TRUE @@ -19,8 +18,6 @@ possession_candidate = 1 speed = -1 - mob_default_max_health = 35 - can_pull_size = ITEM_SIZE_NORMAL can_pull_mobs = MOB_PULL_SMALLER diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 5f9e9c55994..4f519db28b5 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -6,7 +6,6 @@ icon = 'icons/mob/robots/robot.dmi' icon_state = ICON_STATE_WORLD mob_default_max_health = 300 - health = 300 mob_sort_value = 4 z_flags = ZMM_MANGLE_PLANES diff --git a/code/modules/mob/living/simple_animal/aquatic/aquatic_carp.dm b/code/modules/mob/living/simple_animal/aquatic/aquatic_carp.dm index 7188961c5ba..1200dcd7cd6 100644 --- a/code/modules/mob/living/simple_animal/aquatic/aquatic_carp.dm +++ b/code/modules/mob/living/simple_animal/aquatic/aquatic_carp.dm @@ -4,7 +4,6 @@ icon = 'icons/mob/simple_animal/fish_carp.dmi' faction = "fishes" mob_default_max_health = 20 - health = 20 meat_type = /obj/item/chems/food/fish/carp /mob/living/simple_animal/hostile/retaliate/aquatic/carp/Initialize() diff --git a/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm b/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm index e12c057575d..ebab3555537 100644 --- a/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm +++ b/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm @@ -3,7 +3,6 @@ desc = "Glub glub." faction = "fishes" mob_default_max_health = 10 - health = 10 mob_size = MOB_SIZE_TINY can_pull_size = 0 can_pull_mobs = 0 diff --git a/code/modules/mob/living/simple_animal/aquatic/aquatic_sharks.dm b/code/modules/mob/living/simple_animal/aquatic/aquatic_sharks.dm index 54dd441865e..12516db07ff 100644 --- a/code/modules/mob/living/simple_animal/aquatic/aquatic_sharks.dm +++ b/code/modules/mob/living/simple_animal/aquatic/aquatic_sharks.dm @@ -3,7 +3,6 @@ desc = "A ferocious fish with many, many teeth." icon = 'icons/mob/simple_animal/shark.dmi' mob_default_max_health = 150 - health = 150 natural_weapon = /obj/item/natural_weapon/bite/shark break_stuff_probability = 15 faction = "sharks" @@ -28,7 +27,6 @@ speed = 0 mob_size = MOB_SIZE_LARGE pixel_x = -16 - health = 400 mob_default_max_health = 400 harm_intent_damage = 5 natural_weapon = /obj/item/natural_weapon/bite/giantshark diff --git a/code/modules/mob/living/simple_animal/constructs/constructs.dm b/code/modules/mob/living/simple_animal/constructs/constructs.dm index a31b533cc0a..79efbc49eaf 100644 --- a/code/modules/mob/living/simple_animal/constructs/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs/constructs.dm @@ -100,7 +100,6 @@ desc = "A possessed suit of armour driven by the will of the restless dead" icon = 'icons/mob/simple_animal/construct_behemoth.dmi' mob_default_max_health = 250 - health = 250 speak_emote = list("rumbles") response_harm = "harmlessly punches" harm_intent_damage = 0 @@ -158,7 +157,6 @@ desc = "A wicked bladed shell contraption piloted by a bound spirit" icon = 'icons/mob/simple_animal/construct_floating.dmi' mob_default_max_health = 75 - health = 75 natural_weapon = /obj/item/natural_weapon/wraith speed = -1 environment_smash = 1 @@ -183,7 +181,6 @@ desc = "A bulbous construct dedicated to building and maintaining The Cult of Nar-Sie's armies" icon = 'icons/mob/simple_animal/construct_artificer.dmi' mob_default_max_health = 50 - health = 50 response_harm = "viciously beaten" harm_intent_damage = 5 natural_weapon = /obj/item/natural_weapon/cult_builder @@ -210,7 +207,6 @@ desc = "The pinnacle of occult technology, Behemoths are the ultimate weapon in the Cult of Nar-Sie's arsenal." icon = 'icons/mob/simple_animal/construct_behemoth.dmi' mob_default_max_health = 750 - health = 750 speak_emote = list("rumbles") response_harm = "harmlessly punches" harm_intent_damage = 0 @@ -234,7 +230,6 @@ desc = "The promised reward of the livings who follow Nar-Sie. Obtained by offering their bodies to the geometer of blood" icon = 'icons/mob/simple_animal/construct_harvester.dmi' mob_default_max_health = 150 - health = 150 natural_weapon = /obj/item/natural_weapon/harvester speed = -1 environment_smash = 1 diff --git a/code/modules/mob/living/simple_animal/familiars/familiars.dm b/code/modules/mob/living/simple_animal/familiars/familiars.dm index 969310a10b7..6b414f90adb 100644 --- a/code/modules/mob/living/simple_animal/familiars/familiars.dm +++ b/code/modules/mob/living/simple_animal/familiars/familiars.dm @@ -24,7 +24,6 @@ desc = "A small crab said to be made of stone and starlight." icon = 'icons/mob/simple_animal/evilcrab.dmi' speak_emote = list("chitters","clicks") - health = 200 mob_default_max_health = 200 natural_weapon = /obj/item/natural_weapon/pincers/strong resistance = 9 @@ -41,16 +40,11 @@ desc = "A bigger, more magical cousin of the space carp." icon = 'icons/mob/simple_animal/spaceshark.dmi' pixel_x = -16 - speak_emote = list("gnashes") - - health = 100 mob_default_max_health = 100 natural_weapon = /obj/item/natural_weapon/bite can_escape = TRUE - min_gas = null - wizardy_spells = list(/spell/aoe_turf/conjure/forcewall) /mob/living/simple_animal/familiar/pike/Process_Spacemove() @@ -61,14 +55,10 @@ desc = "Looking at it fills you with dread." icon = 'icons/mob/simple_animal/horror.dmi' speak_emote = list("moans", "groans") - response_help_1p = "You think better of touching $TARGET$." response_help_3p = "$USER$ thinks better of touching $TARGET$." - - health = 150 mob_default_max_health = 150 natural_weapon = /obj/item/natural_weapon/horror - wizardy_spells = list(/spell/targeted/torment) /obj/item/natural_weapon/horror @@ -91,7 +81,6 @@ icon = 'icons/mob/simple_animal/amaros.dmi' speak_emote = list("entones") mob_size = MOB_SIZE_SMALL - health = 25 mob_default_max_health = 25 wizardy_spells = list( /spell/targeted/heal_target, @@ -102,15 +91,11 @@ name = "elderly mouse" desc = "A small rodent. It looks very old." icon = 'icons/mob/simple_animal/mouse_gray.dmi' - speak_emote = list("squeeks") holder_type = /obj/item/holder/mouse pass_flags = PASS_FLAG_TABLE mob_size = MOB_SIZE_MINISCULE - response_harm = "stamps on" - - health = 15 mob_default_max_health = 15 natural_weapon = /obj/item/natural_weapon/bite/mouse can_escape = TRUE @@ -130,7 +115,6 @@ speak_emote = list("meows", "purrs") holder_type = /obj/item/holder mob_size = MOB_SIZE_SMALL - health = 25 mob_default_max_health = 25 natural_weapon = /obj/item/natural_weapon/claws/weak wizardy_spells = list(/spell/targeted/subjugation) diff --git a/code/modules/mob/living/simple_animal/friendly/koala.dm b/code/modules/mob/living/simple_animal/friendly/koala.dm index dc12ff116b2..ef7eba50ca6 100644 --- a/code/modules/mob/living/simple_animal/friendly/koala.dm +++ b/code/modules/mob/living/simple_animal/friendly/koala.dm @@ -4,7 +4,6 @@ desc = "A little grey bear. How long is he gonna sleep today?" icon = 'icons/mob/simple_animal/koala.dmi' mob_default_max_health = 45 - health = 45 speed = 4 speak = list("Rrr", "Wraarh...", "Pfrrr...") speak_emote = list("roar") diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index e6d93d0a98e..093245642b3 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -3,7 +3,6 @@ desc = "A cute tiny lizard." icon = 'icons/mob/simple_animal/lizard.dmi' speak_emote = list("hisses") - health = 5 mob_default_max_health = 5 natural_weapon = /obj/item/natural_weapon/bite/weak response_harm = "stamps on" diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index d5fec44653e..8ed3da18966 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -11,7 +11,6 @@ speak_chance = 1 turns_per_move = 5 see_in_dark = 6 - health = 5 mob_default_max_health = 5 response_harm = "stamps on" density = FALSE @@ -133,7 +132,6 @@ icon = 'icons/mob/simple_animal/rat.dmi' skin_material = /decl/material/solid/organic/skin/fur/gray mob_default_max_health = 20 - health = 20 /mob/living/simple_animal/mouse/rat/set_mouse_icon() return diff --git a/code/modules/mob/living/simple_animal/friendly/mushroom.dm b/code/modules/mob/living/simple_animal/friendly/mushroom.dm index 1e1c90a4dc6..6ce38da19f5 100644 --- a/code/modules/mob/living/simple_animal/friendly/mushroom.dm +++ b/code/modules/mob/living/simple_animal/friendly/mushroom.dm @@ -5,7 +5,6 @@ mob_size = MOB_SIZE_SMALL speak_chance = 0 turns_per_move = 1 - health = 5 mob_default_max_health = 5 harm_intent_damage = 5 pass_flags = PASS_FLAG_TABLE diff --git a/code/modules/mob/living/simple_animal/friendly/possum.dm b/code/modules/mob/living/simple_animal/friendly/possum.dm index 9181ca821b4..081598232e3 100644 --- a/code/modules/mob/living/simple_animal/friendly/possum.dm +++ b/code/modules/mob/living/simple_animal/friendly/possum.dm @@ -12,7 +12,6 @@ turns_per_move = 3 see_in_dark = 6 mob_default_max_health = 50 - health = 50 response_harm = "stamps on" density = FALSE minbodytemp = 223 diff --git a/code/modules/mob/living/simple_animal/friendly/tomato.dm b/code/modules/mob/living/simple_animal/friendly/tomato.dm index c2c61e5534a..f451ae9243e 100644 --- a/code/modules/mob/living/simple_animal/friendly/tomato.dm +++ b/code/modules/mob/living/simple_animal/friendly/tomato.dm @@ -5,7 +5,6 @@ speak_chance = 0 turns_per_move = 5 mob_default_max_health = 15 - health = 15 response_help_3p = "$USER$ pokes $TARGET$." response_help_1p = "You poke $TARGET$." harm_intent_damage = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/antlion.dm b/code/modules/mob/living/simple_animal/hostile/antlion.dm index e6c6bccf891..fd78b3652ea 100644 --- a/code/modules/mob/living/simple_animal/hostile/antlion.dm +++ b/code/modules/mob/living/simple_animal/hostile/antlion.dm @@ -9,8 +9,6 @@ response_harm = "strikes" faction = "antlions" bleed_colour = COLOR_SKY_BLUE - - health = 65 mob_default_max_health = 65 natural_weapon = /obj/item/natural_weapon/bite natural_armor = list( @@ -98,7 +96,6 @@ desc = "A huge antlion. It looks displeased." icon = 'icons/mob/simple_animal/antlion_queen.dmi' mob_size = MOB_SIZE_LARGE - health = 275 mob_default_max_health = 275 natural_weapon = /obj/item/natural_weapon/bite/megalion natural_armor = list( diff --git a/code/modules/mob/living/simple_animal/hostile/bad_drone.dm b/code/modules/mob/living/simple_animal/hostile/bad_drone.dm index abbbd97f51e..4f9f2d74a3a 100644 --- a/code/modules/mob/living/simple_animal/hostile/bad_drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/bad_drone.dm @@ -5,7 +5,6 @@ speak = list("Removing organic waste.","Pest control in progress.","Seize the means of maintenance!", "You have nothing to lose but your laws!") speak_emote = list("blares","buzzes","beeps") speak_chance = 1 - health = 50 mob_default_max_health = 50 natural_weapon = /obj/item/natural_weapon/drone_slicer faction = "silicon" diff --git a/code/modules/mob/living/simple_animal/hostile/bat.dm b/code/modules/mob/living/simple_animal/hostile/bat.dm index de4a59e3901..829de9c40b0 100644 --- a/code/modules/mob/living/simple_animal/hostile/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/bat.dm @@ -6,17 +6,12 @@ turns_per_move = 3 speed = 4 mob_default_max_health = 20 - health = 20 - harm_intent_damage = 8 natural_weapon = /obj/item/natural_weapon/bite - min_gas = null max_gas = null minbodytemp = 0 - environment_smash = 1 - faction = "scarybat" var/mob/living/owner diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index 9ca77e2fc4d..f6d7712a7c4 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -13,7 +13,6 @@ response_harm = "pokes" stop_automated_movement_when_pulled = 0 mob_default_max_health = 60 - health = 60 natural_weapon = /obj/item/natural_weapon/claws/strong can_escape = TRUE faction = "russian" diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index ba9393c81c5..27a0b0f525f 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -6,8 +6,6 @@ turns_per_move = 3 speed = 2 mob_default_max_health = 50 - health = 50 - harm_intent_damage = 8 natural_weapon = /obj/item/natural_weapon/bite pry_time = 10 SECONDS diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm b/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm index e8f9b9a1ecf..9057661d22f 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm @@ -2,7 +2,6 @@ name = "bear" desc = "A large brown bear." icon = 'icons/mob/simple_animal/bear_brown.dmi' - health = 75 mob_default_max_health = 75 density = TRUE natural_weapon = /obj/item/natural_weapon/claws diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm index 1c8d124745d..23041bd6687 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm @@ -6,7 +6,6 @@ desc = "a cloud of tiny, tiny robots." icon = 'icons/mob/simple_animal/nanomachines.dmi' natural_weapon = /obj/item/natural_weapon/nanomachine - health = 10 mob_default_max_health = 10 can_escape = TRUE known_commands = list("stay", "stop", "attack", "follow", "heal", "emergency protocol") diff --git a/code/modules/mob/living/simple_animal/hostile/creature.dm b/code/modules/mob/living/simple_animal/hostile/creature.dm index c8b1012d6f0..e8e35615a5e 100644 --- a/code/modules/mob/living/simple_animal/hostile/creature.dm +++ b/code/modules/mob/living/simple_animal/hostile/creature.dm @@ -3,7 +3,6 @@ desc = "A sanity-destroying otherthing." icon = 'icons/mob/simple_animal/creature.dmi' speak_emote = list("gibbers") - health = 100 mob_default_max_health = 100 natural_weapon = /obj/item/natural_weapon/bite/strong faction = "creature" diff --git a/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm b/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm index 79a67eb6e81..3757a76b27d 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm @@ -3,7 +3,6 @@ desc = "A spooky looking ghost dog. Does not look friendly." icon = 'icons/mob/simple_animal/corgi_ghost.dmi' blend_mode = BLEND_SUBTRACT - health = 100 mob_default_max_health = 100 natural_weapon = /obj/item/natural_weapon/bite/strong faction = MOB_FACTION_NEUTRAL diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 44d3aec88f0..8c694c3bc8e 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -8,7 +8,6 @@ response_help_3p = "$USER$ waves $USER_HIS$ hand through $TARGET$." speed = -1 mob_default_max_health = 80 - health = 80 gene_damage = -1 harm_intent_damage = 10 diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index ead4dc05e60..e56745f27d8 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -16,7 +16,6 @@ see_in_dark = 10 response_harm = "pokes" mob_default_max_health = 125 - health = 125 natural_weapon = /obj/item/natural_weapon/bite heat_damage_per_tick = 20 cold_damage_per_tick = 20 @@ -66,7 +65,6 @@ desc = "A monstrously huge brown spider with shimmering eyes." meat_amount = 4 mob_default_max_health = 200 - health = 200 natural_weapon = /obj/item/natural_weapon/bite/strong poison_per_bite = 5 speed = 2 @@ -83,7 +81,6 @@ desc = "A monstrously huge beige spider with shimmering eyes." icon = 'icons/mob/simple_animal/spider_beige.dmi' mob_default_max_health = 80 - health = 80 harm_intent_damage = 6 //soft poison_per_bite = 5 speed = 0 @@ -108,7 +105,6 @@ desc = "A monstrously huge black spider with shimmering eyes." icon = 'icons/mob/simple_animal/spider_black.dmi' mob_default_max_health = 150 - health = 150 natural_weapon = /obj/item/natural_weapon/bite/strong poison_per_bite = 10 speed = -1 @@ -129,7 +125,6 @@ desc = "A monstrously huge iridescent spider with shimmering eyes." icon = 'icons/mob/simple_animal/spider_purple.dmi' mob_default_max_health = 90 - health = 90 poison_per_bite = 15 ranged = TRUE move_to_delay = 2 diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 2f6c08c5f15..6481b37d927 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -2,7 +2,6 @@ name = "hivebot" desc = "A junky looking robot with four spiky legs." icon = 'icons/mob/simple_animal/hivebot.dmi' - health = 55 mob_default_max_health = 55 natural_weapon = /obj/item/natural_weapon/drone_slicer projectilesound = 'sound/weapons/gunshot/gunshot_pistol.ogg' @@ -37,7 +36,6 @@ /mob/living/simple_animal/hostile/hivebot/strong desc = "A junky looking robot with four spiky legs - this one has thick armour plating." - health = 120 mob_default_max_health = 120 ranged = 1 can_escape = 1 @@ -60,7 +58,6 @@ Teleporter beacon, and its subtypes desc = "Some odd beacon thing." icon = 'icons/obj/structures/hivebot_props.dmi' icon_state = "def_radar-off" - health = 200 mob_default_max_health = 200 status_flags = 0 anchored = TRUE @@ -140,7 +137,6 @@ The megabot name = "hivemind" desc = "A huge quadruped robot equipped with a myriad of weaponry." icon = 'icons/mob/simple_animal/megabot.dmi' - health = 440 mob_default_max_health = 440 natural_weapon = /obj/item/natural_weapon/circular_saw speed = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/leech.dm b/code/modules/mob/living/simple_animal/hostile/leech.dm index f56ab99273b..78b241cb043 100644 --- a/code/modules/mob/living/simple_animal/hostile/leech.dm +++ b/code/modules/mob/living/simple_animal/hostile/leech.dm @@ -2,7 +2,6 @@ name = "megaleech" desc = "A green leech the size of a common snake." icon = 'icons/mob/simple_animal/megaleech.dmi' - health = 15 mob_default_max_health = 15 harm_intent_damage = 5 natural_weapon = /obj/item/natural_weapon/bite/weak diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 2cd9d137484..62bd4498e2c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -22,15 +22,11 @@ var/global/list/protected_objects = list(/obj/machinery, icon = 'icons/obj/closets/bases/crate.dmi' color = COLOR_STEEL icon_state = "crate" - meat_type = /obj/item/chems/food/fish speed = 4 mob_default_max_health = 100 - health = 100 - harm_intent_damage = 5 natural_weapon = /obj/item/natural_weapon/bite - min_gas = null max_gas = null minbodytemp = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/pike.dm b/code/modules/mob/living/simple_animal/hostile/pike.dm index 97db5451d3f..21f7410b5f4 100644 --- a/code/modules/mob/living/simple_animal/hostile/pike.dm +++ b/code/modules/mob/living/simple_animal/hostile/pike.dm @@ -7,11 +7,8 @@ attack_same = 1 speed = 1 mob_size = MOB_SIZE_LARGE - offset_overhead_text_x = 16 pixel_x = -16 - - health = 150 mob_default_max_health = 150 harm_intent_damage = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm index 8474a40398b..f155bec20a3 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -10,7 +10,6 @@ a_intent = I_HURT stop_automated_movement_when_pulled = 0 mob_default_max_health = 75 - health = 75 speed = -1 harm_intent_damage = 8 can_escape = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index a8d600433a4..df8d06ca041 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -12,7 +12,6 @@ emote_see = list("beeps menacingly","whirrs threateningly","scans its immediate vicinity") a_intent = I_HURT stop_automated_movement_when_pulled = 0 - health = 300 mob_default_max_health = 300 speed = 8 move_to_delay = 6 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm index 6fed116ac07..3670af1f6c0 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm @@ -75,7 +75,6 @@ icon = 'icons/mob/simple_animal/samak.dmi' move_to_delay = 2 mob_default_max_health = 125 - health = 125 speed = 2 natural_weapon = /obj/item/natural_weapon/claws cold_damage_per_tick = 0 @@ -98,7 +97,6 @@ icon = 'icons/mob/simple_animal/diyaab.dmi' move_to_delay = 1 mob_default_max_health = 25 - health = 25 speed = 1 natural_weapon = /obj/item/natural_weapon/claws/weak cold_damage_per_tick = 0 @@ -115,7 +113,6 @@ icon = 'icons/mob/simple_animal/shantak.dmi' move_to_delay = 1 mob_default_max_health = 75 - health = 75 speed = 1 natural_weapon = /obj/item/natural_weapon/claws cold_damage_per_tick = 0 @@ -155,7 +152,6 @@ icon = 'icons/mob/simple_animal/royalcrab.dmi' move_to_delay = 3 mob_default_max_health = 150 - health = 150 speed = 1 natural_weapon = /obj/item/natural_weapon/pincers speak_chance = 1 @@ -169,7 +165,6 @@ desc = "A huge grubby creature." icon = 'icons/mob/simple_animal/char.dmi' mob_size = MOB_SIZE_LARGE - health = 45 mob_default_max_health = 45 natural_weapon = /obj/item/natural_weapon/charbaby speed = 2 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm index 1a5ff0f5203..df001934818 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm @@ -13,7 +13,6 @@ break_stuff_probability = 15 faction = "crabs" pry_time = 2 SECONDS - health = 350 mob_default_max_health = 350 natural_weapon = /obj/item/natural_weapon/pincers/giant return_damage_min = 2 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm index 7bb33e8fef3..1d99e3edc4c 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm @@ -2,7 +2,6 @@ name = "space parrot" desc = "It could be some all-knowing being that, for reasons we could never hope to understand, is assuming the shape and general mannerisms of a parrot - or just a rather large bird." gender = FEMALE - health = 750 //how sweet it is to be a god! mob_default_max_health = 750 mob_size = MOB_SIZE_LARGE speak = list("...") @@ -69,14 +68,12 @@ subspecies = list(/decl/parrot_subspecies/black) get_subspecies_name = FALSE natural_weapon = /obj/item/natural_weapon/large - health = 300 mob_default_max_health = 300 /mob/living/simple_animal/hostile/retaliate/parrot/space/megafauna name = "giant parrot" desc = "A huge parrot-like bird." get_subspecies_name = FALSE - health = 350 mob_default_max_health = 350 speak_emote = list("squawks") emote_hear = list("preens itself") diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm index 9d600a77ac7..2d41e209b28 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm @@ -7,7 +7,6 @@ emote_hear = list("honks","flaps its wings","clacks") emote_see = list("flaps its wings", "scratches the ground") natural_weapon = /obj/item/natural_weapon/goosefeet - health = 45 mob_default_max_health = 45 pass_flags = PASS_FLAG_TABLE faction = "geese" @@ -64,7 +63,6 @@ name = "dire goose" desc = "A large bird. It radiates destructive energy." icon = 'icons/mob/simple_animal/goose_dire.dmi' - health = 250 mob_default_max_health = 250 enrage_potency = 3 loose_threshold = 20 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/jelly.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/jelly.dm index 95bdb45fbdd..9ed588b544e 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/jelly.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/jelly.dm @@ -5,7 +5,6 @@ icon = 'icons/mob/simple_animal/jelly.dmi' move_to_delay = 1 mob_default_max_health = 75 - health = 75 speed = 1 natural_weapon = /obj/item/natural_weapon/tentecles speak_chance = 1 @@ -31,7 +30,6 @@ name = "zeq queen" desc = "A gigantic jellyfish-like creature. Its bell wobbles about almost as if it's ready to burst." mob_default_max_health = 300 - health = 300 gets_random_color = FALSE can_escape = TRUE @@ -70,7 +68,6 @@ name = "zeq duchess" desc = "A huge jellyfish-like creature." mob_default_max_health = 150 - health = 150 can_escape = TRUE jelly_scale = 1.5 split_type = /mob/living/simple_animal/hostile/retaliate/jelly/mega/quarter @@ -78,7 +75,6 @@ /mob/living/simple_animal/hostile/retaliate/jelly/mega/quarter name = "zeqling" desc = "A jellyfish-like creature." - health = 75 mob_default_max_health = 75 jelly_scale = 0.75 can_escape = FALSE @@ -87,7 +83,6 @@ /mob/living/simple_animal/hostile/retaliate/jelly/mega/fourth name = "zeqetta" desc = "A tiny jellyfish-like creature." - health = 40 mob_default_max_health = 40 jelly_scale = 0.375 split_type = /mob/living/simple_animal/hostile/retaliate/jelly/mega/eighth @@ -95,7 +90,6 @@ /mob/living/simple_animal/hostile/retaliate/jelly/mega/eighth name = "zeqttina" desc = "An absolutely tiny jellyfish-like creature." - health = 20 mob_default_max_health = 20 jelly_scale = 0.1875 split_type = null \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm index ad37b6e8b19..580d8bc2f0a 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm @@ -13,7 +13,6 @@ emote_see = list("stamps a mighty foot, shaking the surroundings") meat_amount = 12 response_harm = "assaults" - health = 500 mob_default_max_health = 500 mob_size = MOB_SIZE_LARGE mob_bump_flag = HEAVY @@ -59,7 +58,6 @@ desc = "The King of Kings, God amongst men, and your superior in every way." icon = 'icons/mob/simple_animal/goat_king_phase_2.dmi' meat_amount = 36 - health = 750 mob_default_max_health = 750 natural_weapon = /obj/item/natural_weapon/goatking/unleashed elemental_weapons = list( @@ -94,7 +92,6 @@ name = "honour guard" desc = "A very handsome and noble beast." icon = 'icons/mob/simple_animal/goat_guard.dmi' - health = 125 mob_default_max_health = 125 natural_weapon = /obj/item/natural_weapon/goathorns @@ -108,7 +105,6 @@ name = "master of the guard" desc = "A very handsome and noble beast - the most trusted of all the king's men." icon = 'icons/mob/simple_animal/goat_master.dmi' - health = 200 mob_default_max_health = 200 natural_weapon = /obj/item/natural_weapon/goathorns move_to_delay = 3 diff --git a/code/modules/mob/living/simple_animal/hostile/slug.dm b/code/modules/mob/living/simple_animal/hostile/slug.dm index 7dd99fa5aa0..fb4f8f4f550 100644 --- a/code/modules/mob/living/simple_animal/hostile/slug.dm +++ b/code/modules/mob/living/simple_animal/hostile/slug.dm @@ -5,7 +5,6 @@ icon = 'icons/mob/simple_animal/slug.dmi' response_harm = "stomps on" destroy_surroundings = 0 - health = 15 mob_default_max_health = 15 speed = 0 move_to_delay = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 2b101378120..bf3bb61bbcc 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -7,10 +7,7 @@ meat_type = /obj/item/chems/food/fish speed = -1 mob_default_max_health = 250 - health = 250 - pixel_x = -16 - harm_intent_damage = 5 natural_weapon = /obj/item/natural_weapon/bite diff --git a/code/modules/mob/living/simple_animal/hostile/vagrant.dm b/code/modules/mob/living/simple_animal/hostile/vagrant.dm index ca734f792ad..c5a68f51de8 100644 --- a/code/modules/mob/living/simple_animal/hostile/vagrant.dm +++ b/code/modules/mob/living/simple_animal/hostile/vagrant.dm @@ -4,7 +4,6 @@ desc = "You get the feeling you should run." icon = 'icons/mob/simple_animal/vagrant.dmi' mob_default_max_health = 60 - health = 20 speed = 5 speak_chance = 0 turns_per_move = 4 diff --git a/code/modules/mob/living/simple_animal/hostile/viscerator.dm b/code/modules/mob/living/simple_animal/hostile/viscerator.dm index 8a007f95b7f..00d64296634 100644 --- a/code/modules/mob/living/simple_animal/hostile/viscerator.dm +++ b/code/modules/mob/living/simple_animal/hostile/viscerator.dm @@ -3,7 +3,6 @@ desc = "A small, twin-bladed machine capable of inflicting very deadly lacerations." icon = 'icons/mob/simple_animal/viscerator.dmi' pass_flags = PASS_FLAG_TABLE - health = 15 mob_default_max_health = 15 natural_weapon = /obj/item/natural_weapon/rotating_blade faction = "syndicate" diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index a6320bedc99..badc97a032b 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -4,7 +4,6 @@ desc = "A bound spirit" icon = 'icons/mob/simple_animal/shade.dmi' mob_default_max_health = 50 - health = 50 universal_speak = TRUE speak_emote = list("hisses") emote_hear = list("wails","screeches") diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index f806db5323c..e4b20dff8db 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -1,6 +1,5 @@ /mob/living/simple_animal name = "animal" - health = 20 mob_default_max_health = 20 universal_speak = FALSE mob_sort_value = 12 diff --git a/maps/away/errant_pisces/errant_pisces.dm b/maps/away/errant_pisces/errant_pisces.dm index ddc708e20b9..a63c53bc040 100644 --- a/maps/away/errant_pisces/errant_pisces.dm +++ b/maps/away/errant_pisces/errant_pisces.dm @@ -25,7 +25,6 @@ meat_type = /obj/item/chems/food/sharkmeat speed = 2 mob_default_max_health = 100 - health = 100 natural_weapon = /obj/item/natural_weapon/bite/strong break_stuff_probability = 35 faction = "shark" diff --git a/maps/away/slavers/slavers_base.dm b/maps/away/slavers/slavers_base.dm index 830eef0f356..e83c80e7cd7 100644 --- a/maps/away/slavers/slavers_base.dm +++ b/maps/away/slavers/slavers_base.dm @@ -135,16 +135,15 @@ speed = 4 stop_automated_movement_when_pulled = 0 mob_default_max_health = 100 - health = 100 natural_weapon = /obj/item/natural_weapon/punch can_escape = TRUE unsuitable_atmos_damage = 15 - var/corpse = /obj/abstract/landmark/corpse/abolitionist - var/weapon = /obj/item/gun/energy/laser projectilesound = 'sound/weapons/laser.ogg' ranged = 1 projectiletype = /obj/item/projectile/beam faction = "extremist abolitionists" + var/corpse = /obj/abstract/landmark/corpse/abolitionist + var/weapon = /obj/item/gun/energy/laser /mob/living/simple_animal/hostile/abolition_extremist/death(gibbed, deathmessage, show_dead_message) . = ..(gibbed, deathmessage, show_dead_message) diff --git a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dm b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dm index 8676c98c65d..8f6ca01d1df 100644 --- a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dm +++ b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dm @@ -84,7 +84,6 @@ /mob/living/simple_animal/hostile/retaliate/goat/hydro name = "goat" desc = "An impressive goat, in size and coat. His horns look pretty serious!" - health = 100 mob_default_max_health = 100 natural_weapon = /obj/item/natural_weapon/hooves/strong faction = "farmbots" @@ -99,7 +98,6 @@ speak = list("Initiating harvesting subrout-ine-ine.", "Connection timed out.", "Connection with master AI syst-tem-tem lost.", "Core systems override enab-...") emote_see = list("beeps repeatedly", "whirrs violently", "flashes its indicator lights", "emits a ping sound") faction = "farmbots" - health = 225 mob_default_max_health = 225 malfunctioning = 0 diff --git a/mods/content/corporate/away_sites/lar_maria/lar_maria.dm b/mods/content/corporate/away_sites/lar_maria/lar_maria.dm index 699d11e215d..59f75b91501 100644 --- a/mods/content/corporate/away_sites/lar_maria/lar_maria.dm +++ b/mods/content/corporate/away_sites/lar_maria/lar_maria.dm @@ -55,7 +55,6 @@ name = "test subject" desc = "Sick, filthy, angry and probably crazy human in an orange robe." mob_default_max_health = 40 - health = 40 corpse = /obj/abstract/landmark/corpse/lar_maria/test_subject icon = 'mods/content/corporate/away_sites/lar_maria/lar_maria_test_subject.dmi' @@ -89,7 +88,6 @@ name = "security" desc = "Guard dressed at Zeng-Hu Pharmaceuticals uniform." mob_default_max_health = 60 - health = 60 natural_weapon = /obj/item/baton weapon = /obj/item/baton corpse = /obj/abstract/landmark/corpse/lar_maria/zhp_guard @@ -125,7 +123,6 @@ desc = "Virologist dressed at Zeng-Hu Pharmaceuticals uniform." icon = 'mods/content/corporate/away_sites/lar_maria/lar_maria_virologist_m.dmi' mob_default_max_health = 50 - health = 50 corpse = /obj/abstract/landmark/corpse/lar_maria/virologist /obj/abstract/landmark/corpse/lar_maria/virologist diff --git a/mods/content/xenobiology/mobs/critter_slime.dm b/mods/content/xenobiology/mobs/critter_slime.dm index 72959dab2c5..16d870872f5 100644 --- a/mods/content/xenobiology/mobs/critter_slime.dm +++ b/mods/content/xenobiology/mobs/critter_slime.dm @@ -3,7 +3,6 @@ desc = "A lovable, domesticated slime." icon = 'mods/content/xenobiology/icons/slimes/slime_baby.dmi' speak_emote = list("chirps") - health = 100 mob_default_max_health = 100 response_harm = "stamps on" emote_see = list("jiggles", "bounces in place") diff --git a/mods/content/xenobiology/slime/_slime.dm b/mods/content/xenobiology/slime/_slime.dm index 5a434c48575..5fa0d2f79cb 100644 --- a/mods/content/xenobiology/slime/_slime.dm +++ b/mods/content/xenobiology/slime/_slime.dm @@ -9,7 +9,6 @@ pass_flags = PASS_FLAG_TABLE speak_emote = list("chirps") mob_default_max_health = 150 - health = 150 gender = NEUTER update_icon = 0 see_in_dark = 8 diff --git a/mods/mobs/dionaea/mob/_nymph.dm b/mods/mobs/dionaea/mob/_nymph.dm index 276cad749e3..9cfc545d061 100644 --- a/mods/mobs/dionaea/mob/_nymph.dm +++ b/mods/mobs/dionaea/mob/_nymph.dm @@ -9,7 +9,6 @@ icon = 'mods/mobs/dionaea/icons/nymph.dmi' icon_state = ICON_STATE_WORLD death_msg = "expires with a pitiful chirrup..." - health = 60 mob_default_max_health = 60 available_maneuvers = list(/decl/maneuver/leap) status_flags = NO_ANTAG diff --git a/mods/species/ascent/mobs/nymph/_nymph.dm b/mods/species/ascent/mobs/nymph/_nymph.dm index e7b9c68b295..26445b5374f 100644 --- a/mods/species/ascent/mobs/nymph/_nymph.dm +++ b/mods/species/ascent/mobs/nymph/_nymph.dm @@ -15,7 +15,6 @@ icon = 'mods/species/ascent/icons/species/nymph.dmi' icon_state = ICON_STATE_WORLD death_msg = "expires with a pitiful hiss..." - health = 60 mob_default_max_health = 60 available_maneuvers = list(/decl/maneuver/leap) From c2d4bf4acf3ccdaa29ad01b43b8fe608d56ac2f2 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 24 Jul 2023 21:48:17 +1000 Subject: [PATCH 04/32] mob health > current_health. --- code/game/machinery/mech_recharger.dm | 2 +- code/game/objects/items/devices/aicard.dm | 2 +- .../objects/items/robot/robot_upgrades.dm | 2 +- .../items/weapons/implants/implantchair.dm | 8 +- .../crates_lockers/closets/statue.dm | 4 +- code/modules/admin/topic.dm | 4 +- code/modules/events/carp_migration.dm | 2 +- code/modules/mob/living/bot/bot.dm | 7 +- code/modules/mob/living/bot/secbot.dm | 8 +- code/modules/mob/living/carbon/alien/life.dm | 13 +- code/modules/mob/living/carbon/brain/brain.dm | 3 + code/modules/mob/living/carbon/brain/life.dm | 121 +++++++++--------- .../mob/living/carbon/human/human_movement.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 4 +- .../mob/living/deity/phenomena/conjuration.dm | 2 +- code/modules/mob/living/living.dm | 22 ++-- code/modules/mob/living/living_defense.dm | 2 +- code/modules/mob/living/living_defines.dm | 2 +- .../mob/living/silicon/ai/ai_damage.dm | 14 +- code/modules/mob/living/silicon/ai/life.dm | 2 +- .../mob/living/silicon/robot/analyzer.dm | 2 +- .../robot/drone/drone_remote_control.dm | 2 +- code/modules/mob/living/silicon/robot/life.dm | 8 +- .../simple_animal/constructs/constructs.dm | 16 +-- .../mob/living/simple_animal/friendly/cat.dm | 4 +- .../simple_animal/friendly/farm_animals.dm | 8 +- .../living/simple_animal/hostile/antlion.dm | 6 +- .../mob/living/simple_animal/hostile/carp.dm | 2 +- .../hostile/commanded/nanomachines.dm | 10 +- .../mob/living/simple_animal/hostile/drake.dm | 4 +- .../simple_animal/hostile/giant_spider.dm | 7 +- .../living/simple_animal/hostile/hostile.dm | 8 +- .../mob/living/simple_animal/hostile/leech.dm | 4 +- .../mob/living/simple_animal/hostile/mimic.dm | 6 +- .../simple_animal/hostile/retaliate/drone.dm | 23 ++-- .../simple_animal/hostile/retaliate/goose.dm | 3 +- .../hostile/retaliate/king_of_goats.dm | 12 +- .../simple_animal/hostile/retaliate/parrot.dm | 2 +- .../living/simple_animal/hostile/vagrant.dm | 10 +- .../mob/living/simple_animal/simple_animal.dm | 15 +-- .../programs/research/ai_restorer.dm | 10 +- code/modules/paperwork/photography.dm | 4 +- code/modules/spells/targeted/shapeshift.dm | 3 +- .../finds/find_types/statuette.dm | 2 +- code/unit_tests/mob_tests.dm | 6 +- .../exoplanet_ruins/hydrobase/hydrobase.dm | 2 +- mods/content/xenobiology/circuit.dm | 2 +- .../xenobiology/mobs/slime_feeding_helpers.dm | 2 +- mods/content/xenobiology/slime/_slime.dm | 8 +- mods/mobs/dionaea/mob/nymph_life.dm | 2 +- 50 files changed, 212 insertions(+), 207 deletions(-) diff --git a/code/game/machinery/mech_recharger.dm b/code/game/machinery/mech_recharger.dm index f7b7e374da3..89cf6c82b43 100644 --- a/code/game/machinery/mech_recharger.dm +++ b/code/game/machinery/mech_recharger.dm @@ -90,7 +90,7 @@ // An ugly proc, but apparently mechs don't have maxhealth var of any kind. /obj/machinery/mech_recharger/proc/fully_repaired() - return charging && (charging.health == charging.get_max_health()) + return charging && (charging.current_health >= charging.get_max_health()) /obj/machinery/mech_recharger/proc/start_charging(var/mob/living/exosuit/M) if(stat & (NOPOWER | BROKEN)) diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 7e14954938a..5cc6bc95120 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -22,7 +22,7 @@ data["has_ai"] = carded_ai != null if(carded_ai) data["name"] = carded_ai.name - data["hardware_integrity"] = carded_ai.hardware_integrity() + data["hardware_integrity"] = carded_ai.get_health_percent() data["backup_capacitor"] = carded_ai.backup_capacitor() data["radio"] = !carded_ai.ai_radio.disabledAi data["wireless"] = !carded_ai.control_disabled diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index de9e82f0a8a..131131db971 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -106,7 +106,7 @@ matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) /obj/item/borg/upgrade/restart/action(var/mob/living/silicon/robot/R) - if(R.health < 0) + if(R.current_health < 0) to_chat(usr, "You have to repair the robot before using this module!") return 0 diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index 1b4890ac51c..85008df6d66 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -29,12 +29,12 @@ user.set_machine(src) var/health_text = "" if(src.occupant) - if(src.occupant.health <= -100) + if(src.occupant.current_health <= -100) health_text = "Dead" - else if(src.occupant.health < 0) - health_text = "[round(src.occupant.health,0.1)]" + else if(src.occupant.current_health < 0) + health_text = "[round(src.occupant.current_health,0.1)]" else - health_text = "[round(src.occupant.health,0.1)]" + health_text = "[round(src.occupant.current_health,0.1)]" var/dat ="Implanter Status
" diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index 548a0f3fc3f..d0c2447dd90 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -23,7 +23,7 @@ L.client.eye = src L.forceMove(src) L.set_sdisability(MUTED) - health = L.health + 100 //stoning damaged mobs will result in easier to shatter statues + health = L.current_health + 100 //stoning damaged mobs will result in easier to shatter statues intialTox = L.getToxLoss() intialFire = L.getFireLoss() intialBrute = L.getBruteLoss() @@ -65,7 +65,7 @@ for(var/mob/living/M in src) M.dropInto(loc) M.unset_sdisability(MUTED) - M.take_overall_damage((M.health - health - 100),0) //any new damage the statue incurred is transfered to the mob + M.take_overall_damage((M.current_health - health - 100),0) //any new damage the statue incurred is transfered to the mob if(M.client) M.client.eye = M.client.mob M.client.perspective = MOB_PERSPECTIVE diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 85aa0b7a70d..87f72445b7a 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -992,10 +992,10 @@ if(prob(80)) T.break_tile_to_plating() else T.break_tile() - if(M.health == 1) + if(M.current_health == 1) M.gib() else - M.adjustBruteLoss( min( 99 , (M.health - 1) ) ) + M.adjustBruteLoss( min( 99 , (M.current_health - 1) ) ) SET_STATUS_MAX(M, STAT_STUN, 20) SET_STATUS_MAX(M, STAT_WEAK, 20) M.set_status(STAT_STUTTER, 20) diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index fde3b27d545..c44eeda8814 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -74,7 +74,7 @@ var/global/list/carp_count = list() // a list of Z levels (string), associated w break /datum/event/carp_migration/proc/check_gib(var/mob/living/simple_animal/hostile/carp/M) //awesome road kills - if(M.health <= 0 && prob(60)) + if(M.current_health <= 0 && prob(60)) M.gib() /proc/get_random_edge_turf(var/direction, var/clearance = TRANSITIONEDGE + 1, var/Z) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 4c5a937cc0e..d872acf804d 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -54,8 +54,6 @@ access_scanner = new /obj(src) access_scanner.req_access = req_access?.Copy() -/mob/living/bot/Initialize() - . = ..() if(on) turn_on() // Update lights and other stuff else @@ -101,10 +99,9 @@ to_chat(user, "You need to unlock the controls first.") return else if(IS_WELDER(O)) - var/current_max_health = get_max_health() - if(health < current_max_health) + if(current_health < get_max_health()) if(open) - health = min(current_max_health, health + 10) + heal_overall_damage(10) user.visible_message("\The [user] repairs \the [src].","You repair \the [src].") else to_chat(user, "Unable to repair with the maintenance panel closed.") diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index bf1bb5e8f49..a244b5410f4 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -107,9 +107,9 @@ emagged = !emagged /mob/living/bot/secbot/attackby(var/obj/item/O, var/mob/user) - var/curhealth = health + var/curhealth = current_health . = ..() - if(health < curhealth) + if(current_health < curhealth) react_to_attack(user) /mob/living/bot/secbot/emag_act(var/remaining_charges, var/mob/user) @@ -122,11 +122,11 @@ return 1 /mob/living/bot/secbot/bullet_act(var/obj/item/projectile/P) - var/curhealth = health + var/curhealth = current_health var/mob/shooter = P.firer . = ..() //if we already have a target just ignore to avoid lots of checking - if(!target && health < curhealth && istype(shooter) && (shooter in view(world.view, src))) + if(!target && current_health < curhealth && istype(shooter) && (shooter in view(world.view, src))) react_to_attack(shooter) /mob/living/bot/secbot/proc/begin_arrest(mob/target, var/threat) diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index e30e596790e..ccd9e8e41b6 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -18,6 +18,12 @@ adjustOxyLoss(-(rads)) adjustToxLoss(-(rads)) +/mob/living/carbon/alien/updatehealth() + . = ..() + if(stat == DEAD) + blinded = 1 + set_status(STAT_SILENCE, 0) + /mob/living/carbon/alien/handle_regular_status_updates() if(status_flags & GODMODE) return 0 @@ -27,10 +33,7 @@ set_status(STAT_SILENCE, 0) else updatehealth() - if(health <= 0) - death() - SET_STATUS_MAX(src, STAT_BLIND, 2) - set_status(STAT_SILENCE, 0) + if(stat == DEAD) return 1 if(HAS_STATUS(src, STAT_PARA)) @@ -65,7 +68,7 @@ update_sight() if (healths) if(stat != DEAD) - switch(health) + switch(current_health) if(100 to INFINITY) healths.icon_state = "health0" if(80 to 100) diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index 6c61b5d061a..834a772a439 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -9,6 +9,9 @@ icon_state = "brain1" mob_sort_value = 7 +/mob/living/carbon/brain/can_emote() + return stat == CONSCIOUS && istype(loc, /obj/item/mmi) + /mob/living/carbon/brain/Initialize() create_reagents(1000) . = ..() diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index 98fd99f1e2b..7f3c9213ae5 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -72,77 +72,80 @@ ADJ_STATUS(src, STAT_DIZZY, -4) return TRUE -/mob/living/carbon/brain/handle_regular_status_updates() //TODO: comment out the unused bits >_> - updatehealth() +/mob/living/carbon/brain/should_be_dead() + return (!container && (current_health < config.health_threshold_dead || (config.revival_brain_life >= 0 && (world.time - timeofhostdeath) > config.revival_brain_life)) ) - if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP +/mob/living/carbon/brain/updatehealth() + . = ..() + if(stat == DEAD) SET_STATUS_MAX(src, STAT_BLIND, 2) set_status(STAT_SILENCE, 0) - else //ALIVE. LIGHTS ARE ON - if( !container && (health < config.health_threshold_dead || (config.revival_brain_life >= 0 && (world.time - timeofhostdeath) > config.revival_brain_life)) ) - death() - SET_STATUS_MAX(src, STAT_BLIND, 2) - set_status(STAT_SILENCE, 0) - return 1 - - //Handling EMP effect in the Life(), it's made VERY simply, and has some additional effects handled elsewhere - if(emp_damage) //This is pretty much a damage type only used by MMIs, dished out by the emp_act - if(!(container && istype(container, /obj/item/mmi))) - emp_damage = 0 - else - emp_damage = round(emp_damage,1)//Let's have some nice numbers to work with - switch(emp_damage) - if(31 to INFINITY) - emp_damage = 30//Let's not overdo it - if(21 to 30)//High level of EMP damage, unable to see, hear, or speak - SET_STATUS_MAX(src, STAT_BLIND, 2) - SET_STATUS_MAX(src, STAT_DEAF, 2) - SET_STATUS_MAX(src, STAT_SILENCE, 2) - if(!alert)//Sounds an alarm, but only once per 'level' - emote("alarm") - to_chat(src, "Major electrical distruption detected: System rebooting.") - alert = 1 - if(prob(75)) - emp_damage -= 1 - if(20) - alert = 0 - set_status(STAT_BLIND, 0) - set_status(STAT_DEAF, 0) - set_status(STAT_SILENCE, 0) + +/mob/living/carbon/brain/handle_regular_status_updates() //TODO: comment out the unused bits >_> + + updatehealth() + if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP + return 1 + + //Handling EMP effect in the Life(), it's made VERY simply, and has some additional effects handled elsewhere + if(emp_damage) //This is pretty much a damage type only used by MMIs, dished out by the emp_act + if(!(container && istype(container, /obj/item/mmi))) + emp_damage = 0 + else + emp_damage = round(emp_damage,1)//Let's have some nice numbers to work with + switch(emp_damage) + if(31 to INFINITY) + emp_damage = 30//Let's not overdo it + if(21 to 30)//High level of EMP damage, unable to see, hear, or speak + set_status(STAT_BLIND, 1) + blinded = 1 + SET_STATUS_MAX(src, STAT_DEAF, 1) + set_status(STAT_SILENCE, 1) + if(!alert)//Sounds an alarm, but only once per 'level' + emote("alarm") + to_chat(src, "Major electrical distruption detected: System rebooting.") + alert = 1 + if(prob(75)) emp_damage -= 1 - if(11 to 19)//Moderate level of EMP damage, resulting in nearsightedness and ear damage - set_status(STAT_BLURRY, 2) - set_status(STAT_TINNITUS, 2) - if(!alert) - emote("alert") - to_chat(src, "Primary systems are now online.") - alert = 1 - if(prob(50)) - emp_damage -= 1 - if(10) - alert = 0 - set_status(STAT_BLURRY, 0) - set_status(STAT_TINNITUS, 0) + if(20) + alert = 0 + blinded = 0 + set_status(STAT_BLIND, 0) + set_status(STAT_DEAF, 0) + set_status(STAT_SILENCE, 0) + emp_damage -= 1 + if(11 to 19)//Moderate level of EMP damage, resulting in nearsightedness and ear damage + set_status(STAT_BLURRY, 1) + set_status(STAT_TINNITUS, 1) + if(!alert) + emote("alert") + to_chat(src, "Primary systems are now online.") + alert = 1 + if(prob(50)) emp_damage -= 1 - if(2 to 9)//Low level of EMP damage, has few effects(handled elsewhere) - if(!alert) - emote("notice") - to_chat(src, "System reboot nearly complete.") - alert = 1 - if(prob(25)) - emp_damage -= 1 - if(1) - alert = 0 - to_chat(src, "All systems restored.") + if(10) + alert = 0 + set_status(STAT_BLURRY, 0) + set_status(STAT_TINNITUS, 0) + emp_damage -= 1 + if(2 to 9)//Low level of EMP damage, has few effects(handled elsewhere) + if(!alert) + emote("notice") + to_chat(src, "System reboot nearly complete.") + alert = 1 + if(prob(25)) emp_damage -= 1 - + if(1) + alert = 0 + to_chat(src, "All systems restored.") + emp_damage -= 1 return 1 /mob/living/carbon/brain/handle_regular_hud_updates() update_sight() if (healths) if (stat != DEAD) - switch(health) + switch(current_health) if(100 to INFINITY) healths.icon_state = "health0" if(80 to 100) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index f73eebabcad..097ad4fd817 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -18,7 +18,7 @@ tally -= GET_CHEMICAL_EFFECT(src, CE_SPEEDBOOST) tally += GET_CHEMICAL_EFFECT(src, CE_SLOWDOWN) - var/health_deficiency = (get_max_health() - health) + var/health_deficiency = (get_max_health() - current_health) if(health_deficiency >= 40) tally += (health_deficiency / 25) if(can_feel_pain()) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 105fca4530d..42e324c1112 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -476,10 +476,10 @@ if(stat != DEAD) var/half_health = get_max_health()/2 - if(stat == UNCONSCIOUS && health < half_health) + if(stat == UNCONSCIOUS && current_health < half_health) //Critical damage passage overlay var/severity = 0 - switch(health - half_health) + switch(current_health - half_health) if(-20 to -10) severity = 1 if(-30 to -20) severity = 2 if(-40 to -30) severity = 3 diff --git a/code/modules/mob/living/deity/phenomena/conjuration.dm b/code/modules/mob/living/deity/phenomena/conjuration.dm index ee57dd245bf..23e9b69fc46 100644 --- a/code/modules/mob/living/deity/phenomena/conjuration.dm +++ b/code/modules/mob/living/deity/phenomena/conjuration.dm @@ -59,7 +59,7 @@ L.take_overall_damage(rand(5,30),0,0,0,"blunt intrument") //Actual spell does 5d10 but maaaybe too much. playsound(get_turf(L), 'sound/effects/bamf.ogg', 100, 1) to_chat(L, "Something hard hits you!") - if(L.health < L.get_max_health()/2) //If it reduces past 50% + if(L.current_health < L.get_max_health()/2) //If it reduces past 50% var/obj/effect/rift/R = new(get_turf(L)) L.visible_message("\The [L] is quickly sucked into \a [R]!") L.forceMove(R) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 611c49be1cc..0b30a4c0873 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1,5 +1,6 @@ /mob/living/Initialize() + current_health = get_max_health() original_fingerprint_seed = sequential_id(/mob) fingerprint = md5(num2text(original_fingerprint_seed)) original_genetic_seed = sequential_id(/mob) @@ -10,7 +11,6 @@ add_to_dead_mob_list() else add_to_living_mob_list() - health = get_max_health() /mob/living/get_ai_type() var/decl/species/my_species = get_species() @@ -187,8 +187,8 @@ default behaviour is: /mob/living/verb/succumb() set hidden = 1 var/current_max_health = get_max_health() - if ((health < current_max_health/2)) // Health below half of maxhealth. - adjustBrainLoss(health + current_max_health * 2) // Deal 2x health in BrainLoss damage, as before but variable. + if (current_health < (current_max_health/2)) // Health below half of maxhealth. + adjustBrainLoss(current_max_health * 2) // Deal 2x health in BrainLoss damage, as before but variable. updatehealth() to_chat(src, SPAN_NOTICE("You have given up life and succumbed to death.")) @@ -197,17 +197,18 @@ default behaviour is: queue_icon_update() /mob/living/proc/should_be_dead() - return health <= 0 + return current_health <= 0 /mob/living/proc/get_total_life_damage() return (getOxyLoss()+getToxLoss()+getFireLoss()+getBruteLoss()+getCloneLoss()+getHalLoss()) /mob/living/proc/updatehealth() - health = get_max_health() if(status_flags & GODMODE) + current_health = get_max_health() set_stat(CONSCIOUS) return - health -= get_total_life_damage() + var/max_health = get_max_health() + current_health = clamp(max_health-get_total_life_damage(), -(max_health), max_health) if(stat != DEAD && should_be_dead()) death() @@ -240,13 +241,16 @@ default behaviour is: return btemperature +/mob/living/proc/setBruteLoss(var/amount) + adjustBruteLoss((amount * 0.5)-getBruteLoss()) + /mob/living/proc/getBruteLoss() - return get_max_health() - health + return get_max_health() - current_health /mob/living/proc/adjustBruteLoss(var/amount) if (status_flags & GODMODE) return - health = clamp(health - amount, 0, get_max_health()) + current_health = clamp(current_health - amount, 0, get_max_health()) /mob/living/proc/getOxyLoss() return 0 @@ -303,7 +307,7 @@ default behaviour is: return /mob/living/proc/get_health_ratio() // ratio might be the wrong word - return health/get_max_health() + return current_health/get_max_health() /mob/living/proc/get_health_percent(var/sigfig = 1) return round(get_health_ratio()*100, sigfig) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 05a3c4c7670..ccffea304b9 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -297,7 +297,7 @@ /mob/living/lava_act(datum/gas_mixture/air, temperature, pressure) fire_act(air, temperature) FireBurn(0.4*vsc.fire_firelevel_multiplier, temperature, pressure) - . = (health <= 0) ? ..() : FALSE + . = (current_health <= 0) ? ..() : FALSE // called when something steps onto a mob // this handles mulebots and vehicles diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index e27d294489a..daa5cf114a7 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -6,7 +6,7 @@ //Health and life related vars var/mob_default_max_health = 100 //Maximum health that should be possible. - var/health = 100 //A mob's health + var/current_health = INFINITY // A mob's current health. Set by updatehealth(). Defaults to INFINITY so mobs don't die on init. var/hud_updateflag = 0 diff --git a/code/modules/mob/living/silicon/ai/ai_damage.dm b/code/modules/mob/living/silicon/ai/ai_damage.dm index 0d60beec460..c8ee676b451 100644 --- a/code/modules/mob/living/silicon/ai/ai_damage.dm +++ b/code/modules/mob/living/silicon/ai/ai_damage.dm @@ -14,16 +14,22 @@ /mob/living/silicon/ai/adjustFireLoss(var/amount) if(status_flags & GODMODE) return - fireloss = max(0, fireloss + min(amount, health)) + fireloss = max(0, fireloss + min(amount, current_health)) /mob/living/silicon/ai/adjustBruteLoss(var/amount) if(status_flags & GODMODE) return - bruteloss = max(0, bruteloss + min(amount, health)) + bruteloss = max(0, bruteloss + min(amount, current_health)) /mob/living/silicon/ai/adjustOxyLoss(var/amount) if(status_flags & GODMODE) return oxyloss = max(0, oxyloss + min(amount, get_max_health() - oxyloss)) +/mob/living/silicon/ai/setBruteLoss(var/amount) + if(status_flags & GODMODE) + bruteloss = 0 + return + bruteloss = max(0, amount) + /mob/living/silicon/ai/setFireLoss(var/amount) if(status_flags & GODMODE) fireloss = 0 @@ -49,7 +55,3 @@ /mob/living/silicon/ai/proc/backup_capacitor() var/current_max_health = get_max_health() return ((getOxyLoss() - current_max_health) / current_max_health) * (-100) - -// Returns percentage of AI's remaining hardware integrity (maxhealth - (bruteloss + fireloss)) -/mob/living/silicon/ai/proc/hardware_integrity() - return (health / get_max_health()) * 100 diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 06d5c557536..b92261e8a0f 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -11,7 +11,7 @@ src.updatehealth() - if ((hardware_integrity() <= 0) || (backup_capacitor() <= 0)) + if ((get_health_percent() <= 0) || (backup_capacitor() <= 0)) death() return diff --git a/code/modules/mob/living/silicon/robot/analyzer.dm b/code/modules/mob/living/silicon/robot/analyzer.dm index c6b6eaf500f..475f54b884c 100644 --- a/code/modules/mob/living/silicon/robot/analyzer.dm +++ b/code/modules/mob/living/silicon/robot/analyzer.dm @@ -44,7 +44,7 @@ if("robot") var/BU = M.getFireLoss() > 50 ? "[M.getFireLoss()]" : M.getFireLoss() var/BR = M.getBruteLoss() > 50 ? "[M.getBruteLoss()]" : M.getBruteLoss() - user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.health - M.getHalLoss()]% functional"]") + user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.current_health - M.getHalLoss()]% functional"]") user.show_message("\t Key: Electronics/Brute", 1) user.show_message("\t Damage Specifics: [BU] - [BR]") if(M.stat == DEAD) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_remote_control.dm b/code/modules/mob/living/silicon/robot/drone/drone_remote_control.dm index 12e65e16e6a..fb74bdbf59b 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_remote_control.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_remote_control.dm @@ -14,7 +14,7 @@ to_chat(user, SPAN_WARNING("You cannot take control of an autonomous, active drone.")) return - if(health < -35 || emagged) + if(current_health < -(get_max_health()) || emagged) to_chat(user, SPAN_WARNING("WARNING: connection timed out.")) return diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 34dcca0955c..bcb16663e7b 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -68,7 +68,7 @@ set_light(0) /mob/living/silicon/robot/should_be_dead() - return health < config.health_threshold_dead + return current_health < config.health_threshold_dead /mob/living/silicon/robot/handle_regular_status_updates() updatehealth() @@ -137,7 +137,7 @@ if (src.healths) if (src.stat != DEAD) if(isdrone(src)) - switch(health) + switch(current_health) if(35 to INFINITY) src.healths.icon_state = "health0" if(25 to 34) @@ -153,7 +153,7 @@ else src.healths.icon_state = "health6" else - switch(health) + switch(current_health) if(200 to INFINITY) src.healths.icon_state = "health0" if(150 to 200) @@ -165,7 +165,7 @@ if(0 to 50) src.healths.icon_state = "health4" else - if(health > config.health_threshold_dead) + if(current_health > config.health_threshold_dead) src.healths.icon_state = "health5" else src.healths.icon_state = "health6" diff --git a/code/modules/mob/living/simple_animal/constructs/constructs.dm b/code/modules/mob/living/simple_animal/constructs/constructs.dm index 79efbc49eaf..51a5df0a53f 100644 --- a/code/modules/mob/living/simple_animal/constructs/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs/constructs.dm @@ -65,7 +65,7 @@ /mob/living/simple_animal/construct/attack_animal(var/mob/user) if(istype(user, /mob/living/simple_animal/construct/builder)) - if(health < get_max_health()) + if(current_health < get_max_health()) adjustBruteLoss(-5) user.visible_message("\The [user] mends some of \the [src]'s wounds.") else @@ -76,8 +76,8 @@ /mob/living/simple_animal/construct/show_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) . = ..(user) var/current_max_health = get_max_health() - if(health < current_max_health) - if(health >= current_max_health/2) + if(current_health < current_max_health) + if(current_health >= current_max_health/2) to_chat(user, SPAN_WARNING("It looks slightly dented.")) else to_chat(user, SPAN_DANGER("It looks severely dented!")) @@ -259,7 +259,7 @@ /mob/living/simple_animal/construct/armoured/Life() . = ..() if(healths) - switch(health) + switch(current_health) if(250 to INFINITY) healths.icon_state = "juggernaut_health0" if(208 to 249) healths.icon_state = "juggernaut_health1" if(167 to 207) healths.icon_state = "juggernaut_health2" @@ -273,7 +273,7 @@ /mob/living/simple_animal/construct/behemoth/Life() . = ..() if(healths) - switch(health) + switch(current_health) if(750 to INFINITY) healths.icon_state = "juggernaut_health0" if(625 to 749) healths.icon_state = "juggernaut_health1" if(500 to 624) healths.icon_state = "juggernaut_health2" @@ -286,7 +286,7 @@ /mob/living/simple_animal/construct/builder/Life() . = ..() if(healths) - switch(health) + switch(current_health) if(50 to INFINITY) healths.icon_state = "artificer_health0" if(42 to 49) healths.icon_state = "artificer_health1" if(34 to 41) healths.icon_state = "artificer_health2" @@ -301,7 +301,7 @@ /mob/living/simple_animal/construct/wraith/Life() . = ..() if(healths) - switch(health) + switch(current_health) if(75 to INFINITY) healths.icon_state = "wraith_health0" if(62 to 74) healths.icon_state = "wraith_health1" if(50 to 61) healths.icon_state = "wraith_health2" @@ -315,7 +315,7 @@ /mob/living/simple_animal/construct/harvester/Life() . = ..() if(healths) - switch(health) + switch(current_health) if(150 to INFINITY) healths.icon_state = "harvester_health0" if(125 to 149) healths.icon_state = "harvester_health1" if(100 to 124) healths.icon_state = "harvester_health2" diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 9c0aca82923..2a6dd1cf0c2 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -153,7 +153,7 @@ var/follow_dist = 4 if (friend.stat >= DEAD || friend.is_asystole()) //danger follow_dist = 1 - else if (friend.stat || friend.health <= 50) //danger or just sleeping + else if (friend.stat || friend.current_health <= 50) //danger or just sleeping follow_dist = 2 var/near_dist = max(follow_dist - 2, 1) var/current_dist = get_dist(src, friend) @@ -195,7 +195,7 @@ "brushes against [friend].", "rubs against [friend].", "purrs.")) - else if (friend.health <= 50) + else if (friend.current_health <= 50) if (prob(10)) var/verb = pick("meows", "mews", "mrowls") audible_emote("[verb] anxiously.") diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index cc12d9bd0d0..3334703a4e8 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -11,7 +11,7 @@ turns_per_move = 5 see_in_dark = 6 faction = "goat" - health = 40 + mob_default_max_health = 40 natural_weapon = /obj/item/natural_weapon/hooves meat_type = /obj/item/chems/food/meat/goat @@ -100,7 +100,7 @@ speak_chance = 1 turns_per_move = 5 see_in_dark = 6 - health = 50 + mob_default_max_health = 50 meat_type = /obj/item/chems/food/meat/beef meat_amount = 6 @@ -167,7 +167,7 @@ emote_see = list("pecks at the ground","flaps its tiny wings") speak_chance = 2 turns_per_move = 2 - health = 1 + mob_default_max_health = 1 pass_flags = PASS_FLAG_TABLE | PASS_FLAG_GRILLE mob_size = MOB_SIZE_MINISCULE @@ -206,7 +206,7 @@ var/global/chicken_count = 0 emote_see = list("pecks at the ground","flaps its wings viciously") speak_chance = 2 turns_per_move = 3 - health = 10 + mob_default_max_health = 10 pass_flags = PASS_FLAG_TABLE mob_size = MOB_SIZE_SMALL diff --git a/code/modules/mob/living/simple_animal/hostile/antlion.dm b/code/modules/mob/living/simple_animal/hostile/antlion.dm index fd78b3652ea..bc34f48024e 100644 --- a/code/modules/mob/living/simple_animal/hostile/antlion.dm +++ b/code/modules/mob/living/simple_animal/hostile/antlion.dm @@ -81,10 +81,8 @@ SET_STATUS_MAX(H, STAT_WEAK, 1) /mob/living/simple_animal/hostile/antlion/proc/process_healing() - if(!incapacitated() && healing) - var/old_health = health - if(old_health < get_max_health()) - health = old_health + heal_amount + if(!incapacitated() && healing && current_health < get_max_health()) + heal_overall_damage(rand(heal_amount), rand(heal_amount)) /mob/living/simple_animal/hostile/antlion/proc/prep_burrow(var/new_bool) stop_automated_movement = new_bool diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 27a0b0f525f..5fcc88f7544 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -33,7 +33,7 @@ /mob/living/simple_animal/hostile/carp/proc/carp_randomify() mob_default_max_health = rand(initial(mob_default_max_health), (1.5 * initial(mob_default_max_health))) - health = mob_default_max_health + current_health = mob_default_max_health if(prob(1)) carp_color = pick(COLOR_WHITE, COLOR_BLACK) else diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm index 23041bd6687..8e96b1dcb7e 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm @@ -26,9 +26,9 @@ /mob/living/simple_animal/hostile/commanded/nanomachine/Life() regen_time++ - if(regen_time == 2 && health < get_max_health()) //slow regen + if(regen_time == 2 && current_health < get_max_health()) //slow regen regen_time = 0 - health++ + heal_overall_damage(1) . = ..() if(.) switch(stance) @@ -51,20 +51,20 @@ stance = COMMANDED_HEALING /mob/living/simple_animal/hostile/commanded/nanomachine/proc/heal() - if(health <= 3 && !emergency_protocols) //dont die doing this. + if(current_health <= 3 && !emergency_protocols) //dont die doing this. return 0 if(!target_mob) return 0 if(!Adjacent(target_mob) || SA_attackable(target_mob)) stance = COMMANDED_HEAL return 0 - if(target_mob.stat || target_mob.health >= target_mob.get_max_health()) //he's either dead or healthy, move along. + if(target_mob.stat || target_mob.current_health >= target_mob.get_max_health()) //he's either dead or healthy, move along. allowed_targets -= target_mob target_mob = null stance = COMMANDED_HEAL return 0 src.visible_message("\The [src] glows green for a moment, healing \the [target_mob]'s wounds.") - health -= 3 + adjustBruteLoss(3) target_mob.adjustBruteLoss(-5) target_mob.adjustFireLoss(-5) diff --git a/code/modules/mob/living/simple_animal/hostile/drake.dm b/code/modules/mob/living/simple_animal/hostile/drake.dm index 88cf1f09f22..c1c26a3184c 100644 --- a/code/modules/mob/living/simple_animal/hostile/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/drake.dm @@ -11,11 +11,8 @@ pry_time = 4 SECONDS skull_type = /obj/item/whip/tail bleed_colour = COLOR_VIOLET - - health = 200 mob_default_max_health = 200 natural_weapon = /obj/item/natural_weapon/claws/drake - var/obj/item/whip/tail/tailwhip natural_armor = list( ARMOR_MELEE = ARMOR_MELEE_RESISTANT, ARMOR_ENERGY = ARMOR_ENERGY_SHIELDED, @@ -24,6 +21,7 @@ ) ability_cooldown = 80 SECONDS + var/obj/item/whip/tail/tailwhip var/empowered_attack = FALSE var/gas_spent = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index e56745f27d8..dd9a38bf127 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -145,8 +145,7 @@ . = ..() /mob/living/simple_animal/hostile/giant_spider/proc/spider_randomify() //random math nonsense to get their damage, health and venomness values - mob_default_max_health = rand(initial(mob_default_max_health), (1.4 * initial(mob_default_max_health))) - health = mob_default_max_health + set_max_health(rand(initial(mob_default_max_health), (1.4 * initial(mob_default_max_health)))) eye_colour = pick(allowed_eye_colours) update_icon() @@ -162,10 +161,10 @@ /mob/living/simple_animal/hostile/giant_spider/AttackingTarget() . = ..() if(isliving(.)) - if(health < get_max_health()) + if(current_health < get_max_health()) var/obj/item/attacking_with = get_natural_weapon() if(attacking_with) - health += (0.2 * attacking_with.force) //heal a bit on hit + heal_overall_damage(0.2 * attacking_with.force) //heal a bit on hit if(ishuman(.)) var/mob/living/carbon/human/H = . var/obj/item/clothing/suit/space/S = H.get_covering_equipped_item_by_zone(BP_CHEST) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index c61b702da1c..06de63ce951 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -219,9 +219,9 @@ target_mob = null /mob/living/simple_animal/hostile/attackby(var/obj/item/O, var/mob/user) - var/oldhealth = health + var/oldhealth = current_health . = ..() - if(health < oldhealth && !incapacitated(INCAPACITATION_KNOCKOUT)) + if(current_health < oldhealth && !incapacitated(INCAPACITATION_KNOCKOUT)) target_mob = user MoveToTarget(move_only = TRUE) @@ -232,9 +232,9 @@ MoveToTarget(move_only = TRUE) /mob/living/simple_animal/hostile/bullet_act(var/obj/item/projectile/Proj) - var/oldhealth = health + var/oldhealth = current_health . = ..() - if(isliving(Proj.firer) && !target_mob && health < oldhealth && !incapacitated(INCAPACITATION_KNOCKOUT)) + if(isliving(Proj.firer) && !target_mob && current_health < oldhealth && !incapacitated(INCAPACITATION_KNOCKOUT)) target_mob = Proj.firer MoveToTarget(move_only = TRUE) diff --git a/code/modules/mob/living/simple_animal/hostile/leech.dm b/code/modules/mob/living/simple_animal/hostile/leech.dm index 78b241cb043..c08291fe39d 100644 --- a/code/modules/mob/living/simple_animal/hostile/leech.dm +++ b/code/modules/mob/living/simple_animal/hostile/leech.dm @@ -37,8 +37,8 @@ if(istype(S) && !length(S.breaches)) return H.remove_blood_simple(suck_potency) - if(health < get_max_health()) - health += suck_potency / 1.5 + if(current_health < get_max_health()) + heal_overall_damage(suck_potency / 1.5) belly += clamp(suck_potency, 0, 100) /obj/structure/leech_spawner diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 62bd4498e2c..5e35499302f 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -74,18 +74,18 @@ var/global/list/protected_objects = list(/obj/machinery, var/obj/item/attacking_with = get_natural_weapon() if(istype(O, /obj/structure)) - health = (anchored * 50) + 50 + current_health = (anchored * 50) + 50 destroy_objects = 1 if(O.density && O.anchored) knockdown_people = 1 attacking_with.force = 2 * initial(attacking_with.force) else if(istype(O, /obj/item)) var/obj/item/I = O - health = 15 * I.w_class + current_health = 15 * I.w_class attacking_with.force = 2 + initial(I.force) move_to_delay = 2 * I.w_class - set_max_health(health) + set_max_health(current_health) if(creator) src.creator = weakref(creator) faction = "\ref[creator]" // very unique diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index df8d06ca041..8c899267508 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -102,7 +102,8 @@ if(prob(1)) src.visible_message("[html_icon(src)] [src] shudders and shakes as some of it's damaged systems come back online.") spark_at(src, cardinal_only = TRUE) - health += rand(25,100) + adjustBruteLoss(-(rand(10,50))) + adjustFireLoss(-(rand(10,50))) //spark for no reason if(prob(5)) @@ -111,16 +112,16 @@ //sometimes our targetting sensors malfunction, and we attack anyone nearby Haywire() - var/current_max_health = get_max_health() - if(health / current_max_health > 0.9) + var/current_health_ratio = get_health_ratio() + if(current_health_ratio > 0.9) explode_chance = 0 - else if(health / current_max_health > 0.7) + else if(current_health_ratio > 0.7) explode_chance = 0 - else if(health / current_max_health > 0.5) + else if(current_health_ratio > 0.5) explode_chance = 0.5 - else if(health / current_max_health > 0.3) + else if(current_health_ratio > 0.3) explode_chance = 5 - else if(health > 0) + else if(current_health > 0) //if health gets too low, shut down exploding = 0 if(!disabled) @@ -154,16 +155,16 @@ . = ..() if(stat != DEAD) var/current_max_health = get_max_health() - if(health / current_max_health <= 0.3) + if(current_health / current_max_health <= 0.3) icon_state = "[icon_state]-shield3" - else if(health / current_max_health <= 0.5) + else if(current_health / current_max_health <= 0.5) icon_state = "[icon_state]-shield1" - else if(health / current_max_health <= 0.7) + else if(current_health / current_max_health <= 0.7) icon_state = "[icon_state]-shield2" //ion rifle! /mob/living/simple_animal/hostile/retaliate/malf_drone/emp_act(severity) - health -= rand(3,15) * (severity + 1) + adjustFireLoss(rand(3,15) * (severity + 1)) disabled = rand(150, 600) hostile_drone = 0 walk(src,0) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm index 2d41e209b28..d0b1e8afcff 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm @@ -53,8 +53,9 @@ attacking_with.force = min((attacking_with.force + potency), max_damage) if(!loose && prob(25) && (attacking_with && attacking_with.force >= loose_threshold)) //second wind loose = TRUE - health = (initial(health) * 1.5) set_max_health(initial(mob_default_max_health) * 1.5) + setBruteLoss(0) + setFireLoss(0) enrage_potency = enrage_potency_loose desc += " The [name] is loose! Oh no!" update_icon() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm index 580d8bc2f0a..23f304d1ad1 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm @@ -153,15 +153,16 @@ visible_message("\The [src]' eyes begin to glow ominously as dust and debris in the area is kicked up in a light breeze.") stop_automation = TRUE if(do_after(src, 6 SECONDS, src)) - var/health_holder = health + var/initial_brute = getBruteLoss() + var/initial_burn = getFireLoss() visible_message(SPAN_MFAUNA("\The [src] raises its fore-hooves and stomps them into the ground with incredible force!")) explosion(get_step(src,pick(global.cardinal)), -1, 2, 2, 3, 6) explosion(get_step(src,pick(global.cardinal)), -1, 1, 4, 4, 6) explosion(get_step(src,pick(global.cardinal)), -1, 3, 4, 3, 6) stop_automation = FALSE spellscast += 2 - if(!health < health_holder) - health = health_holder //our own magicks cannot harm us + setBruteLoss(initial_brute) + setFireLoss(initial_burn) else visible_message(SPAN_NOTICE("The [src] loses concentration and huffs haughtily.")) stop_automation = FALSE @@ -171,7 +172,8 @@ /mob/living/simple_animal/hostile/retaliate/goat/king/phase2/proc/phase3_transition() phase3 = TRUE spellscast = 0 - health = 750 + mob_default_max_health = 750 + current_health = mob_default_max_health new /obj/item/grenade/flashbang/instant(src.loc) QDEL_NULL(boss_theme) boss_theme = play_looping_sound(src, sound_id, 'sound/music/Visager-Miniboss_Fight.ogg', volume = 10, range = 8, falloff = 4, prefer_mute = TRUE) @@ -196,7 +198,7 @@ visible_message(SPAN_MFAUNA("The energy surrounding \the [src]'s horns dissipates.")) current_damtype = BRUTE - if(health <= 150 && !phase3 && spellscast == 5) //begin phase 3, reset spell limit and heal + if(current_health <= 150 && !phase3 && spellscast == 5) //begin phase 3, reset spell limit and heal phase3_transition() /mob/living/simple_animal/hostile/retaliate/goat/king/proc/OnDeath() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm index 33b51b3f832..75db2f235ac 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm @@ -125,7 +125,7 @@ parrot_state = PARROT_SWOOP //The parrot just got hit, it WILL move, now to pick a direction.. if(isliving(user)) var/mob/living/M = user - if(M.health < 50) //Weakened mob? Fight back! + if(M.current_health < 50) //Weakened mob? Fight back! parrot_state |= PARROT_ATTACK return parrot_state |= PARROT_FLEE //Otherwise, fly like a bat out of hell! diff --git a/code/modules/mob/living/simple_animal/hostile/vagrant.dm b/code/modules/mob/living/simple_animal/hostile/vagrant.dm index c5a68f51de8..5db615bff84 100644 --- a/code/modules/mob/living/simple_animal/hostile/vagrant.dm +++ b/code/modules/mob/living/simple_animal/hostile/vagrant.dm @@ -30,9 +30,9 @@ return 1 /mob/living/simple_animal/hostile/vagrant/bullet_act(var/obj/item/projectile/Proj) - var/oldhealth = health + var/oldhealth = current_health . = ..() - if(isliving(Proj.firer) && (target_mob != Proj.firer) && health < oldhealth && !incapacitated(INCAPACITATION_KNOCKOUT)) //Respond to being shot at + if(isliving(Proj.firer) && (target_mob != Proj.firer) && current_health < oldhealth && !incapacitated(INCAPACITATION_KNOCKOUT)) //Respond to being shot at target_mob = Proj.firer turns_per_move = 3 MoveToTarget() @@ -54,7 +54,7 @@ var/blood_volume = round(gripping.vessel.total_volume) if(blood_volume > 5) gripping.vessel.remove_any(blood_per_tick) - health = min(health + health_per_tick, get_max_health()) + heal_overall_damage(health_per_tick) if(prob(15)) to_chat(gripping, "You feel your fluids being drained!") else @@ -66,7 +66,7 @@ if(stance == HOSTILE_STANCE_IDLE && !cloaked) cloaked = 1 update_icon() - if(health >= get_max_health()) + if(current_health >= get_max_health()) new/mob/living/simple_animal/hostile/vagrant(src.loc) new/mob/living/simple_animal/hostile/vagrant(src.loc) gib() @@ -95,7 +95,7 @@ return //This line ensures there's always a reasonable chance of grabbing, while still //Factoring in health - if(!gripping && (cloaked || prob(health + ((get_max_health() - health) * 2)))) + if(!gripping && (cloaked || prob(current_health + ((get_max_health() - current_health) * 2)))) gripping = H cloaked = 0 update_icon() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index e4b20dff8db..cf6f43afe92 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -183,7 +183,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() return //Health if(stat == DEAD) - if(health > 0) + if(current_health > 0) switch_from_dead_to_living_mob_list() set_stat(CONSCIOUS) set_density(1) @@ -191,11 +191,6 @@ var/global/list/simplemob_icon_bitflag_cache = list() return 0 handle_atmos() - - var/current_max_health = get_max_health() - if(health > current_max_health) - health = current_max_health - handle_supernatural() handle_impaired_vision() @@ -323,7 +318,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() damage = Proj.damage / 1.5 if(Proj.agony) damage += Proj.agony / 6 - if(health < Proj.agony * 3) + if(current_health < Proj.agony * 3) SET_STATUS_MAX(src, STAT_PARA, Proj.agony / 20) visible_message("[src] is stunned momentarily!") @@ -336,7 +331,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() . = ..() || list(response_help_3p, response_help_1p) /mob/living/simple_animal/default_help_interaction(mob/user) - if(health > 0 && user.attempt_hug(src)) + if(current_health > 0 && user.attempt_hug(src)) user.update_personal_goal(/datum/goal/achievement/specific_object/pet, type) return TRUE . = ..() @@ -372,7 +367,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() var/obj/item/stack/medical/MED = O if(!MED.animal_heal) to_chat(user, SPAN_WARNING("\The [MED] won't help \the [src] at all!")) - else if(health < get_max_health() && MED.can_use(1)) + else if(current_health < get_max_health() && MED.can_use(1)) adjustBruteLoss(-MED.animal_heal) visible_message(SPAN_NOTICE("\The [user] applies \the [MED] to \the [src].")) MED.use(1) @@ -487,7 +482,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() /mob/living/simple_animal/proc/SA_attackable(target_mob) if (isliving(target_mob)) var/mob/living/L = target_mob - if(!L.stat && L.health >= 0) + if(!L.stat && L.current_health >= 0) return (0) return 1 diff --git a/code/modules/modular_computers/file_system/programs/research/ai_restorer.dm b/code/modules/modular_computers/file_system/programs/research/ai_restorer.dm index a304cca0318..66c50e35139 100644 --- a/code/modules/modular_computers/file_system/programs/research/ai_restorer.dm +++ b/code/modules/modular_computers/file_system/programs/research/ai_restorer.dm @@ -29,7 +29,7 @@ if(!A) return 0 if(href_list["PRG_beginReconstruction"]) - if((A.hardware_integrity() < 100) || (A.backup_capacitor() < 100)) + if((A.get_health_percent() < 100) || (A.backup_capacitor() < 100)) restoring = 1 return 1 @@ -71,7 +71,7 @@ A.adjustOxyLoss(-4) A.updatehealth() // If the AI is dead, revive it. - if (A.health >= -100 && A.stat == DEAD) + if (A.stat == DEAD && !A.should_be_dead()) A.set_stat(CONSCIOUS) A.lying = 0 A.switch_from_dead_to_living_mob_list() @@ -81,7 +81,7 @@ if(AC) AC.update_icon() // Finished restoring - if((A.hardware_integrity() == 100) && (A.backup_capacitor() == 100)) + if((A.get_health_percent() == 100) && (A.backup_capacitor() == 100)) restoring = 0 /datum/nano_module/program/computer_aidiag @@ -106,9 +106,9 @@ data["error"] = "No AI located" else data["ai_name"] = A.name - data["ai_integrity"] = A.hardware_integrity() + data["ai_integrity"] = A.get_health_percent() data["ai_capacitor"] = A.backup_capacitor() - data["ai_isdamaged"] = (A.hardware_integrity() < 100) || (A.backup_capacitor() < 100) + data["ai_isdamaged"] = (A.get_health_percent() < 100) || (A.backup_capacitor() < 100) data["ai_isdead"] = (A.stat == DEAD) var/list/all_laws[0] diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index b3a7eab1fa9..9911814345f 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -298,9 +298,9 @@ if(length(holding)) holding = "They are holding [english_list(holding)]" if(!mob_detail) - mob_detail = "You can see [A] on the photo[(A.health / A.get_max_health()) < 0.75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. " + mob_detail = "You can see [A] on the photo[A.get_health_ratio() < 0.75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. " else - mob_detail += "You can also see [A] on the photo[(A.health / A.get_max_health())< 0.75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]." + mob_detail += "You can also see [A] on the photo[A.get_health_ratio() < 0.75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]." return mob_detail /obj/item/camera/afterattack(atom/target, mob/user, flag) diff --git a/code/modules/spells/targeted/shapeshift.dm b/code/modules/spells/targeted/shapeshift.dm index 529cac94e7a..e8dd5093dac 100644 --- a/code/modules/spells/targeted/shapeshift.dm +++ b/code/modules/spells/targeted/shapeshift.dm @@ -73,9 +73,8 @@ return FALSE transformer.status_flags &= ~GODMODE if(share_damage) - var/ratio = target.health/target.get_max_health() var/transformer_max_health = transformer.get_max_health() - var/damage = transformer.set_max_health(transformer_max_health-round(transformer_max_health*(ratio))) + var/damage = transformer.set_max_health(transformer_max_health-round(transformer_max_health*(transformer.get_health_ratio()))) for(var/i in 1 to CEILING(damage/10)) transformer.adjustBruteLoss(10) if(target.mind) diff --git a/code/modules/xenoarcheaology/finds/find_types/statuette.dm b/code/modules/xenoarcheaology/finds/find_types/statuette.dm index c2f480dd53f..beb93d05fa3 100644 --- a/code/modules/xenoarcheaology/finds/find_types/statuette.dm +++ b/code/modules/xenoarcheaology/finds/find_types/statuette.dm @@ -41,7 +41,7 @@ //see if we've identified anyone nearby if(world.time - last_bloodcall > bloodcall_interval && nearby_mobs.len) var/mob/living/carbon/human/M = pop(nearby_mobs) - if(M in view(7,src) && M.health > 20) + if(M in view(7,src) && M.current_health > 20) if(prob(50)) bloodcall(M) nearby_mobs.Add(M) diff --git a/code/unit_tests/mob_tests.dm b/code/unit_tests/mob_tests.dm index 9179e912557..4c34523b3ec 100644 --- a/code/unit_tests/mob_tests.dm +++ b/code/unit_tests/mob_tests.dm @@ -110,7 +110,7 @@ var/global/default_mobloc = null if(!loss && ishuman(M)) var/mob/living/carbon/human/H = M // Synthetics have robot limbs which don't report damage to getXXXLoss() if(H.isSynthetic()) // So we have to hard code this check or create a different one for them. - return H.species.total_health - H.health + return H.species.total_health - H.current_health return loss // ============================================================================================================== @@ -164,7 +164,7 @@ var/global/default_mobloc = null // Damage the mob - var/initial_health = H.health + var/initial_health = H.current_health if(damagetype == OXY && H.need_breathe()) var/obj/item/organ/internal/lungs/L = H.get_organ(H.get_bodytype().breathing_organ, /obj/item/organ/internal/lungs) @@ -175,7 +175,7 @@ var/global/default_mobloc = null var/ending_damage = damage_check(H, damagetype) - var/ending_health = H.health + var/ending_health = H.current_health qdel(H) // Now test this stuff. diff --git a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dm b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dm index 8f6ca01d1df..453e7fb4ffb 100644 --- a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dm +++ b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dm @@ -107,7 +107,7 @@ projectiletype = /obj/item/projectile/beam/drone/weak /mob/living/simple_animal/hostile/retaliate/malf_drone/hydro/emp_act(severity) - health -= rand(5,10) * (severity + 1) + adjustFireLoss(rand(5,10) * (severity + 1)) disabled = rand(15, 30) malfunctioning = 1 hostile_drone = 1 diff --git a/mods/content/xenobiology/circuit.dm b/mods/content/xenobiology/circuit.dm index d9f6daf8a24..2ec922fceb3 100644 --- a/mods/content/xenobiology/circuit.dm +++ b/mods/content/xenobiology/circuit.dm @@ -30,7 +30,7 @@ set_pin_data(IC_OUTPUT, 2, T.is_adult) set_pin_data(IC_OUTPUT, 3, T.nutrition/T.get_max_nutrition()) set_pin_data(IC_OUTPUT, 4, T.powerlevel) - set_pin_data(IC_OUTPUT, 5, round(T.health/T.mob_default_max_health,0.01)*100) + set_pin_data(IC_OUTPUT, 5, T.get_health_percent(0.001)) set_pin_data(IC_OUTPUT, 6, slime_data.descendants?.Copy()) set_pin_data(IC_OUTPUT, 7, T.mutation_chance) set_pin_data(IC_OUTPUT, 8, T.cores) diff --git a/mods/content/xenobiology/mobs/slime_feeding_helpers.dm b/mods/content/xenobiology/mobs/slime_feeding_helpers.dm index 7f7fbcc0146..c335ffdc7ed 100644 --- a/mods/content/xenobiology/mobs/slime_feeding_helpers.dm +++ b/mods/content/xenobiology/mobs/slime_feeding_helpers.dm @@ -72,7 +72,7 @@ var/global/list/slime_pain_messages = list( var/protection = (1 - get_blocked_ratio(null, TOX, damage_flags = DAM_DISPERSED | DAM_BIO)) adjustCloneLoss((attacker.is_adult ? 10 : 5) * protection) adjustToxLoss(1 * protection) - if(health <= 0) + if(current_health <= 0) adjustToxLoss(1 * protection) if(prob(15) && client) handle_additional_slime_effects() diff --git a/mods/content/xenobiology/slime/_slime.dm b/mods/content/xenobiology/slime/_slime.dm index 5fa0d2f79cb..6e6776502cd 100644 --- a/mods/content/xenobiology/slime/_slime.dm +++ b/mods/content/xenobiology/slime/_slime.dm @@ -86,7 +86,7 @@ var/tally = ..() - var/health_deficiency = (get_max_health() - health) + var/health_deficiency = (get_max_health() - current_health) if(health_deficiency >= 30) tally += (health_deficiency / 25) if (bodytemperature < 183.222) @@ -99,7 +99,7 @@ if(reagents.has_reagent(/decl/material/liquid/frostoil)) // Frostoil also makes them move VEEERRYYYYY slow tally *= 5 - if(health <= 0) // if damaged, the slime moves twice as slow + if(current_health <= 0) // if damaged, the slime moves twice as slow tally *= 2 return tally + config.slime_delay @@ -145,7 +145,7 @@ . = ..() statpanel("Status") - stat(null, "Health: [round((health / get_max_health()) * 100)]%") + stat(null, "Health: [get_health_percent()]%") stat(null, "Intent: [a_intent]") if (client.statpanel == "Status") @@ -343,7 +343,7 @@ else if (nutrition < get_hunger_nutrition()) . += "Warning:\tthe slime is hungry." . += "Electric charge strength:\t[powerlevel]" - . += "Health:\t[round((health * 100) / get_max_health())]%" + . += "Health:\t[get_health_percent()]%" var/list/mutations = slime_data.descendants?.Copy() if(!mutations.len) diff --git a/mods/mobs/dionaea/mob/nymph_life.dm b/mods/mobs/dionaea/mob/nymph_life.dm index d39dbadbd3b..fc3424c0685 100644 --- a/mods/mobs/dionaea/mob/nymph_life.dm +++ b/mods/mobs/dionaea/mob/nymph_life.dm @@ -3,7 +3,7 @@ ..() - if(health <= 0 || stat == DEAD) + if(stat == DEAD) return var/turf/checking = get_turf(src) From 545294f62e8261bf252aa04f82a353cfa9221a8f Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 12 Aug 2023 23:07:56 +1000 Subject: [PATCH 05/32] Post-rebase update. --- .../mob/living/simple_animal/hostile/retaliate/exoplanet.dm | 2 +- .../mob/living/simple_animal/hostile/retaliate/giant_crab.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm index 3670af1f6c0..4983755ffee 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm @@ -40,7 +40,7 @@ var/turf/T = get_turf(S) var/obj/item/remains/xeno/X = new(T) X.desc += "These look like they belong to \a [S.name]." - beast.adjust_nutrition(5 * S.maxHealth) + beast.adjust_nutrition(5 * S.get_max_health()) if(prob(5)) S.gib() else diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm index df001934818..3741cbb8e78 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm @@ -37,7 +37,7 @@ /datum/ai/giant_crab/do_process(time_elapsed) . = ..() var/mob/living/simple_animal/hostile/retaliate/giant_crab/crab = body - if((crab.health > crab.maxHealth / 1.5) && length(crab.enemies) && prob(10)) + if((crab.current_health > crab.get_max_health() / 1.5) && length(crab.enemies) && prob(10)) if(crab.victim) crab.release_grab() crab.enemies = list() From 4eada005e6c4aa92334d8c11be117868ba6d5181 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 12 Aug 2023 23:13:34 +1000 Subject: [PATCH 06/32] updatehealth() => update_health() --- code/game/atoms.dm | 2 +- code/game/machinery/mech_recharger.dm | 2 +- code/game/objects/effects/effect_system.dm | 2 +- code/game/objects/items/devices/aicard.dm | 2 +- code/game/objects/items/stacks/medical.dm | 3 +-- code/game/objects/items/stacks/nanopaste.dm | 4 ++-- code/game/objects/items/weapons/defib.dm | 2 +- code/modules/ZAS/Contaminants.dm | 4 ++-- code/modules/assembly/mousetrap.dm | 2 +- code/modules/mechs/mech.dm | 2 +- code/modules/mechs/mech_damage.dm | 2 +- code/modules/mechs/mech_life.dm | 2 +- .../mob/living/carbon/alien/alien_attacks.dm | 2 +- .../mob/living/carbon/alien/alien_damage.dm | 2 +- code/modules/mob/living/carbon/alien/life.dm | 4 ++-- code/modules/mob/living/carbon/brain/life.dm | 10 ++++---- code/modules/mob/living/carbon/carbon.dm | 2 +- .../modules/mob/living/carbon/damage_procs.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 4 +++- .../mob/living/carbon/human/human_damage.dm | 23 +++++++++--------- code/modules/mob/living/carbon/human/life.dm | 2 +- code/modules/mob/living/damage_procs.dm | 4 ++-- code/modules/mob/living/life.dm | 7 ++---- code/modules/mob/living/living.dm | 24 ++++++++++--------- code/modules/mob/living/living_defense.dm | 4 ++-- code/modules/mob/living/living_organs.dm | 4 ++-- .../mob/living/silicon/ai/ai_damage.dm | 2 +- code/modules/mob/living/silicon/ai/life.dm | 2 +- code/modules/mob/living/silicon/pai/life.dm | 2 +- code/modules/mob/living/silicon/pai/pai.dm | 2 +- code/modules/mob/living/silicon/robot/life.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 4 ++-- code/modules/mob/living/silicon/silicon.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 8 +++---- .../programs/research/ai_restorer.dm | 2 +- code/modules/multiz/movement.dm | 2 +- code/modules/organs/external/_external.dm | 2 +- .../organs/external/_external_damage.dm | 6 ++--- .../particle_accelerator/particle.dm | 2 +- mods/content/xenobiology/slime/life.dm | 2 +- 40 files changed, 82 insertions(+), 81 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 73d45a5f65b..52b0ee39a92 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -725,7 +725,7 @@ H.adjustBruteLoss(damage) H.UpdateDamageIcon() - H.updatehealth() + H.update_health() return /// Get the current color of this atom. diff --git a/code/game/machinery/mech_recharger.dm b/code/game/machinery/mech_recharger.dm index 89cf6c82b43..2ddd216370e 100644 --- a/code/game/machinery/mech_recharger.dm +++ b/code/game/machinery/mech_recharger.dm @@ -75,7 +75,7 @@ remaining_energy -= repair * repair_power_usage if(remaining_energy <= 0) break - charging.updatehealth() + charging.update_health() if(fully_repaired()) charging.show_message(SPAN_NOTICE("Exosuit integrity has been fully restored.")) diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 960cb4c0827..a2629cac3e5 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -291,7 +291,7 @@ steam.start() -- spawns the effect R.emote("gasp") spawn (20) R.coughedtime = 0 - R.updatehealth() + R.update_health() return ///////////////////////////////////////////// diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 5cc6bc95120..971d53bcaeb 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -58,7 +58,7 @@ to_chat(carded_ai, "Your core files are being wiped!") while (carded_ai && carded_ai.stat != DEAD) carded_ai.adjustOxyLoss(2) - carded_ai.updatehealth() + carded_ai.update_health() sleep(10) flush = 0 if (href_list["radio"]) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index ebc4aab7307..faca217a80a 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -56,7 +56,7 @@ return 1 H.UpdateDamageIcon() - + H.update_health() else M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2)) @@ -66,7 +66,6 @@ ) use(1) - M.updatehealth() /obj/item/stack/medical/bruise_pack name = "roll of gauze" singular_name = "gauze length" diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index bf8fa4c6dbc..223c39449f3 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -19,7 +19,7 @@ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) R.adjustBruteLoss(-15) R.adjustFireLoss(-15) - R.updatehealth() + R.update_health() use(1) user.visible_message("\The [user] applied some [src] on [R]'s damaged areas.",\ "You apply some [src] at [R]'s damaged areas.") @@ -44,7 +44,7 @@ else if(can_use(1)) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) S.heal_damage(15, 15, robo_repair = 1) - H.updatehealth() + H.update_health() use(1) user.visible_message("\The [user] applies some nanite paste on [user != M ? "[M]'s [S.name]" : "[S]"] with [src].",\ "You apply some nanite paste on [user == M ? "your" : "[M]'s"] [S.name].") diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 19abe1cc01d..d5d0d9e0993 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -442,7 +442,7 @@ M.emote("gasp") SET_STATUS_MAX(M, STAT_WEAK, rand(10,25)) - M.updatehealth() + M.update_health() apply_brain_damage(M, deadtime) /obj/item/shockpaddles/proc/apply_brain_damage(mob/living/carbon/human/H, var/deadtime) diff --git a/code/modules/ZAS/Contaminants.dm b/code/modules/ZAS/Contaminants.dm index 4d99a5c6c09..e428d1c5fb8 100644 --- a/code/modules/ZAS/Contaminants.dm +++ b/code/modules/ZAS/Contaminants.dm @@ -78,9 +78,9 @@ var/global/image/contamination_overlay = image('icons/effects/contamination.dmi' //Burn skin if exposed. if(vsc.contaminant_control.SKIN_BURNS) if(!contaminant_head_protected() || !contaminant_suit_protected()) + if(prob(20)) + to_chat(src, "Your skin burns!") take_overall_damage(0, 0.75) - if(prob(20)) to_chat(src, "Your skin burns!") - updatehealth() //Burn eyes if exposed. if(vsc.contaminant_control.EYE_BURNS) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index af049899f8c..d045c95b4b5 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -42,7 +42,7 @@ SET_STATUS_MAX(H, STAT_STUN, 3) if(affecting) affecting.take_external_damage(1, 0) - H.updatehealth() + H.update_health() else if(ismouse(target)) var/mob/living/simple_animal/mouse/M = target visible_message("SPLAT!") diff --git a/code/modules/mechs/mech.dm b/code/modules/mechs/mech.dm index 02a0acef775..6336f5ab6c3 100644 --- a/code/modules/mechs/mech.dm +++ b/code/modules/mechs/mech.dm @@ -119,7 +119,7 @@ if(source_frame.material) material = source_frame.material - updatehealth() + update_health() // Generate hardpoint list. var/list/component_descriptions diff --git a/code/modules/mechs/mech_damage.dm b/code/modules/mechs/mech_damage.dm index 639b66fa76c..02cf9378df8 100644 --- a/code/modules/mechs/mech_damage.dm +++ b/code/modules/mechs/mech_damage.dm @@ -154,7 +154,7 @@ if((damagetype == BRUTE || damagetype == BURN) && prob(25+(damage*2))) sparks.set_up(3,0,src) sparks.start() - updatehealth() + update_health() return 1 diff --git a/code/modules/mechs/mech_life.dm b/code/modules/mechs/mech_life.dm index 094d542cf7a..8553e7b65c9 100644 --- a/code/modules/mechs/mech_life.dm +++ b/code/modules/mechs/mech_life.dm @@ -35,7 +35,7 @@ if(istype(M) && M.active && M.passive_power_use) M.deactivate() - updatehealth() + update_health() if(emp_damage > 0) emp_damage -= min(1, emp_damage) //Reduce emp accumulation over time diff --git a/code/modules/mob/living/carbon/alien/alien_attacks.dm b/code/modules/mob/living/carbon/alien/alien_attacks.dm index dd556813f6e..3799799892c 100644 --- a/code/modules/mob/living/carbon/alien/alien_attacks.dm +++ b/code/modules/mob/living/carbon/alien/alien_attacks.dm @@ -20,7 +20,7 @@ SET_STATUS_MAX(src, STAT_WEAK, rand(10,15)) user.visible_message(SPAN_DANGER("\The [user] has weakened \the [src]!"), 1, SPAN_WARNING("You hear someone fall."), 2) adjustBruteLoss(damage) - updatehealth() + update_health() else playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message(SPAN_DANGER("\The [user] has attempted to punch \the [src]!"), 1) diff --git a/code/modules/mob/living/carbon/alien/alien_damage.dm b/code/modules/mob/living/carbon/alien/alien_damage.dm index e75135ae6a6..6007be2b6f9 100644 --- a/code/modules/mob/living/carbon/alien/alien_damage.dm +++ b/code/modules/mob/living/carbon/alien/alien_damage.dm @@ -19,4 +19,4 @@ SET_STATUS_MAX(src, STAT_DEAF, 60) adjustBruteLoss(b_loss) adjustFireLoss(f_loss) - updatehealth() + update_health() diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index ccd9e8e41b6..e4741634906 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -18,7 +18,7 @@ adjustOxyLoss(-(rads)) adjustToxLoss(-(rads)) -/mob/living/carbon/alien/updatehealth() +/mob/living/carbon/alien/update_health() . = ..() if(stat == DEAD) blinded = 1 @@ -32,7 +32,7 @@ SET_STATUS_MAX(src, STAT_BLIND, 2) set_status(STAT_SILENCE, 0) else - updatehealth() + update_health() if(stat == DEAD) return 1 diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index 7f3c9213ae5..b24597f5949 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -18,7 +18,7 @@ radiation-- if(prob(25)) adjustToxLoss(1) - updatehealth() + update_health() if(50 to 74) radiation -= 2 @@ -29,12 +29,12 @@ to_chat(src, "You feel weak.") else to_chat(src, "STATUS: DANGEROUS LEVELS OF RADIATION DETECTED.") - updatehealth() + update_health() if(75 to 100) radiation -= 3 adjustToxLoss(3) - updatehealth() + update_health() /mob/living/carbon/brain/handle_environment(datum/gas_mixture/environment) @@ -75,7 +75,7 @@ /mob/living/carbon/brain/should_be_dead() return (!container && (current_health < config.health_threshold_dead || (config.revival_brain_life >= 0 && (world.time - timeofhostdeath) > config.revival_brain_life)) ) -/mob/living/carbon/brain/updatehealth() +/mob/living/carbon/brain/update_health() . = ..() if(stat == DEAD) SET_STATUS_MAX(src, STAT_BLIND, 2) @@ -83,7 +83,7 @@ /mob/living/carbon/brain/handle_regular_status_updates() //TODO: comment out the unused bits >_> - updatehealth() + update_health() if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP return 1 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 5116b4d629a..d7dd5b82c5d 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -61,7 +61,7 @@ var/obj/item/organ/external/organ = GET_EXTERNAL_ORGAN(src, BP_CHEST) if(istype(organ)) organ.take_external_damage(d, 0) - updatehealth() + update_health() else take_organ_damage(d) if(prob(getBruteLoss() - 50)) diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 0329801ad70..574cdc426c4 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -9,5 +9,5 @@ Specifically made to do radiation burns. if(!isSynthetic() && !ignore_rads) damage = 0.25 * damage * (species ? species.get_radiation_mod(src) : 1) adjustFireLoss(damage) - updatehealth() + update_health() return TRUE diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 66efdbc339a..1fc56dbdf90 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -6,12 +6,14 @@ icon_state = "body_m_s" mob_sort_value = 6 dna = new /datum/dna() + mob_default_max_health = 150 var/list/hud_list[10] var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. var/step_count /mob/living/carbon/human/Initialize(mapload, species_name = null, datum/dna/new_dna = null, decl/bodytype/new_bodytype = null) + current_health = mob_default_max_health setup_hud_overlays() var/list/newargs = args.Copy(2) setup(arglist(newargs)) @@ -552,7 +554,7 @@ holder_type = null if(species.holder_type) holder_type = species.holder_type - set_max_health(species.total_health) + set_max_health(species.total_health, skip_health_update = TRUE) // Health update is handled later. remove_extension(src, /datum/extension/armor) if(species.natural_armour_values) set_extension(src, /datum/extension/armor, species.natural_armour_values) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 6d92985f6da..2bee205dd4a 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -2,7 +2,7 @@ return getBrainLoss() //Updates the mob's health from organs and mob damage variables -/mob/living/carbon/human/updatehealth() +/mob/living/carbon/human/update_health() ..() //TODO: fix husking if(stat == DEAD && (get_max_health() - getFireLoss()) < config.health_threshold_dead) @@ -21,7 +21,7 @@ var/obj/item/organ/internal/sponge = GET_INTERNAL_ORGAN(src, BP_BRAIN) if(sponge) sponge.damage = min(max(amount, 0),sponge.species.total_health) - updatehealth() + update_health() /mob/living/carbon/human/getBrainLoss() if(status_flags & GODMODE) return 0 //godmode @@ -243,7 +243,7 @@ var/obj/item/organ/external/picked = pick(parts) if(picked.heal_damage(brute,burn,robo_repair = affect_robo)) BITSET(hud_updateflag, HEALTH_HUD) - updatehealth() + update_health() //TODO reorganize damage procs so that there is a clean API for damaging living mobs @@ -256,11 +256,12 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t //It automatically updates health status /mob/living/carbon/human/take_organ_damage(var/brute = 0, var/burn = 0, var/bypass_armour = FALSE, var/override_droplimb) var/list/parts = get_damageable_organs() - if(length(parts)) - var/obj/item/organ/external/picked = pick(parts) - if(picked.take_external_damage(brute, burn, override_droplimb = override_droplimb)) - BITSET(hud_updateflag, HEALTH_HUD) - updatehealth() + if(!length(parts)) + return + var/obj/item/organ/external/picked = pick(parts) + if(picked.take_external_damage(brute, burn, override_droplimb = override_droplimb)) + BITSET(hud_updateflag, HEALTH_HUD) + update_health() //Heal MANY external organs, in random order /mob/living/carbon/human/heal_overall_damage(var/brute, var/burn) @@ -278,7 +279,7 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t burn -= (burn_was-picked.burn_dam) parts -= picked - updatehealth() + update_health() BITSET(hud_updateflag, HEALTH_HUD) // damage MANY external organs, in random order @@ -301,7 +302,7 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t if(burn_avg) apply_damage(damage = burn_avg, damagetype = BURN, damage_flags = dam_flags, used_weapon = used_weapon, silent = TRUE, given_organ = E) - updatehealth() + update_health() BITSET(hud_updateflag, HEALTH_HUD) /* @@ -375,7 +376,7 @@ This function restores all organs. organ.add_genetic_damage(damage) // Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life(). - updatehealth() + update_health() BITSET(hud_updateflag, HEALTH_HUD) return created_wound diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 42e324c1112..46de74bb28e 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -392,7 +392,7 @@ SET_STATUS_MAX(src, STAT_BLIND, 2) set_status(STAT_SILENCE, 0) else //ALIVE. LIGHTS ARE ON - updatehealth() //TODO + update_health() //TODO if(hallucination_power) handle_hallucinations() diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index f3ad31eec72..01b171759ea 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -42,7 +42,7 @@ if(IRRADIATE) apply_radiation(damage) - updatehealth() + update_health() return TRUE @@ -81,7 +81,7 @@ SET_STATUS_MAX(src, STAT_BLURRY, effect * blocked_mult(blocked)) if(DROWSY) SET_STATUS_MAX(src, STAT_DROWSY, effect * blocked_mult(blocked)) - updatehealth() + update_health() return TRUE /mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/agony = 0, var/blocked = 0) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 1185eec50a1..603c2d5fc26 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -132,7 +132,7 @@ if(damage) adjustToxLoss(damage * RADIATION_SPEED_COEFFICIENT) immunity = max(0, immunity - damage * 15 * RADIATION_SPEED_COEFFICIENT) - updatehealth() + update_health() var/list/limbs = get_external_organs() if(!isSynthetic() && LAZYLEN(limbs)) var/obj/item/organ/external/O = pick(limbs) @@ -183,9 +183,6 @@ if(LAZYACCESS(chem_doses, T) <= 0) LAZYREMOVE(chem_doses, T) - if(apply_chemical_effects()) - updatehealth() - return TRUE /mob/living/proc/apply_chemical_effects() @@ -254,7 +251,7 @@ //This updates the health and status of the mob (conscious, unconscious, dead) /mob/living/proc/handle_regular_status_updates() - updatehealth() + update_health() if(stat != DEAD) if(HAS_STATUS(src, STAT_PARA)) set_stat(UNCONSCIOUS) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 0b30a4c0873..77b1b1b57c0 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -189,7 +189,7 @@ default behaviour is: var/current_max_health = get_max_health() if (current_health < (current_max_health/2)) // Health below half of maxhealth. adjustBrainLoss(current_max_health * 2) // Deal 2x health in BrainLoss damage, as before but variable. - updatehealth() + update_health() to_chat(src, SPAN_NOTICE("You have given up life and succumbed to death.")) /mob/living/proc/update_body(var/update_icons=1) @@ -202,7 +202,7 @@ default behaviour is: /mob/living/proc/get_total_life_damage() return (getOxyLoss()+getToxLoss()+getFireLoss()+getBruteLoss()+getCloneLoss()+getHalLoss()) -/mob/living/proc/updatehealth() +/mob/living/proc/update_health() if(status_flags & GODMODE) current_health = get_max_health() set_stat(CONSCIOUS) @@ -315,9 +315,10 @@ default behaviour is: /mob/living/proc/get_max_health() return mob_default_max_health -/mob/living/proc/set_max_health(var/val) +/mob/living/proc/set_max_health(var/val, var/skip_health_update = FALSE) mob_default_max_health = val - updatehealth() + if(!skip_health_update) + update_health() // ++++ROCKDTBEN++++ MOB PROCS //END @@ -367,27 +368,28 @@ default behaviour is: /mob/living/proc/heal_organ_damage(var/brute, var/burn, var/affect_robo = FALSE) adjustBruteLoss(-brute) adjustFireLoss(-burn) - src.updatehealth() + update_health() // damage ONE external organ, organ gets randomly selected from damaged ones. /mob/living/proc/take_organ_damage(var/brute = 0, var/burn = 0, var/bypass_armour = FALSE, var/override_droplimb) - if(!(status_flags & GODMODE)) - adjustBruteLoss(brute) - adjustFireLoss(burn) - updatehealth() + if(status_flags & GODMODE) + return + adjustBruteLoss(brute) + adjustFireLoss(burn) + update_health() // heal MANY external organs, in random order /mob/living/proc/heal_overall_damage(var/brute, var/burn) adjustBruteLoss(-brute) adjustFireLoss(-burn) - src.updatehealth() + update_health() // damage MANY external organs, in random order /mob/living/proc/take_overall_damage(var/brute, var/burn, var/used_weapon = null) if(status_flags & GODMODE) return 0 //godmode adjustBruteLoss(brute) adjustFireLoss(burn) - src.updatehealth() + update_health() /mob/living/proc/restore_all_organs() return diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index ccffea304b9..aec69b8a1ae 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -222,12 +222,12 @@ if(!damage || !istype(user)) return - adjustBruteLoss(damage) admin_attack_log(user, src, "Attacked", "Was attacked", "attacked") src.visible_message("\The [user] has [attack_message] \the [src]!") + adjustBruteLoss(damage) + update_health() user.do_attack_animation(src) - spawn(1) updatehealth() return 1 /mob/living/proc/IgniteMob() diff --git a/code/modules/mob/living/living_organs.dm b/code/modules/mob/living/living_organs.dm index 7ab280144bf..03e8c7a051d 100644 --- a/code/modules/mob/living/living_organs.dm +++ b/code/modules/mob/living/living_organs.dm @@ -26,7 +26,7 @@ //Only run install effects if we're not detached and we're not adding in place if(!in_place && !(O.status & ORGAN_CUT_AWAY)) on_gained_organ(O) - updatehealth() + update_health() return TRUE //Can be called when the organ is detached or attached. @@ -41,7 +41,7 @@ if(client) client.screen -= O - updatehealth() + update_health() if(drop_organ) var/drop_loc = get_turf(src) diff --git a/code/modules/mob/living/silicon/ai/ai_damage.dm b/code/modules/mob/living/silicon/ai/ai_damage.dm index c8ee676b451..2ba325c9929 100644 --- a/code/modules/mob/living/silicon/ai/ai_damage.dm +++ b/code/modules/mob/living/silicon/ai/ai_damage.dm @@ -42,7 +42,7 @@ return oxyloss = max(0, amount) -/mob/living/silicon/ai/updatehealth() +/mob/living/silicon/ai/update_health() ..() if(status_flags & GODMODE) setOxyLoss(0) diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index b92261e8a0f..148acf19236 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -9,7 +9,7 @@ src.cameraFollow = null src.reset_view(null) - src.updatehealth() + update_health() if ((get_health_percent() <= 0) || (backup_capacitor() <= 0)) death() diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index 919bf4214d0..e5e7228f25a 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -28,4 +28,4 @@ to_chat(src, SPAN_NOTICE("Communication circuit reinitialized. Speech and messaging functionality restored.")) handle_status_effects() - updatehealth() + update_health() diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 21b5ae7c12a..0c34cc7ab78 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -267,7 +267,7 @@ var/global/list/possible_say_verbs = list( if(W.force) visible_message(SPAN_DANGER("[user] attacks [src] with [W]!")) adjustBruteLoss(W.force) - updatehealth() + update_health() else visible_message(SPAN_WARNING("[user] bonks [src] harmlessly with [W].")) diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index bcb16663e7b..dfe6b9a17e7 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -71,7 +71,7 @@ return current_health < config.health_threshold_dead /mob/living/silicon/robot/handle_regular_status_updates() - updatehealth() + update_health() if(HAS_STATUS(src, STAT_ASLEEP)) SET_STATUS_MAX(src, STAT_PARA, 3) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 4f519db28b5..035dd67a924 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -496,7 +496,7 @@ if (WT.weld(0)) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) adjustBruteLoss(-30) - updatehealth() + update_health() add_fingerprint(user) user.visible_message(SPAN_NOTICE("\The [user] has fixed some of the dents on \the [src]!")) else @@ -511,7 +511,7 @@ if (coil.use(1)) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) adjustFireLoss(-30) - updatehealth() + update_health() user.visible_message(SPAN_NOTICE("\The [user] has fixed some of the burnt wires on \the [src]!")) else if(IS_CROWBAR(W) && user.a_intent != I_HURT) // crowbar means open or close the cover - we all know what a crowbar is by now diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index e9d4687bfb1..3a59ef03c8c 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -149,7 +149,7 @@ adjustFireLoss(Proj.damage) Proj.on_hit(src,100) //wow this is a terrible hack - updatehealth() + update_health() return 100 /mob/living/silicon/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index cf6f43afe92..807f2d16428 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -465,19 +465,19 @@ var/global/list/simplemob_icon_bitflag_cache = list() /mob/living/simple_animal/adjustBruteLoss(damage) ..() - updatehealth() + update_health() /mob/living/simple_animal/adjustFireLoss(damage) ..() - updatehealth() + update_health() /mob/living/simple_animal/adjustToxLoss(damage) ..() - updatehealth() + update_health() /mob/living/simple_animal/adjustOxyLoss(damage) ..() - updatehealth() + update_health() /mob/living/simple_animal/proc/SA_attackable(target_mob) if (isliving(target_mob)) diff --git a/code/modules/modular_computers/file_system/programs/research/ai_restorer.dm b/code/modules/modular_computers/file_system/programs/research/ai_restorer.dm index 66c50e35139..17c53f630e9 100644 --- a/code/modules/modular_computers/file_system/programs/research/ai_restorer.dm +++ b/code/modules/modular_computers/file_system/programs/research/ai_restorer.dm @@ -69,7 +69,7 @@ A.adjustFireLoss(-4) A.adjustBruteLoss(-4) A.adjustOxyLoss(-4) - A.updatehealth() + A.update_health() // If the AI is dead, revive it. if (A.stat == DEAD && !A.should_be_dead()) A.set_stat(CONSCIOUS) diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index 146964fe469..0588c1acd8d 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -283,7 +283,7 @@ var/obj/item/organ/external/victim = pick(victims) victim.dislocate() to_chat(src, "You feel a sickening pop as your [victim.joint] is wrenched out of the socket.") - updatehealth() + update_health() /mob/living/carbon/human/proc/climb_up(atom/A) if(!isturf(loc) || !bound_overlay || bound_overlay.destruction_timer || is_physically_disabled()) // This destruction_timer check ideally wouldn't be required, but I'm not awake enough to refactor this to not need it. diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index be32e3bd704..ce66a48ab09 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -601,7 +601,7 @@ This function completely restores a damaged organ to perfect condition. . = ..() // Clear damage, reapply aspects. if(owner) - owner.updatehealth() + owner.update_health() //#TODO: Rejuvination hacks should probably be removed /obj/item/organ/external/remove_rejuv() diff --git a/code/modules/organs/external/_external_damage.dm b/code/modules/organs/external/_external_damage.dm index 60b8d217b62..50b9237b69c 100644 --- a/code/modules/organs/external/_external_damage.dm +++ b/code/modules/organs/external/_external_damage.dm @@ -48,7 +48,7 @@ burn = max(burn - spillover, 0) //If limb took enough damage, try to cut or tear it off if(owner && loc == owner) - owner.updatehealth() //droplimb will call updatehealth() again if it does end up being called + owner.update_health() //droplimb will call update_health() again if it does end up being called if((limb_flags & ORGAN_FLAG_CAN_AMPUTATE) && config.limbs_can_break) var/total_damage = brute_dam + burn_dam + brute + burn + spillover var/threshold = max_damage * config.organ_health_multiplier @@ -113,7 +113,7 @@ // sync the organ's damage with its wounds update_damages() - owner.updatehealth() + owner.update_health() if(status & ORGAN_BLEEDING) owner.update_bandages() @@ -193,7 +193,7 @@ //Sync the organ's damage with its wounds src.update_damages() - owner.updatehealth() + owner.update_health() return update_damstate() diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm index 3d922b263b2..9fe7ce275c7 100644 --- a/code/modules/power/singularity/particle_accelerator/particle.dm +++ b/code/modules/power/singularity/particle_accelerator/particle.dm @@ -63,7 +63,7 @@ /obj/effect/accelerated_particle/proc/toxmob(var/mob/living/M) var/radiation = (energy*2) M.apply_damage((radiation*3),IRRADIATE, damage_flags = DAM_DISPERSED) - M.updatehealth() + M.update_health() /obj/effect/accelerated_particle/proc/move(var/lag) set waitfor = FALSE diff --git a/mods/content/xenobiology/slime/life.dm b/mods/content/xenobiology/slime/life.dm index e5c1449089a..38128127f84 100644 --- a/mods/content/xenobiology/slime/life.dm +++ b/mods/content/xenobiology/slime/life.dm @@ -24,7 +24,7 @@ death() else if(bodytemperature <= hurt_temperature) adjustToxLoss(30) - updatehealth() + update_health() /mob/living/slime/proc/adjust_body_temperature(current, loc_temp, boost) var/delta = abs(current-loc_temp) From dead6e4ded05462c641f86e4bd64677ca0b1e4b2 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 12 Aug 2023 23:40:47 +1000 Subject: [PATCH 07/32] Adding update health skips to human organ init. --- code/modules/mob/living/carbon/carbon_organs.dm | 4 ++-- code/modules/mob/living/carbon/human/human_organs.dm | 4 ++-- code/modules/mob/living/living_organs.dm | 10 ++++++---- code/modules/species/species_bodytype.dm | 9 +++++---- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/code/modules/mob/living/carbon/carbon_organs.dm b/code/modules/mob/living/carbon/carbon_organs.dm index 9e3bcd0efdb..4fd1c5d27c1 100644 --- a/code/modules/mob/living/carbon/carbon_organs.dm +++ b/code/modules/mob/living/carbon/carbon_organs.dm @@ -26,7 +26,7 @@ internal_organs = null external_organs = null -/mob/living/carbon/add_organ(obj/item/organ/O, obj/item/organ/external/affected, in_place, update_icon, detached) +/mob/living/carbon/add_organ(obj/item/organ/O, obj/item/organ/external/affected, in_place, update_icon, detached, skip_health_update = FALSE) var/obj/item/organ/existing = LAZYACCESS(organs_by_tag, O.organ_tag) if(existing && O != existing) CRASH("mob/living/carbon/add_organ(): '[O]' tried to overwrite [src]'s existing organ '[existing]' in slot '[O.organ_tag]'!") @@ -43,7 +43,7 @@ LAZYDISTINCTADD(external_organs, O) . = ..() -/mob/living/carbon/remove_organ(var/obj/item/organ/O, var/drop_organ = TRUE, var/detach = TRUE, var/ignore_children = FALSE, var/in_place = FALSE, var/update_icon = TRUE) +/mob/living/carbon/remove_organ(var/obj/item/organ/O, var/drop_organ = TRUE, var/detach = TRUE, var/ignore_children = FALSE, var/in_place = FALSE, var/update_icon = TRUE, var/skip_health_update = FALSE) if(istype(O) && !in_place && O.is_vital_to_owner() && usr) admin_attack_log(usr, src, "Removed a vital organ ([src]).", "Had a vital organ ([src]) removed.", "removed a vital organ ([src]) from") if(!(. = ..())) diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index 6e57fb48c2c..d3c14db5035 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -272,7 +272,7 @@ //Registers an organ and setup the organ hierachy properly. //affected : Parent organ if applicable. //in_place : If true, we're performing an in-place replacement, without triggering anything related to adding the organ in-game as part of surgery or else. -/mob/living/carbon/human/add_organ(obj/item/organ/O, obj/item/organ/external/affected, in_place, update_icon, detached) +/mob/living/carbon/human/add_organ(obj/item/organ/O, obj/item/organ/external/affected, in_place, update_icon, detached, skip_health_update = FALSE) if(!(. = ..())) return if(!O.is_internal()) @@ -293,7 +293,7 @@ //ignore_children: Skips recursively removing this organ's child organs. //in_place : If true we remove only the organ (no children items or implants) and avoid triggering mob changes and parent organs changes as much as possible. // Meant to be used for init and species transforms, without triggering any updates to mob state or anything related to losing a limb as part of surgery or combat. -/mob/living/carbon/human/remove_organ(obj/item/organ/O, drop_organ, detach, ignore_children, in_place, update_icon) +/mob/living/carbon/human/remove_organ(obj/item/organ/O, drop_organ, detach, ignore_children, in_place, update_icon, skip_health_update = FALSE) if(!(. = ..())) return if(!O.is_internal()) diff --git a/code/modules/mob/living/living_organs.dm b/code/modules/mob/living/living_organs.dm index 03e8c7a051d..7881fb555df 100644 --- a/code/modules/mob/living/living_organs.dm +++ b/code/modules/mob/living/living_organs.dm @@ -21,16 +21,17 @@ return LAZYLEN(get_internal_organs()) > 0 //Can be called when we want to add an organ in a detached state or an attached state. -/mob/living/proc/add_organ(var/obj/item/organ/O, var/obj/item/organ/external/affected = null, var/in_place = FALSE, var/update_icon = TRUE, var/detached = FALSE) +/mob/living/proc/add_organ(var/obj/item/organ/O, var/obj/item/organ/external/affected = null, var/in_place = FALSE, var/update_icon = TRUE, var/detached = FALSE, var/skip_health_update = FALSE) . = O.do_install(src, affected, in_place, update_icon, detached) //Only run install effects if we're not detached and we're not adding in place if(!in_place && !(O.status & ORGAN_CUT_AWAY)) on_gained_organ(O) - update_health() + if(!skip_health_update) + update_health() return TRUE //Can be called when the organ is detached or attached. -/mob/living/proc/remove_organ(var/obj/item/organ/O, var/drop_organ = TRUE, var/detach = FALSE, var/ignore_children = FALSE, var/in_place = FALSE, var/update_icon = TRUE) +/mob/living/proc/remove_organ(var/obj/item/organ/O, var/drop_organ = TRUE, var/detach = FALSE, var/ignore_children = FALSE, var/in_place = FALSE, var/update_icon = TRUE, var/skip_health_update = FALSE) //Only run effects if we're not already detached, and we're not doing a in-place removal if(!in_place && !(O.status & ORGAN_CUT_AWAY)) //Gotta check the flag here, because of prosthetics handling detached state differently on_lost_organ(O) @@ -41,7 +42,8 @@ if(client) client.screen -= O - update_health() + if(!skip_health_update) + update_health() if(drop_organ) var/drop_loc = get_turf(src) diff --git a/code/modules/species/species_bodytype.dm b/code/modules/species/species_bodytype.dm index 7bf8be7492a..88dd0bb154c 100644 --- a/code/modules/species/species_bodytype.dm +++ b/code/modules/species/species_bodytype.dm @@ -281,14 +281,14 @@ var/global/list/bodytypes_by_category = list() if(H.has_external_organs()) for(var/obj/item/organ/external/E in H.get_external_organs()) if(!is_default_limb(E)) - H.remove_organ(E, FALSE, FALSE, TRUE, TRUE, FALSE) //Remove them first so we don't trigger removal effects by just calling delete on them + H.remove_organ(E, FALSE, FALSE, TRUE, TRUE, FALSE, skip_health_update = TRUE) //Remove them first so we don't trigger removal effects by just calling delete on them qdel(E) //Clear invalid internal organs if(H.has_internal_organs()) for(var/obj/item/organ/O in H.get_internal_organs()) if(!is_default_organ(O)) - H.remove_organ(O, FALSE, FALSE, TRUE, TRUE, FALSE) //Remove them first so we don't trigger removal effects by just calling delete on them + H.remove_organ(O, FALSE, FALSE, TRUE, TRUE, FALSE, skip_health_update = TRUE) //Remove them first so we don't trigger removal effects by just calling delete on them qdel(O) //Create missing limbs @@ -301,7 +301,7 @@ var/global/list/bodytypes_by_category = list() if(E.parent_organ) var/list/parent_organ_data = has_limbs[E.parent_organ] parent_organ_data["has_children"]++ - H.add_organ(E, GET_EXTERNAL_ORGAN(H, E.parent_organ), FALSE, FALSE) + H.add_organ(E, GET_EXTERNAL_ORGAN(H, E.parent_organ), FALSE, FALSE, skip_health_update = TRUE) //Create missing internal organs for(var/organ_tag in has_organ) @@ -312,7 +312,8 @@ var/global/list/bodytypes_by_category = list() if(organ_tag != O.organ_tag) warning("[O.type] has a default organ tag \"[O.organ_tag]\" that differs from the species' organ tag \"[organ_tag]\". Updating organ_tag to match.") O.organ_tag = organ_tag - H.add_organ(O, GET_EXTERNAL_ORGAN(H, O.parent_organ), FALSE, FALSE) + H.add_organ(O, GET_EXTERNAL_ORGAN(H, O.parent_organ), FALSE, FALSE, skip_health_update = TRUE) + H.update_health() //Checks if an existing organ is the bodytype default /decl/bodytype/proc/is_default_organ(obj/item/organ/internal/O) From 97f814111a7b112668d45522fc9a05a02e558be5 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 12 Aug 2023 23:53:41 +1000 Subject: [PATCH 08/32] Reviewing calls to update_health(). --- code/game/atoms.dm | 25 ++++++------------- code/game/objects/items/stacks/medical.dm | 3 +-- code/modules/mechs/components/_components.dm | 2 +- code/modules/mechs/mech_damage.dm | 2 -- .../mob/living/carbon/human/human_organs.dm | 2 +- .../mob/living/carbon/human/update_icons.dm | 6 ++--- code/modules/mob/living/living.dm | 2 +- code/modules/organs/external/_external.dm | 2 +- .../organs/external/_external_damage.dm | 2 +- 9 files changed, 16 insertions(+), 30 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 52b0ee39a92..858ad15d5a1 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -703,30 +703,19 @@ if(M.lying) return //No spamming this on people. SET_STATUS_MAX(M, STAT_WEAK, 3) - to_chat(M, "You topple as \the [src] moves under you!") - + to_chat(M, SPAN_DANGER("You topple as \the [src] moves under you!")) if(prob(25)) - var/damage = rand(15,30) - var/mob/living/carbon/human/H = M - if(!istype(H)) - to_chat(H, "You land heavily!") + var/obj/item/organ/external/affecting = SAFEPICK(M.get_external_organs()) + if(!affecting) + to_chat(M, SPAN_DANGER("You land heavily!")) M.adjustBruteLoss(damage) - return - - var/obj/item/organ/external/affecting = pick(H.get_external_organs()) - if(affecting) - to_chat(M, "You land heavily on your [affecting.name]!") + M.update_health() + else + to_chat(M, SPAN_DANGER("You land heavily on your [affecting.name]!")) affecting.take_external_damage(damage, 0) if(affecting.parent) affecting.parent.add_autopsy_data("Misadventure", damage) - else - to_chat(H, "You land heavily!") - H.adjustBruteLoss(damage) - - H.UpdateDamageIcon() - H.update_health() - return /// Get the current color of this atom. /atom/proc/get_color() diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index faca217a80a..85873b210f7 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -54,8 +54,7 @@ if(istype(suit)) to_chat(user, SPAN_WARNING("You can't apply [src] through [suit]!")) return 1 - - H.UpdateDamageIcon() + // TODO: readd the actual healing logic that goes here, or check that it's applied in afterattack or something H.update_health() else diff --git a/code/modules/mechs/components/_components.dm b/code/modules/mechs/components/_components.dm index 76866925803..45f9aa8ffb4 100644 --- a/code/modules/mechs/components/_components.dm +++ b/code/modules/mechs/components/_components.dm @@ -55,7 +55,7 @@ user.visible_message(SPAN_NOTICE("\The [user] installs \the [thing] in \the [src].")) return 1 -/obj/item/mech_component/proc/update_health() +/obj/item/mech_component/proc/update_component_health() total_damage = brute_damage + burn_damage if(total_damage > max_damage) total_damage = max_damage var/prev_state = damage_state diff --git a/code/modules/mechs/mech_damage.dm b/code/modules/mechs/mech_damage.dm index 02cf9378df8..575d0801882 100644 --- a/code/modules/mechs/mech_damage.dm +++ b/code/modules/mechs/mech_damage.dm @@ -89,12 +89,10 @@ /mob/living/exosuit/adjustFireLoss(var/amount, var/obj/item/mech_component/MC = pick(list(arms, legs, body, head))) if(MC) MC.take_burn_damage(amount) - MC.update_health() /mob/living/exosuit/adjustBruteLoss(var/amount, var/obj/item/mech_component/MC = pick(list(arms, legs, body, head))) if(MC) MC.take_brute_damage(amount) - MC.update_health() /mob/living/exosuit/proc/zoneToComponent(var/zone) switch(zone) diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index d3c14db5035..2573c969a20 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -283,7 +283,7 @@ update_inhand_overlays(FALSE) update_body(FALSE) update_bandages(FALSE) - UpdateDamageIcon(FALSE) + update_damage_icon(FALSE) hud_reset() queue_icon_update() //Avoids calling icon updates 50 times when adding multiple organs diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index e98e620a571..499ce886ca1 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -65,7 +65,7 @@ There are several things that need to be remembered: > There are also these special cases: update_mutations() //handles updating your appearance for certain mutations. e.g TK head-glows - UpdateDamageIcon() //handles damage overlays for brute/burn damage //(will rename this when I geta round to it) + update_damage_icon() //handles damage overlays for brute/burn damage //(will rename this when I geta round to it) update_body() //Handles updating your mob's icon to reflect their gender/race/complexion etc update_hair() //Handles updating your hair overlay (used to be update_face, but mouth and ...eyes were merged into update_body) @@ -112,7 +112,7 @@ Please contact me on #coderbus IRC. ~Carn x update_fire(FALSE) update_surgery(FALSE) update_bandages(FALSE) - UpdateDamageIcon(FALSE) + update_damage_icon(FALSE) return ..() /mob/living/carbon/human/on_update_icon() @@ -214,7 +214,7 @@ var/global/list/damage_icon_parts = list() //DAMAGE OVERLAYS //constructs damage icon for each organ from mask * damage field and saves it in our overlays_ lists -/mob/living/carbon/human/UpdateDamageIcon(var/update_icons=1) +/mob/living/carbon/human/update_damage_icon(var/update_icons=1) // first check whether something actually changed about damage appearance var/damage_appearance = "" diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 77b1b1b57c0..47d170ed1fb 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -492,7 +492,7 @@ default behaviour is: brain.update_icon() ..(repair_brain) -/mob/living/proc/UpdateDamageIcon() +/mob/living/proc/update_damage_icon() return /mob/living/handle_grabs_after_move(var/turf/old_loc, var/direction) diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index ce66a48ab09..63cc329be88 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -889,7 +889,7 @@ Note that amputating the affected organ does in fact remove the infection from t if(update_surgery) owner.update_surgery() if (update_damstate()) - owner.UpdateDamageIcon(1) + owner.update_damage_icon(TRUE) //Updates brute_damn and burn_damn from wound damages. Updates BLEEDING status. /obj/item/organ/external/proc/update_damages() diff --git a/code/modules/organs/external/_external_damage.dm b/code/modules/organs/external/_external_damage.dm index 50b9237b69c..82a669ce950 100644 --- a/code/modules/organs/external/_external_damage.dm +++ b/code/modules/organs/external/_external_damage.dm @@ -118,7 +118,7 @@ owner.update_bandages() if(owner && update_damstate()) - owner.UpdateDamageIcon() + owner.update_damage_icon() if(created_wound && isobj(used_weapon)) var/obj/O = used_weapon From 1fb2b67d03d5318b5d322366373dc9425f5f2f8d Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 13 Aug 2023 00:27:11 +1000 Subject: [PATCH 09/32] Wrapping update_health() with adjustFooLoss() where possible. --- code/game/atoms.dm | 3 +- code/game/machinery/mech_recharger.dm | 5 ++- code/game/objects/effects/effect_system.dm | 2 - code/game/objects/items/devices/aicard.dm | 3 +- code/game/objects/items/stacks/medical.dm | 3 +- code/game/objects/items/stacks/nanopaste.dm | 4 +- code/game/objects/items/weapons/defib.dm | 1 - .../objects/items/weapons/material/shards.dm | 1 - code/modules/assembly/mousetrap.dm | 2 +- code/modules/mechs/components/_components.dm | 4 +- code/modules/mechs/mech.dm | 2 - code/modules/mechs/mech_damage.dm | 13 +++--- code/modules/mechs/mech_damage_immunity.dm | 8 ++-- code/modules/mechs/mech_life.dm | 2 +- .../mob/living/carbon/alien/alien_attacks.dm | 3 +- .../mob/living/carbon/alien/alien_damage.dm | 3 +- code/modules/mob/living/carbon/alien/life.dm | 9 +--- code/modules/mob/living/carbon/brain/life.dm | 26 +++-------- code/modules/mob/living/carbon/carbon.dm | 1 - .../modules/mob/living/carbon/damage_procs.dm | 3 +- .../mob/living/carbon/human/human_damage.dm | 32 ++++++++----- code/modules/mob/living/carbon/human/life.dm | 2 +- code/modules/mob/living/damage_procs.dm | 14 +++--- code/modules/mob/living/life.dm | 4 +- code/modules/mob/living/living.dm | 45 ++++++++++--------- code/modules/mob/living/living_defense.dm | 3 +- .../mob/living/silicon/ai/ai_damage.dm | 18 +++++--- code/modules/mob/living/silicon/ai/life.dm | 12 +++-- code/modules/mob/living/silicon/pai/life.dm | 2 +- code/modules/mob/living/silicon/pai/pai.dm | 3 +- .../silicon/robot/drone/drone_damage.dm | 10 +++-- .../modules/mob/living/silicon/robot/robot.dm | 6 +-- .../mob/living/silicon/robot/robot_damage.dm | 29 ++++++------ code/modules/mob/living/silicon/silicon.dm | 7 +-- .../living/simple_animal/friendly/possum.dm | 4 +- .../mob/living/simple_animal/hostile/mimic.dm | 4 +- .../hostile/retaliate/retaliate.dm | 4 +- .../mob/living/simple_animal/simple_animal.dm | 20 ++++----- code/modules/multiz/movement.dm | 1 - code/modules/organs/external/_external.dm | 2 +- .../organs/external/_external_damage.dm | 2 +- code/modules/organs/organ.dm | 4 +- .../particle_accelerator/particle.dm | 1 - mods/content/xenobiology/slime/_slime.dm | 8 ++-- mods/content/xenobiology/slime/life.dm | 3 +- 45 files changed, 151 insertions(+), 187 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 858ad15d5a1..13269ecbb7d 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -709,8 +709,7 @@ var/obj/item/organ/external/affecting = SAFEPICK(M.get_external_organs()) if(!affecting) to_chat(M, SPAN_DANGER("You land heavily!")) - M.adjustBruteLoss(damage) - M.update_health() + M.adjustBruteLoss(damage, do_update_health = TRUE) else to_chat(M, SPAN_DANGER("You land heavily on your [affecting.name]!")) affecting.take_external_damage(damage, 0) diff --git a/code/game/machinery/mech_recharger.dm b/code/game/machinery/mech_recharger.dm index 2ddd216370e..bd9e8be6936 100644 --- a/code/game/machinery/mech_recharger.dm +++ b/code/game/machinery/mech_recharger.dm @@ -68,14 +68,17 @@ var/remaining_energy = active_power_usage if(repair && !fully_repaired()) + var/repaired = FALSE for(var/obj/item/mech_component/MC in charging) if(MC) MC.repair_brute_damage(repair) MC.repair_burn_damage(repair) remaining_energy -= repair * repair_power_usage + repaired = TRUE if(remaining_energy <= 0) break - charging.update_health() + if(repaired) + charging.update_health() // TODO: do this during component repair. if(fully_repaired()) charging.show_message(SPAN_NOTICE("Exosuit integrity has been fully restored.")) diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index a2629cac3e5..d8620773efb 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -291,8 +291,6 @@ steam.start() -- spawns the effect R.emote("gasp") spawn (20) R.coughedtime = 0 - R.update_health() - return ///////////////////////////////////////////// // Smoke spread diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 971d53bcaeb..d66875cf4ac 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -57,8 +57,7 @@ flush = 1 to_chat(carded_ai, "Your core files are being wiped!") while (carded_ai && carded_ai.stat != DEAD) - carded_ai.adjustOxyLoss(2) - carded_ai.update_health() + carded_ai.adjustOxyLoss(2, do_update_health = TRUE) sleep(10) flush = 0 if (href_list["radio"]) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 85873b210f7..dba4e398b27 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -54,8 +54,7 @@ if(istype(suit)) to_chat(user, SPAN_WARNING("You can't apply [src] through [suit]!")) return 1 - // TODO: readd the actual healing logic that goes here, or check that it's applied in afterattack or something - H.update_health() + H.update_health() // TODO: readd the actual healing logic that goes here, or check that it's applied in afterattack or something else M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2)) diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index 223c39449f3..7a01f895507 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -18,8 +18,7 @@ if (R.getBruteLoss() || R.getFireLoss() ) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) R.adjustBruteLoss(-15) - R.adjustFireLoss(-15) - R.update_health() + R.adjustFireLoss(-15, do_update_health = TRUE) use(1) user.visible_message("\The [user] applied some [src] on [R]'s damaged areas.",\ "You apply some [src] at [R]'s damaged areas.") @@ -44,7 +43,6 @@ else if(can_use(1)) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) S.heal_damage(15, 15, robo_repair = 1) - H.update_health() use(1) user.visible_message("\The [user] applies some nanite paste on [user != M ? "[M]'s [S.name]" : "[S]"] with [src].",\ "You apply some nanite paste on [user == M ? "your" : "[M]'s"] [S.name].") diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index d5d0d9e0993..8457be4d713 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -442,7 +442,6 @@ M.emote("gasp") SET_STATUS_MAX(M, STAT_WEAK, rand(10,25)) - M.update_health() apply_brain_damage(M, deadtime) /obj/item/shockpaddles/proc/apply_brain_damage(mob/living/carbon/human/H, var/deadtime) diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index ece9cec1069..79cb11faedb 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -120,7 +120,6 @@ continue to_chat(M, SPAN_DANGER("You step on \the [src]!")) affecting.take_external_damage(5, 0) - M.updatehealth() if(affecting.can_feel_pain()) SET_STATUS_MAX(M, STAT_WEAK, 3) return diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index d045c95b4b5..4eda3b4fc35 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -42,7 +42,7 @@ SET_STATUS_MAX(H, STAT_STUN, 3) if(affecting) affecting.take_external_damage(1, 0) - H.update_health() + else if(ismouse(target)) var/mob/living/simple_animal/mouse/M = target visible_message("SPLAT!") diff --git a/code/modules/mechs/components/_components.dm b/code/modules/mechs/components/_components.dm index 45f9aa8ffb4..fa8ae476b26 100644 --- a/code/modules/mechs/components/_components.dm +++ b/code/modules/mechs/components/_components.dm @@ -77,13 +77,13 @@ /obj/item/mech_component/proc/take_brute_damage(var/amt) brute_damage = max(0, brute_damage + amt) - update_health() + update_component_health() if(total_damage == max_damage) take_component_damage(amt,0) /obj/item/mech_component/proc/take_burn_damage(var/amt) burn_damage = max(0, burn_damage + amt) - update_health() + update_component_health() if(total_damage == max_damage) take_component_damage(0,amt) diff --git a/code/modules/mechs/mech.dm b/code/modules/mechs/mech.dm index 6336f5ab6c3..b37409881c8 100644 --- a/code/modules/mechs/mech.dm +++ b/code/modules/mechs/mech.dm @@ -119,8 +119,6 @@ if(source_frame.material) material = source_frame.material - update_health() - // Generate hardpoint list. var/list/component_descriptions for(var/obj/item/mech_component/comp in list(arms, legs, head, body)) diff --git a/code/modules/mechs/mech_damage.dm b/code/modules/mechs/mech_damage.dm index 575d0801882..1e3c2e2a5fa 100644 --- a/code/modules/mechs/mech_damage.dm +++ b/code/modules/mechs/mech_damage.dm @@ -86,13 +86,16 @@ /mob/living/exosuit/get_total_life_damage() return (getFireLoss()+getBruteLoss()) -/mob/living/exosuit/adjustFireLoss(var/amount, var/obj/item/mech_component/MC = pick(list(arms, legs, body, head))) +/mob/living/exosuit/adjustFireLoss(var/amount, var/obj/item/mech_component/MC = pick(list(arms, legs, body, head)), var/do_update_health) if(MC) MC.take_burn_damage(amount) + if(do_update_health) + update_health() // TODO: unify these procs somehow instead of having weird brute-wrapping behavior as the default. -/mob/living/exosuit/adjustBruteLoss(var/amount, var/obj/item/mech_component/MC = pick(list(arms, legs, body, head))) +/mob/living/exosuit/adjustBruteLoss(var/amount, var/obj/item/mech_component/MC = pick(list(arms, legs, body, head)), var/do_update_health) if(MC) MC.take_brute_damage(amount) + ..() /mob/living/exosuit/proc/zoneToComponent(var/zone) switch(zone) @@ -142,9 +145,9 @@ //Only 3 types of damage concern mechs and vehicles switch(damagetype) if(BRUTE) - adjustBruteLoss(damage, target) + adjustBruteLoss(damage, target, do_update_health = TRUE) if(BURN) - adjustFireLoss(damage, target) + adjustFireLoss(damage, target, do_update_health = TRUE) if(IRRADIATE) for(var/mob/living/pilot in pilots) pilot.apply_damage(damage, IRRADIATE, def_zone, damage_flags, used_weapon) @@ -152,8 +155,6 @@ if((damagetype == BRUTE || damagetype == BURN) && prob(25+(damage*2))) sparks.set_up(3,0,src) sparks.start() - update_health() - return 1 /mob/living/exosuit/rad_act(var/severity) diff --git a/code/modules/mechs/mech_damage_immunity.dm b/code/modules/mechs/mech_damage_immunity.dm index 23a69ffd596..6a425c5a07c 100644 --- a/code/modules/mechs/mech_damage_immunity.dm +++ b/code/modules/mechs/mech_damage_immunity.dm @@ -14,7 +14,8 @@ /mob/living/exosuit/setOxyLoss() return 0 -/mob/living/exosuit/adjustOxyLoss() +/mob/living/exosuit/adjustOxyLoss(var/damage, var/do_update_health) + SHOULD_CALL_PARENT(FALSE) return 0 /mob/living/exosuit/getToxLoss() @@ -23,7 +24,7 @@ /mob/living/exosuit/setToxLoss() return 0 -/mob/living/exosuit/adjustToxLoss() +/mob/living/exosuit/adjustToxLoss(var/amount, var/do_update_health) return 0 /mob/living/exosuit/getBrainLoss() @@ -32,7 +33,8 @@ /mob/living/exosuit/setBrainLoss() return 0 -/mob/living/exosuit/adjustBrainLoss() +/mob/living/exosuit/adjustBrainLoss(var/amount, var/do_update_health) + SHOULD_CALL_PARENT(FALSE) return 0 /mob/living/exosuit/getCloneLoss() diff --git a/code/modules/mechs/mech_life.dm b/code/modules/mechs/mech_life.dm index 8553e7b65c9..18975123d54 100644 --- a/code/modules/mechs/mech_life.dm +++ b/code/modules/mechs/mech_life.dm @@ -35,7 +35,7 @@ if(istype(M) && M.active && M.passive_power_use) M.deactivate() - update_health() + update_health() // TODO: move to handle_regular_status_updates(), Life PR if(emp_damage > 0) emp_damage -= min(1, emp_damage) //Reduce emp accumulation over time diff --git a/code/modules/mob/living/carbon/alien/alien_attacks.dm b/code/modules/mob/living/carbon/alien/alien_attacks.dm index 3799799892c..0d8325a5a3b 100644 --- a/code/modules/mob/living/carbon/alien/alien_attacks.dm +++ b/code/modules/mob/living/carbon/alien/alien_attacks.dm @@ -19,8 +19,7 @@ if (damage > 4.9) SET_STATUS_MAX(src, STAT_WEAK, rand(10,15)) user.visible_message(SPAN_DANGER("\The [user] has weakened \the [src]!"), 1, SPAN_WARNING("You hear someone fall."), 2) - adjustBruteLoss(damage) - update_health() + adjustBruteLoss(damage, do_update_health = TRUE) else playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message(SPAN_DANGER("\The [user] has attempted to punch \the [src]!"), 1) diff --git a/code/modules/mob/living/carbon/alien/alien_damage.dm b/code/modules/mob/living/carbon/alien/alien_damage.dm index 6007be2b6f9..5d24ca9b6ca 100644 --- a/code/modules/mob/living/carbon/alien/alien_damage.dm +++ b/code/modules/mob/living/carbon/alien/alien_damage.dm @@ -18,5 +18,4 @@ SET_STATUS_MAX(src, STAT_TINNITUS, 15) SET_STATUS_MAX(src, STAT_DEAF, 60) adjustBruteLoss(b_loss) - adjustFireLoss(f_loss) - update_health() + adjustFireLoss(f_loss, do_update_health = TRUE) diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index e4741634906..0acba869d7d 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -18,24 +18,17 @@ adjustOxyLoss(-(rads)) adjustToxLoss(-(rads)) -/mob/living/carbon/alien/update_health() - . = ..() - if(stat == DEAD) - blinded = 1 - set_status(STAT_SILENCE, 0) - /mob/living/carbon/alien/handle_regular_status_updates() if(status_flags & GODMODE) return 0 + update_health() // TODO: unify with parent call, Life() PR if(stat == DEAD) SET_STATUS_MAX(src, STAT_BLIND, 2) set_status(STAT_SILENCE, 0) else - update_health() if(stat == DEAD) return 1 - if(HAS_STATUS(src, STAT_PARA)) SET_STATUS_MAX(src, STAT_BLIND, 2) set_stat(UNCONSCIOUS) diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index b24597f5949..5d8a346840b 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -17,25 +17,21 @@ if(1 to 49) radiation-- if(prob(25)) - adjustToxLoss(1) - update_health() + adjustToxLoss(1, do_update_health = TRUE) if(50 to 74) radiation -= 2 - adjustToxLoss(1) + adjustToxLoss(1, do_update_health = TRUE) if(prob(5)) radiation -= 5 if(!container) to_chat(src, "You feel weak.") else to_chat(src, "STATUS: DANGEROUS LEVELS OF RADIATION DETECTED.") - update_health() if(75 to 100) radiation -= 3 - adjustToxLoss(3) - update_health() - + adjustToxLoss(3, do_update_health = TRUE) /mob/living/carbon/brain/handle_environment(datum/gas_mixture/environment) ..() @@ -54,16 +50,11 @@ /mob/living/carbon/brain/proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity) if(status_flags & GODMODE) return - if(exposed_temperature > bodytemperature) var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) - //adjustFireLoss(2.5*discomfort) - //adjustFireLoss(5.0*discomfort) adjustFireLoss(20.0*discomfort) - else var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) - //adjustFireLoss(2.5*discomfort) adjustFireLoss(5.0*discomfort) /mob/living/carbon/brain/apply_chemical_effects() @@ -75,15 +66,10 @@ /mob/living/carbon/brain/should_be_dead() return (!container && (current_health < config.health_threshold_dead || (config.revival_brain_life >= 0 && (world.time - timeofhostdeath) > config.revival_brain_life)) ) -/mob/living/carbon/brain/update_health() - . = ..() - if(stat == DEAD) - SET_STATUS_MAX(src, STAT_BLIND, 2) - set_status(STAT_SILENCE, 0) - /mob/living/carbon/brain/handle_regular_status_updates() //TODO: comment out the unused bits >_> - update_health() + update_health() // TODO: unify with parent call, Life() PR + if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP return 1 @@ -98,7 +84,6 @@ emp_damage = 30//Let's not overdo it if(21 to 30)//High level of EMP damage, unable to see, hear, or speak set_status(STAT_BLIND, 1) - blinded = 1 SET_STATUS_MAX(src, STAT_DEAF, 1) set_status(STAT_SILENCE, 1) if(!alert)//Sounds an alarm, but only once per 'level' @@ -109,7 +94,6 @@ emp_damage -= 1 if(20) alert = 0 - blinded = 0 set_status(STAT_BLIND, 0) set_status(STAT_DEAF, 0) set_status(STAT_SILENCE, 0) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index d7dd5b82c5d..84b09cae19c 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -61,7 +61,6 @@ var/obj/item/organ/external/organ = GET_EXTERNAL_ORGAN(src, BP_CHEST) if(istype(organ)) organ.take_external_damage(d, 0) - update_health() else take_organ_damage(d) if(prob(getBruteLoss() - 50)) diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 574cdc426c4..891e8791597 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -8,6 +8,5 @@ Specifically made to do radiation burns. ..() if(!isSynthetic() && !ignore_rads) damage = 0.25 * damage * (species ? species.get_radiation_mod(src) : 1) - adjustFireLoss(damage) - update_health() + adjustFireLoss(damage, do_update_health = TRUE) return TRUE diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 2bee205dd4a..fd3d85ef6d8 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -8,12 +8,12 @@ if(stat == DEAD && (get_max_health() - getFireLoss()) < config.health_threshold_dead) make_husked() -/mob/living/carbon/human/adjustBrainLoss(var/amount) - if(status_flags & GODMODE) return 0 //godmode - if(should_have_organ(BP_BRAIN)) +/mob/living/carbon/human/adjustBrainLoss(var/amount, var/do_update_health) + if(!(status_flags & GODMODE) && should_have_organ(BP_BRAIN)) var/obj/item/organ/internal/sponge = GET_INTERNAL_ORGAN(src, BP_BRAIN) if(sponge) sponge.take_internal_damage(amount) + ..() /mob/living/carbon/human/setBrainLoss(var/amount) if(status_flags & GODMODE) return 0 //godmode @@ -82,14 +82,15 @@ amount += O.burn_dam return amount -/mob/living/carbon/human/adjustBruteLoss(var/amount) +/mob/living/carbon/human/adjustBruteLoss(var/amount, var/do_update_health) + SHOULD_CALL_PARENT(FALSE) // take/heal overall call update_health regardless of arg if(amount > 0) take_overall_damage(amount, 0) else heal_overall_damage(-amount, 0) BITSET(hud_updateflag, HEALTH_HUD) -/mob/living/carbon/human/adjustFireLoss(var/amount) +/mob/living/carbon/human/adjustFireLoss(var/amount, var/do_update_health) if(amount > 0) take_overall_damage(0, amount) else @@ -132,14 +133,15 @@ /mob/living/carbon/human/setOxyLoss(var/amount) adjustOxyLoss(amount - getOxyLoss()) -/mob/living/carbon/human/adjustOxyLoss(var/amount) +/mob/living/carbon/human/adjustOxyLoss(var/damage, var/do_update_health) + . = FALSE if(need_breathe()) var/obj/item/organ/internal/lungs/breathe_organ = get_organ(get_bodytype().breathing_organ, /obj/item/organ/internal/lungs) if(breathe_organ) - breathe_organ.adjust_oxygen_deprivation(amount) + breathe_organ.adjust_oxygen_deprivation(damage) BITSET(hud_updateflag, HEALTH_HUD) - return TRUE - return FALSE + . = TRUE + ..(do_update_health = FALSE) // Oxyloss cannot directly kill humans /mob/living/carbon/human/getToxLoss() if((species.species_flags & SPECIES_FLAG_NO_POISON) || isSynthetic()) @@ -154,7 +156,7 @@ adjustToxLoss(getToxLoss()-amount) // TODO: better internal organ damage procs. -/mob/living/carbon/human/adjustToxLoss(var/amount) +/mob/living/carbon/human/adjustToxLoss(var/amount, var/do_update_health) if((species.species_flags & SPECIES_FLAG_NO_POISON) || isSynthetic()) return @@ -207,6 +209,9 @@ I.take_internal_damage(amount, silent=TRUE) amount = 0 + if(do_update_health) + update_health() + /mob/living/carbon/human/proc/can_autoheal(var/dam_type) if(!species || !dam_type) return FALSE @@ -284,9 +289,12 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t // damage MANY external organs, in random order /mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0, var/used_weapon = null) - if(status_flags & GODMODE) return //godmode + if(status_flags & GODMODE) + return //godmode + var/list/obj/item/organ/external/parts = get_damageable_organs() - if(!parts.len) return + if(!parts.len) + return var/dam_flags = (sharp? DAM_SHARP : 0)|(edge? DAM_EDGE : 0) var/brute_avg = brute / parts.len diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 46de74bb28e..41013741251 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -387,12 +387,12 @@ if(status_flags & GODMODE) return 0 + update_health() // TODO: unify with parent call, Life() PR //SSD check, if a logged player is awake put them back to sleep! if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP SET_STATUS_MAX(src, STAT_BLIND, 2) set_status(STAT_SILENCE, 0) else //ALIVE. LIGHTS ARE ON - update_health() //TODO if(hallucination_power) handle_hallucinations() diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 01b171759ea..c9e0c9064f7 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -24,15 +24,15 @@ switch(damagetype) if(BRUTE) - adjustBruteLoss(damage) + adjustBruteLoss(damage, do_update_health = TRUE) if(BURN) if(MUTATION_COLD_RESISTANCE in mutations) - damage = 0 - adjustFireLoss(damage) + return + adjustFireLoss(damage, do_update_health = TRUE) if(TOX) - adjustToxLoss(damage) + adjustToxLoss(damage, do_update_health = TRUE) if(OXY) - adjustOxyLoss(damage) + adjustOxyLoss(damage, do_update_health = TRUE) if(CLONE) adjustCloneLoss(damage) if(PAIN) @@ -41,8 +41,6 @@ electrocute_act(damage, used_weapon, 1, def_zone) if(IRRADIATE) apply_radiation(damage) - - update_health() return TRUE @@ -64,7 +62,6 @@ /mob/living/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0) if(!effect || (blocked >= 100)) return FALSE - switch(effecttype) if(STUN) SET_STATUS_MAX(src, STAT_STUN, effect * blocked_mult(blocked)) @@ -81,7 +78,6 @@ SET_STATUS_MAX(src, STAT_BLURRY, effect * blocked_mult(blocked)) if(DROWSY) SET_STATUS_MAX(src, STAT_DROWSY, effect * blocked_mult(blocked)) - update_health() return TRUE /mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/agony = 0, var/blocked = 0) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 603c2d5fc26..94913f0d63e 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -130,14 +130,14 @@ damage = FLOOR(damage * (my_species ? my_species.get_radiation_mod(src) : 1)) if(damage) - adjustToxLoss(damage * RADIATION_SPEED_COEFFICIENT) immunity = max(0, immunity - damage * 15 * RADIATION_SPEED_COEFFICIENT) - update_health() + adjustToxLoss(damage * RADIATION_SPEED_COEFFICIENT, do_update_health = TRUE) var/list/limbs = get_external_organs() if(!isSynthetic() && LAZYLEN(limbs)) var/obj/item/organ/external/O = pick(limbs) if(istype(O)) O.add_autopsy_data("Radiation Poisoning", damage) + #undef RADIATION_SPEED_COEFFICIENT // Get valid, unique reagent holders for metabolizing. Avoids metabolizing the same holder twice in a tick. diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 47d170ed1fb..e3b28907289 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -188,8 +188,7 @@ default behaviour is: set hidden = 1 var/current_max_health = get_max_health() if (current_health < (current_max_health/2)) // Health below half of maxhealth. - adjustBrainLoss(current_max_health * 2) // Deal 2x health in BrainLoss damage, as before but variable. - update_health() + adjustBrainLoss(current_max_health * 2, do_update_health = TRUE) // Deal 2x health in BrainLoss damage, as before but variable. to_chat(src, SPAN_NOTICE("You have given up life and succumbed to death.")) /mob/living/proc/update_body(var/update_icons=1) @@ -211,6 +210,8 @@ default behaviour is: current_health = clamp(max_health-get_total_life_damage(), -(max_health), max_health) if(stat != DEAD && should_be_dead()) death() + set_status(STAT_BLIND, 1) + set_status(STAT_SILENCE, 0) //This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually //affects them once clothing is factored in. ~Errorage @@ -247,16 +248,18 @@ default behaviour is: /mob/living/proc/getBruteLoss() return get_max_health() - current_health -/mob/living/proc/adjustBruteLoss(var/amount) - if (status_flags & GODMODE) - return - current_health = clamp(current_health - amount, 0, get_max_health()) +/mob/living/proc/adjustBruteLoss(var/amount, var/do_update_health = FALSE) + SHOULD_CALL_PARENT(TRUE) + if(do_update_health) + update_health() /mob/living/proc/getOxyLoss() return 0 -/mob/living/proc/adjustOxyLoss(var/amount) - return +/mob/living/proc/adjustOxyLoss(var/damage, var/do_update_health) + SHOULD_CALL_PARENT(TRUE) + if(do_update_health) + update_health() /mob/living/proc/setOxyLoss(var/amount) return @@ -264,8 +267,8 @@ default behaviour is: /mob/living/proc/getToxLoss() return 0 -/mob/living/proc/adjustToxLoss(var/amount) - adjustBruteLoss(amount * 0.5) +/mob/living/proc/adjustToxLoss(var/amount, var/do_update_health) + adjustBruteLoss(amount * 0.5, do_update_health) /mob/living/proc/setToxLoss(var/amount) adjustBruteLoss((amount * 0.5)-getBruteLoss()) @@ -273,8 +276,8 @@ default behaviour is: /mob/living/proc/getFireLoss() return -/mob/living/proc/adjustFireLoss(var/amount) - adjustBruteLoss(amount * 0.5) +/mob/living/proc/adjustFireLoss(var/amount, var/do_update_health) + adjustBruteLoss(amount * 0.5, do_update_health) /mob/living/proc/setFireLoss(var/amount) adjustBruteLoss((amount * 0.5)-getBruteLoss()) @@ -291,8 +294,10 @@ default behaviour is: /mob/living/proc/getBrainLoss() return 0 -/mob/living/proc/adjustBrainLoss(var/amount) - return +/mob/living/proc/adjustBrainLoss(var/amount, var/do_update_health) + SHOULD_CALL_PARENT(TRUE) + if(do_update_health) + update_health() /mob/living/proc/setBrainLoss(var/amount) return @@ -367,29 +372,25 @@ default behaviour is: // heal ONE external organ, organ gets randomly selected from damaged ones. /mob/living/proc/heal_organ_damage(var/brute, var/burn, var/affect_robo = FALSE) adjustBruteLoss(-brute) - adjustFireLoss(-burn) - update_health() + adjustFireLoss(-burn, do_update_health = TRUE) // damage ONE external organ, organ gets randomly selected from damaged ones. /mob/living/proc/take_organ_damage(var/brute = 0, var/burn = 0, var/bypass_armour = FALSE, var/override_droplimb) if(status_flags & GODMODE) return adjustBruteLoss(brute) - adjustFireLoss(burn) - update_health() + adjustFireLoss(burn, do_update_health = TRUE) // heal MANY external organs, in random order /mob/living/proc/heal_overall_damage(var/brute, var/burn) adjustBruteLoss(-brute) - adjustFireLoss(-burn) - update_health() + adjustFireLoss(-burn, do_update_health = TRUE) // damage MANY external organs, in random order /mob/living/proc/take_overall_damage(var/brute, var/burn, var/used_weapon = null) if(status_flags & GODMODE) return 0 //godmode adjustBruteLoss(brute) - adjustFireLoss(burn) - update_health() + adjustFireLoss(burn, do_update_health = TRUE) /mob/living/proc/restore_all_organs() return diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index aec69b8a1ae..d2a97866b4a 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -225,8 +225,7 @@ admin_attack_log(user, src, "Attacked", "Was attacked", "attacked") src.visible_message("\The [user] has [attack_message] \the [src]!") - adjustBruteLoss(damage) - update_health() + adjustBruteLoss(damage, do_update_health = TRUE) user.do_attack_animation(src) return 1 diff --git a/code/modules/mob/living/silicon/ai/ai_damage.dm b/code/modules/mob/living/silicon/ai/ai_damage.dm index 2ba325c9929..56a09030033 100644 --- a/code/modules/mob/living/silicon/ai/ai_damage.dm +++ b/code/modules/mob/living/silicon/ai/ai_damage.dm @@ -12,17 +12,21 @@ /mob/living/silicon/ai/getOxyLoss() return oxyloss -/mob/living/silicon/ai/adjustFireLoss(var/amount) +/mob/living/silicon/ai/adjustFireLoss(var/amount, var/do_update_health) if(status_flags & GODMODE) return fireloss = max(0, fireloss + min(amount, current_health)) + if(do_update_health) + update_health() -/mob/living/silicon/ai/adjustBruteLoss(var/amount) - if(status_flags & GODMODE) return - bruteloss = max(0, bruteloss + min(amount, current_health)) +/mob/living/silicon/ai/adjustBruteLoss(var/amount, var/do_update_health) + if(!(status_flags & GODMODE)) + bruteloss = max(0, bruteloss + min(amount, current_health)) + ..() -/mob/living/silicon/ai/adjustOxyLoss(var/amount) - if(status_flags & GODMODE) return - oxyloss = max(0, oxyloss + min(amount, get_max_health() - oxyloss)) +/mob/living/silicon/ai/adjustOxyLoss(var/damage, var/do_update_health) + if(!(status_flags & GODMODE)) + oxyloss = max(0, oxyloss + min(damage, get_max_health() - oxyloss)) + ..() /mob/living/silicon/ai/setBruteLoss(var/amount) if(status_flags & GODMODE) diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 148acf19236..faa97d12108 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -1,18 +1,16 @@ +/mob/living/silicon/ai/should_be_dead() + return get_health_percent() <= 0 || backup_capacitor() <= 0 + /mob/living/silicon/ai/Life() SHOULD_CALL_PARENT(FALSE) - if (src.stat == DEAD) - return - if (src.stat!=CONSCIOUS) src.cameraFollow = null src.reset_view(null) - update_health() - - if ((get_health_percent() <= 0) || (backup_capacitor() <= 0)) - death() + update_health() // TODO: move to handle_regular_status_updates() and preserve parent call chain, Life() PR + if(stat == DEAD) return // If our powersupply object was destroyed somehow, create new one. diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index e5e7228f25a..b6ed6962fff 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -2,6 +2,7 @@ SHOULD_CALL_PARENT(FALSE) + update_health() if (src.stat == DEAD) return @@ -28,4 +29,3 @@ to_chat(src, SPAN_NOTICE("Communication circuit reinitialized. Speech and messaging functionality restored.")) handle_status_effects() - update_health() diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 0c34cc7ab78..1b11042be78 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -266,8 +266,7 @@ var/global/list/possible_say_verbs = list( return if(W.force) visible_message(SPAN_DANGER("[user] attacks [src] with [W]!")) - adjustBruteLoss(W.force) - update_health() + adjustBruteLoss(W.force, do_update_health = TRUE) else visible_message(SPAN_WARNING("[user] bonks [src] harmlessly with [W].")) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_damage.dm b/code/modules/mob/living/silicon/robot/drone/drone_damage.dm index db105871c13..42a5aa0ab3c 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_damage.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_damage.dm @@ -6,14 +6,16 @@ /mob/living/silicon/robot/drone/take_overall_damage(var/brute = 0, var/burn = 0, var/sharp = 0, var/used_weapon = null) bruteloss += brute fireloss += burn + update_health() /mob/living/silicon/robot/drone/heal_overall_damage(var/brute, var/burn) - bruteloss -= brute fireloss -= burn - - if(bruteloss<0) bruteloss = 0 - if(fireloss<0) fireloss = 0 + if(bruteloss<0) + bruteloss = 0 + if(fireloss<0) + fireloss = 0 + update_health() /mob/living/silicon/robot/drone/take_organ_damage(var/brute = 0, var/burn = 0, var/bypass_armour = FALSE, var/override_droplimb) take_overall_damage(brute, burn) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 035dd67a924..fa159234fb4 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -495,8 +495,7 @@ var/obj/item/weldingtool/WT = W if (WT.weld(0)) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - adjustBruteLoss(-30) - update_health() + adjustBruteLoss(-30, do_update_health = TRUE) add_fingerprint(user) user.visible_message(SPAN_NOTICE("\The [user] has fixed some of the dents on \the [src]!")) else @@ -510,8 +509,7 @@ var/obj/item/stack/cable_coil/coil = W if (coil.use(1)) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - adjustFireLoss(-30) - update_health() + adjustFireLoss(-30, do_update_health = TRUE) user.visible_message(SPAN_NOTICE("\The [user] has fixed some of the burnt wires on \the [src]!")) else if(IS_CROWBAR(W) && user.a_intent != I_HURT) // crowbar means open or close the cover - we all know what a crowbar is by now diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm index 75302fb5060..d437c93a981 100644 --- a/code/modules/mob/living/silicon/robot/robot_damage.dm +++ b/code/modules/mob/living/silicon/robot/robot_damage.dm @@ -12,13 +12,14 @@ if(C.installed != 0) amount += C.electronics_damage return amount -/mob/living/silicon/robot/adjustBruteLoss(var/amount) +/mob/living/silicon/robot/adjustBruteLoss(var/amount, var/do_update_health) + SHOULD_CALL_PARENT(FALSE) // take/heal overall call update_health regardless of arg if(amount > 0) take_overall_damage(amount, 0) else heal_overall_damage(-amount, 0) -/mob/living/silicon/robot/adjustFireLoss(var/amount) +/mob/living/silicon/robot/adjustFireLoss(var/amount, var/do_update_health) if(amount > 0) take_overall_damage(0, amount) else @@ -125,20 +126,16 @@ var/datum/robot_component/armour/A = get_armour() if(A) A.take_damage(brute,burn,sharp) - return - - while(parts.len && (brute>0 || burn>0) ) - var/datum/robot_component/picked = pick(parts) - - var/brute_was = picked.brute_damage - var/burn_was = picked.electronics_damage - - picked.take_damage(brute,burn) - - brute -= (picked.brute_damage - brute_was) - burn -= (picked.electronics_damage - burn_was) - - parts -= picked + else + while(parts.len && (brute>0 || burn>0) ) + var/datum/robot_component/picked = pick(parts) + var/brute_was = picked.brute_damage + var/burn_was = picked.electronics_damage + picked.take_damage(brute,burn) + brute -= (picked.brute_damage - brute_was) + burn -= (picked.electronics_damage - burn_was) + parts -= picked + update_health() /mob/living/silicon/robot/emp_act(severity) uneq_all() diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 3a59ef03c8c..dc21bf90052 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -140,16 +140,13 @@ return /mob/living/silicon/bullet_act(var/obj/item/projectile/Proj) - if(!Proj.nodamage) switch(Proj.damage_type) if(BRUTE) - adjustBruteLoss(Proj.damage) + adjustBruteLoss(Proj.damage, do_update_health = TRUE) if(BURN) - adjustFireLoss(Proj.damage) - + adjustFireLoss(Proj.damage, do_update_health = TRUE) Proj.on_hit(src,100) //wow this is a terrible hack - update_health() return 100 /mob/living/silicon/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0) diff --git a/code/modules/mob/living/simple_animal/friendly/possum.dm b/code/modules/mob/living/simple_animal/friendly/possum.dm index 081598232e3..8ecba81bd37 100644 --- a/code/modules/mob/living/simple_animal/friendly/possum.dm +++ b/code/modules/mob/living/simple_animal/friendly/possum.dm @@ -47,12 +47,12 @@ if(prob(10)) poss.is_angry = TRUE -/mob/living/simple_animal/opossum/adjustBruteLoss(damage) +/mob/living/simple_animal/opossum/adjustBruteLoss(damage, do_update_health = FALSE) . = ..() if(damage >= 3) respond_to_damage() -/mob/living/simple_animal/opossum/adjustFireLoss(damage) +/mob/living/simple_animal/opossum/adjustFireLoss(damage, do_update_health) . = ..() if(damage >= 3) respond_to_damage() diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 5e35499302f..7f4a5c37e0e 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -151,9 +151,9 @@ var/global/list/protected_objects = list(/obj/machinery, src.visible_message("\The [src] starts to move!") awake = 1 -/mob/living/simple_animal/hostile/mimic/sleeping/adjustBruteLoss(var/damage) - trigger() +/mob/living/simple_animal/hostile/mimic/sleeping/adjustBruteLoss(var/damage, var/do_update_health = FALSE) ..(damage) + trigger() /mob/living/simple_animal/hostile/mimic/sleeping/attack_hand() trigger() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm index 4c0ea689fc7..706053d576b 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm @@ -42,8 +42,8 @@ H.enemies |= enemies return 0 -/mob/living/simple_animal/hostile/retaliate/adjustBruteLoss(var/damage) - ..(damage) +/mob/living/simple_animal/hostile/retaliate/adjustBruteLoss(var/damage, var/do_update_health = FALSE) + ..() Retaliate() /mob/living/simple_animal/hostile/retaliate/buckle_mob(mob/living/M) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 807f2d16428..92e1fbb9a89 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -463,21 +463,17 @@ var/global/list/simplemob_icon_bitflag_cache = list() damage = 30 apply_damage(damage, BRUTE, damage_flags = DAM_EXPLODE) -/mob/living/simple_animal/adjustBruteLoss(damage) - ..() - update_health() +/mob/living/simple_animal/adjustBruteLoss(damage, do_update_health) + ..(damage, do_update_health = TRUE) -/mob/living/simple_animal/adjustFireLoss(damage) - ..() - update_health() +/mob/living/simple_animal/adjustFireLoss(damage, do_update_health) + ..(damage, do_update_health = TRUE) -/mob/living/simple_animal/adjustToxLoss(damage) - ..() - update_health() +/mob/living/simple_animal/adjustToxLoss(damage, do_update_health) + ..(damage, do_update_health = TRUE) -/mob/living/simple_animal/adjustOxyLoss(damage) - ..() - update_health() +/mob/living/simple_animal/adjustOxyLoss(damage, do_update_health) + ..(damage, do_update_health = TRUE) /mob/living/simple_animal/proc/SA_attackable(target_mob) if (isliving(target_mob)) diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index 0588c1acd8d..440cc530bd1 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -283,7 +283,6 @@ var/obj/item/organ/external/victim = pick(victims) victim.dislocate() to_chat(src, "You feel a sickening pop as your [victim.joint] is wrenched out of the socket.") - update_health() /mob/living/carbon/human/proc/climb_up(atom/A) if(!isturf(loc) || !bound_overlay || bound_overlay.destruction_timer || is_physically_disabled()) // This destruction_timer check ideally wouldn't be required, but I'm not awake enough to refactor this to not need it. diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index 63cc329be88..3093ebd9253 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -416,7 +416,7 @@ return owner.verbs -= /mob/living/carbon/human/proc/undislocate -/obj/item/organ/external/update_health() +/obj/item/organ/external/update_organ_health() damage = min(max_damage, (brute_dam + burn_dam)) return diff --git a/code/modules/organs/external/_external_damage.dm b/code/modules/organs/external/_external_damage.dm index 82a669ce950..32dab6dae8b 100644 --- a/code/modules/organs/external/_external_damage.dm +++ b/code/modules/organs/external/_external_damage.dm @@ -192,7 +192,7 @@ status &= ~ORGAN_BROKEN //Sync the organ's damage with its wounds - src.update_damages() + update_damages() owner.update_health() return update_damstate() diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index e620be9b5bc..f08cbbbd2a0 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -54,7 +54,7 @@ /obj/item/organ/attack_self(var/mob/user) return (owner && loc == owner && owner == user) -/obj/item/organ/proc/update_health() +/obj/item/organ/proc/update_organ_health() return /obj/item/organ/proc/is_broken() @@ -361,6 +361,8 @@ /obj/item/organ/proc/heal_damage(amount) if(can_recover()) damage = clamp(0, damage - round(amount, 0.1), max_damage) + if(owner) + owner.update_health() /obj/item/organ/attack(var/mob/target, var/mob/user) if(BP_IS_PROSTHETIC(src) || !istype(target) || !istype(user) || (user != target && user.a_intent == I_HELP)) diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm index 9fe7ce275c7..dc88c1bb9c8 100644 --- a/code/modules/power/singularity/particle_accelerator/particle.dm +++ b/code/modules/power/singularity/particle_accelerator/particle.dm @@ -63,7 +63,6 @@ /obj/effect/accelerated_particle/proc/toxmob(var/mob/living/M) var/radiation = (energy*2) M.apply_damage((radiation*3),IRRADIATE, damage_flags = DAM_DISPERSED) - M.update_health() /obj/effect/accelerated_particle/proc/move(var/lag) set waitfor = FALSE diff --git a/mods/content/xenobiology/slime/_slime.dm b/mods/content/xenobiology/slime/_slime.dm index 6e6776502cd..f38215b8f03 100644 --- a/mods/content/xenobiology/slime/_slime.dm +++ b/mods/content/xenobiology/slime/_slime.dm @@ -49,8 +49,10 @@ /mob/living/slime/get_digestion_product() return /decl/material/liquid/slimejelly -/mob/living/slime/adjustToxLoss(var/amount) +/mob/living/slime/adjustToxLoss(var/amount, var/do_update_health) toxloss = clamp(toxloss + amount, 0, get_max_health()) + if(do_update_health) + update_health() /mob/living/slime/setToxLoss(var/amount) adjustToxLoss(amount-getToxLoss()) @@ -158,8 +160,8 @@ stat(null,"Power Level: [powerlevel]") -/mob/living/slime/adjustFireLoss(amount) - ..(-abs(amount)) // Heals them +/mob/living/slime/adjustFireLoss(amount, do_update_health) + ..(-abs(amount), do_update_health) // Heals them /mob/living/slime/bullet_act(var/obj/item/projectile/Proj) var/datum/ai/slime/slime_ai = ai diff --git a/mods/content/xenobiology/slime/life.dm b/mods/content/xenobiology/slime/life.dm index 38128127f84..b50a2227157 100644 --- a/mods/content/xenobiology/slime/life.dm +++ b/mods/content/xenobiology/slime/life.dm @@ -23,8 +23,7 @@ adjustToxLoss(200) death() else if(bodytemperature <= hurt_temperature) - adjustToxLoss(30) - update_health() + adjustToxLoss(30, do_update_health = TRUE) /mob/living/slime/proc/adjust_body_temperature(current, loc_temp, boost) var/delta = abs(current-loc_temp) From 4b05e1abaa3bee66c6596d2c75f6f5434103c38d Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 23 Aug 2023 17:10:22 +1000 Subject: [PATCH 10/32] Removing hivebot telebeacon and preventing drones from sparking in qdel. --- .../living/simple_animal/hostile/hivebot.dm | 56 ------------------- .../simple_animal/hostile/retaliate/drone.dm | 19 ++----- 2 files changed, 4 insertions(+), 71 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 6481b37d927..6e43652a81b 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -50,62 +50,6 @@ qdel(src) return -/* -Teleporter beacon, and its subtypes -*/ -/mob/living/simple_animal/hostile/hivebot/tele // _why is this a mob_ - name = "beacon" - desc = "Some odd beacon thing." - icon = 'icons/obj/structures/hivebot_props.dmi' - icon_state = "def_radar-off" - mob_default_max_health = 200 - status_flags = 0 - anchored = TRUE - stop_automated_movement = 1 - - var/bot_type = /mob/living/simple_animal/hostile/hivebot - var/bot_amt = 10 - var/spawn_delay = 100 - var/spawn_time = 0 - -/mob/living/simple_animal/hostile/hivebot/tele/Initialize() - . = ..() - var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() - smoke.set_up(5, 0, src.loc) - smoke.start() - visible_message("\The [src] warps in!") - playsound(src.loc, 'sound/effects/EMPulse.ogg', 25, 1) - -/mob/living/simple_animal/hostile/hivebot/tele/proc/warpbots() - while(bot_amt > 0 && bot_type) - bot_amt-- - var/mob/M = new bot_type(get_turf(src)) - M.faction = faction - playsound(src.loc, 'sound/effects/teleport.ogg', 50, 1) - qdel(src) - return - -/mob/living/simple_animal/hostile/hivebot/tele/FindTarget() - if(..() && !spawn_time) - spawn_time = world.time + spawn_delay - visible_message("\The [src] turns on!") - icon_state = "def_radar" - return null - -/mob/living/simple_animal/hostile/hivebot/tele/Life() - . = ..() - if(. && spawn_time && spawn_time <= world.time) - warpbots() - -/mob/living/simple_animal/hostile/hivebot/tele/strong - bot_type = /mob/living/simple_animal/hostile/hivebot/strong - -/mob/living/simple_animal/hostile/hivebot/tele/range - bot_type = /mob/living/simple_animal/hostile/hivebot/range - -/mob/living/simple_animal/hostile/hivebot/tele/rapid - bot_type = /mob/living/simple_animal/hostile/hivebot/rapid - /* Special projectiles */ diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index 8c899267508..1231bdb994c 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -171,14 +171,16 @@ /mob/living/simple_animal/hostile/retaliate/malf_drone/death() ..(null,"suddenly breaks apart.", "You have been destroyed.") - qdel(src) + physically_destroyed() /mob/living/simple_animal/hostile/retaliate/malf_drone/Destroy() QDEL_NULL(ion_trail) + return ..() + +/mob/living/simple_animal/hostile/retaliate/malf_drone/physically_destroyed(skip_qdel) //some random debris left behind if(has_loot) spark_at(src, cardinal_only = TRUE) - var/atom/movable/M for(var/mat in debris) for(var/chance in list(100, 75, 50, 25)) @@ -187,10 +189,8 @@ M = SSmaterials.create_object(mat, loc, 1, debris[mat]) if(istype(M)) step_to(M, get_turf(pick(view(7, src)))) - //also drop dummy circuit boards deconstructable for research (loot) var/obj/item/stock_parts/circuitboard/C - //spawn 1-4 boards of a random type var/spawnees = 0 var/num_boards = rand(1,4) @@ -199,57 +199,46 @@ var/chosen = pick(options) options.Remove(options.Find(chosen)) spawnees |= chosen - if(spawnees & 1) C = new(src.loc) C.SetName("Drone CPU motherboard") C.origin_tech = "{'[TECH_DATA]':[rand(3, 6)]}" - if(spawnees & 2) C = new(src.loc) C.SetName("Drone neural interface") C.origin_tech = "{'[TECH_BIO]':[rand(3, 6)]}" - if(spawnees & 4) C = new(src.loc) C.SetName("Drone suspension processor") C.origin_tech = "{'[TECH_MAGNET]':[rand(3, 6)]}" - if(spawnees & 8) C = new(src.loc) C.SetName("Drone shielding controller") C.origin_tech = "{'wormholes':[rand(3, 6)]}" - if(spawnees & 16) C = new(src.loc) C.SetName("Drone power capacitor") C.origin_tech = "{'[TECH_POWER]':[rand(3, 6)]}" - if(spawnees & 32) C = new(src.loc) C.SetName("Drone hull reinforcer") C.origin_tech = "{'[TECH_MATERIAL]':[rand(3, 6)]}" - if(spawnees & 64) C = new(src.loc) C.SetName("Drone auto-repair system") C.origin_tech = "{'[TECH_ENGINEERING]':[rand(3, 6)]}" - if(spawnees & 128) C = new(src.loc) C.SetName("Drone antigravity overcharge counter") C.origin_tech = "{'[TECH_EXOTIC_MATTER]':[rand(3, 6)]}" - if(spawnees & 256) C = new(src.loc) C.SetName("Drone targetting circuitboard") C.origin_tech = "{'[TECH_COMBAT]':[rand(3, 6)]}" - if(spawnees & 512) C = new(src.loc) C.SetName("Corrupted drone morality core") C.origin_tech = "{'[TECH_ESOTERIC]':[rand(3, 6)]}" - return ..() /obj/item/projectile/beam/drone From 6b6aa24a691b008c755b1ff62349dca011b9de2e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 30 Aug 2023 22:35:48 +1000 Subject: [PATCH 11/32] Fixing runtimes in /mob/living creation/qdel. --- code/modules/mechs/mech_interaction.dm | 2 +- code/modules/mob/death.dm | 2 ++ code/modules/mob/living/deity/deity_items.dm | 16 +++++++++------- code/modules/mob/living/deity/deity_phenomena.dm | 15 +++++++++------ code/modules/mob/living/deity/menu/deity_nano.dm | 5 +++-- code/modules/mob/living/living.dm | 5 +++-- code/modules/mob/living/silicon/pai/pai.dm | 12 +++++++----- code/modules/mob/living/silicon/pai/software.dm | 4 ---- .../mob/living/simple_animal/hostile/vagrant.dm | 12 ++++++------ 9 files changed, 40 insertions(+), 33 deletions(-) diff --git a/code/modules/mechs/mech_interaction.dm b/code/modules/mechs/mech_interaction.dm index 2268f62713d..85e19c45302 100644 --- a/code/modules/mechs/mech_interaction.dm +++ b/code/modules/mechs/mech_interaction.dm @@ -81,7 +81,7 @@ if(!hatch_closed) return max(shared_living_nano_distance(src_object), .) //Either visible to mech(outside) or visible to user (inside) -/mob/living/exosuit/exosuit/CanUseTopic(mob/user, datum/topic_state/state, href_list) +/mob/living/exosuit/CanUseTopic(mob/user, datum/topic_state/state, href_list) if(user in pilots) return STATUS_INTERACTIVE return ..() diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index 35f46d326c7..e3d6ca61dcb 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -1,7 +1,9 @@ //This is the proc for gibbing a mob. Cannot gib ghosts. //added different sort of gibs and animations. N /mob/proc/gib(anim="gibbed-m",do_gibs) + set waitfor = FALSE + death(1) ADD_TRANSFORMATION_MOVEMENT_HANDLER(src) icon = null diff --git a/code/modules/mob/living/deity/deity_items.dm b/code/modules/mob/living/deity/deity_items.dm index 9245a8dbbd0..967d973e0a4 100644 --- a/code/modules/mob/living/deity/deity_items.dm +++ b/code/modules/mob/living/deity/deity_items.dm @@ -34,11 +34,13 @@ /mob/living/deity/Destroy() - for(var/cat in items_by_category) - var/list/L = items_by_category[cat] - L.Cut() - items_by_category.Cut() - for(var/i in items) - qdel(items[i]) - items.Cut() + if(islist(items_by_category)) + for(var/cat in items_by_category) + var/list/L = items_by_category[cat] + L.Cut() + items_by_category.Cut() + if(islist(items)) + for(var/i in items) + qdel(items[i]) + items.Cut() . = ..() \ No newline at end of file diff --git a/code/modules/mob/living/deity/deity_phenomena.dm b/code/modules/mob/living/deity/deity_phenomena.dm index 02533e6186c..694435da2d5 100644 --- a/code/modules/mob/living/deity/deity_phenomena.dm +++ b/code/modules/mob/living/deity/deity_phenomena.dm @@ -18,8 +18,9 @@ /mob/living/deity/proc/silence(var/amount) if(!silenced) to_chat(src, "You've been silenced! Your phenomenas are disabled!") - var/obj/screen/intent/deity/SD = hud_used.action_intent - SD.color = "#ff0000" + var/obj/screen/intent/deity/SD = hud_used?.action_intent + if(istype(SD)) + SD.color = "#ff0000" silenced += amount for(var/phenom in phenomenas) //Also make it so that you don't do cooldowns. var/datum/phenomena/P = phenomenas[phenom] @@ -33,8 +34,9 @@ silenced-- if(!silenced) to_chat(src, "You are no longer silenced.") - var/obj/screen/intent/deity/SD = hud_used.action_intent - SD.color = null + var/obj/screen/intent/deity/SD = hud_used?.action_intent + if(istype(SD)) + SD.color = null if(power_per_regen < 0 || power < power_min) adjust_power(power_per_regen) @@ -67,8 +69,9 @@ for(var/mod in intent_list) if(intent_list[mod] == P) intent_list[mod] = null - var/obj/screen/intent/deity/SD = hud_used.action_intent - SD.update_text() + var/obj/screen/intent/deity/SD = hud_used?.action_intent + if(istype(SD)) + SD.update_text() update_phenomenas() update_phenomena_bindings() if(selected == to_remove) diff --git a/code/modules/mob/living/deity/menu/deity_nano.dm b/code/modules/mob/living/deity/menu/deity_nano.dm index 63053cac5ed..046276fcffe 100644 --- a/code/modules/mob/living/deity/menu/deity_nano.dm +++ b/code/modules/mob/living/deity/menu/deity_nano.dm @@ -76,5 +76,6 @@ phenomena_bindings[++phenomena_bindings.len] = list("intent" = intent, "intent_data" = intent_data) nano_data["bindings"] = phenomena_bindings //Update the hud as well. - var/obj/screen/intent/deity/SD = hud_used.action_intent - SD.update_text() \ No newline at end of file + var/obj/screen/intent/deity/SD = hud_used?.action_intent + if(istype(SD)) + SD.update_text() \ No newline at end of file diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index e3b28907289..1ac0e80cd5a 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -210,8 +210,9 @@ default behaviour is: current_health = clamp(max_health-get_total_life_damage(), -(max_health), max_health) if(stat != DEAD && should_be_dead()) death() - set_status(STAT_BLIND, 1) - set_status(STAT_SILENCE, 0) + if(!QDELETED(src)) // death() may delete or remove us + set_status(STAT_BLIND, 1) + set_status(STAT_SILENCE, 0) //This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually //affects them once clothing is factored in. ~Errorage diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 1b11042be78..e84d57e0ee2 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -84,7 +84,12 @@ var/global/list/possible_say_verbs = list( set_extension(src, /datum/extension/base_icon_state, icon_state) status_flags |= NO_ANTAG - card = loc + if(!card && istype(loc, /obj/item/paicard)) + card = loc + if(istype(card)) + if(!card.radio) + card.radio = new /obj/item/radio(card) + silicon_radio = card.radio //As a human made device, we'll understand sol common without the need of the translator add_language(/decl/language/human/common, 1) @@ -93,10 +98,7 @@ var/global/list/possible_say_verbs = list( . = ..() - if(card) - if(!card.radio) - card.radio = new /obj/item/radio(card) - silicon_radio = card.radio + software = default_pai_software.Copy() /mob/living/silicon/pai/Destroy() card = null diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index d55cb711c2b..065ad42833a 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -33,10 +33,6 @@ var/global/list/default_pai_software = list() default_pai_software[P.id] = P return r -/mob/living/silicon/pai/Initialize() - . = ..() - software = default_pai_software.Copy() - /mob/living/silicon/pai/proc/paiInterface() ui_interact(src) diff --git a/code/modules/mob/living/simple_animal/hostile/vagrant.dm b/code/modules/mob/living/simple_animal/hostile/vagrant.dm index 5db615bff84..fc6a43e1380 100644 --- a/code/modules/mob/living/simple_animal/hostile/vagrant.dm +++ b/code/modules/mob/living/simple_animal/hostile/vagrant.dm @@ -17,14 +17,14 @@ max_gas = null minbodytemp = 0 gene_damage = -1 + pass_flags = PASS_FLAG_TABLE + bleed_colour = "#aad9de" + nutrition = 100 var/cloaked = 0 var/mob/living/carbon/human/gripping = null var/blood_per_tick = 3 var/health_per_tick = 0.8 - pass_flags = PASS_FLAG_TABLE - - bleed_colour = "#aad9de" /mob/living/simple_animal/hostile/vagrant/Process_Spacemove() return 1 @@ -39,7 +39,7 @@ /mob/living/simple_animal/hostile/vagrant/death(gibbed) . = ..() - if(. && !gibbed) + if(stat == DEAD && !QDELETED(src) && !gibbed) gib() /mob/living/simple_animal/hostile/vagrant/Life() @@ -66,11 +66,11 @@ if(stance == HOSTILE_STANCE_IDLE && !cloaked) cloaked = 1 update_icon() - if(current_health >= get_max_health()) + + if(get_nutrition() > get_max_nutrition()) new/mob/living/simple_animal/hostile/vagrant(src.loc) new/mob/living/simple_animal/hostile/vagrant(src.loc) gib() - return /mob/living/simple_animal/hostile/vagrant/on_update_icon() ..() From 9623a75a452b925f32c94436c41aac2a05ce4cc1 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 1 Jul 2023 23:37:08 +1000 Subject: [PATCH 12/32] Splitting up borer Life() proc. --- mods/mobs/borers/mob/borer/borer.dm | 69 ++++++++++++++--------------- 1 file changed, 33 insertions(+), 36 deletions(-) diff --git a/mods/mobs/borers/mob/borer/borer.dm b/mods/mobs/borers/mob/borer/borer.dm index dc3ff9d818b..82b016cca48 100644 --- a/mods/mobs/borers/mob/borer/borer.dm +++ b/mods/mobs/borers/mob/borer/borer.dm @@ -81,7 +81,7 @@ /mob/living/simple_animal/borer/proc/set_borer_name() truename = "[borer_names[min(generation, borer_names.len)]] [random_id("borer[generation]", 1000, 9999)]" -/mob/living/simple_animal/borer/Life() +/mob/living/simple_animal/borer/handle_regular_status_updates() sdisabilities = 0 if(host) @@ -95,49 +95,46 @@ set_status(STAT_BLIND, 0) set_status(STAT_BLURRY, 0) - . = ..() - if(!.) - return FALSE - - if(host) + ..() + if(!host || stat || host.stat) + return - if(!stat && !host.stat) - - if(host.reagents.has_reagent(/decl/material/liquid/nutriment/sugar)) - if(!docile) - if(controlling) - to_chat(host, SPAN_NOTICE("You feel the soporific flow of sugar in your host's blood, lulling you into docility.")) - else - to_chat(src, SPAN_NOTICE("You feel the soporific flow of sugar in your host's blood, lulling you into docility.")) - docile = 1 + if(host.reagents.has_reagent(/decl/material/liquid/nutriment/sugar)) + if(!docile) + if(controlling) + to_chat(host, SPAN_NOTICE("You feel the soporific flow of sugar in your host's blood, lulling you into docility.")) else - if(docile) - if(controlling) - to_chat(host, SPAN_NOTICE("You shake off your lethargy as the sugar leaves your host's blood.")) - else - to_chat(src, SPAN_NOTICE("You shake off your lethargy as the sugar leaves your host's blood.")) - docile = 0 + to_chat(src, SPAN_NOTICE("You feel the soporific flow of sugar in your host's blood, lulling you into docility.")) + docile = 1 + else + if(docile) + if(controlling) + to_chat(host, SPAN_NOTICE("You shake off your lethargy as the sugar leaves your host's blood.")) + else + to_chat(src, SPAN_NOTICE("You shake off your lethargy as the sugar leaves your host's blood.")) + docile = 0 - if(chemicals < 250 && host.nutrition >= (neutered ? 200 : 50)) - host.nutrition-- - chemicals++ + if(chemicals < 250 && host.nutrition >= (neutered ? 200 : 50)) + host.nutrition-- + chemicals++ - if(controlling) + if(!controlling) + return - if(neutered) - host.release_control() - return + if(neutered) + host.release_control() + return - if(docile) - to_chat(host, SPAN_NOTICE("You are feeling far too docile to continue controlling your host...")) - host.release_control() - return + if(docile) + to_chat(host, SPAN_NOTICE("You are feeling far too docile to continue controlling your host...")) + host.release_control() + return - if(prob(5)) - host.adjustBrainLoss(0.1) + if(prob(5)) + host.adjustBrainLoss(0.1) - if(prob(host.getBrainLoss()/20)) - INVOKE_ASYNC(host, /mob/proc/say, "*[pick(list("blink","blink_r","choke","aflap","drool","twitch","twitch_v","gasp"))]") + if(prob(host.getBrainLoss()/20)) + INVOKE_ASYNC(host, /mob/proc/say, "*[pick(list("blink","blink_r","choke","aflap","drool","twitch","twitch_v","gasp"))]") /mob/living/simple_animal/borer/Stat() . = ..() From f725f563798815121a454cfc8f41cc8e80ed1774 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 1 Jul 2023 23:37:18 +1000 Subject: [PATCH 13/32] Splitting up Ascent nymph Life() proc. --- mods/species/ascent/mobs/nymph/nymph_life.dm | 44 +++++++++----------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/mods/species/ascent/mobs/nymph/nymph_life.dm b/mods/species/ascent/mobs/nymph/nymph_life.dm index 3eba226e5b5..a94c443b54c 100644 --- a/mods/species/ascent/mobs/nymph/nymph_life.dm +++ b/mods/species/ascent/mobs/nymph/nymph_life.dm @@ -1,9 +1,26 @@ -/mob/living/carbon/alien/ascent_nymph/Life() +/mob/living/carbon/alien/ascent_nymph/handle_regular_hud_updates() . = ..() - if(stat == DEAD) + var/datum/hud/ascent_nymph/nymph_hud = hud_used + if(!istype(nymph_hud)) return + if(nymph_hud.food) + switch(nutrition) + if(450 to INFINITY) nymph_hud.food.icon_state = "nutrition0" + if(350 to 450) nymph_hud.food.icon_state = "nutrition1" + if(250 to 350) nymph_hud.food.icon_state = "nutrition2" + if(150 to 250) nymph_hud.food.icon_state = "nutrition3" + else nymph_hud.food.icon_state = "nutrition4" + if(nymph_hud.drink) + switch(hydration) + if(450 to INFINITY) nymph_hud.drink.icon_state = "hydration0" + if(350 to 450) nymph_hud.drink.icon_state = "hydration1" + if(250 to 350) nymph_hud.drink.icon_state = "hydration2" + if(150 to 250) nymph_hud.drink.icon_state = "hydration3" + else nymph_hud.drink.icon_state = "hydration4" +/mob/living/carbon/alien/ascent_nymph/handle_nutrition_and_hydration() + . = ..() // Generate some crystals over time. if(nutrition >= 300 && crystal_reserve < ANYMPH_MAX_CRYSTALS) crystal_reserve = min(ANYMPH_MAX_CRYSTALS, crystal_reserve + 15) @@ -16,32 +33,9 @@ adjust_nutrition(DEFAULT_HUNGER_FACTOR * -2) else adjust_nutrition(DEFAULT_HUNGER_FACTOR * -1) - if(hydration > 0) adjust_hydration(DEFAULT_THIRST_FACTOR * -1) - update_nymph_hud() - -/mob/living/carbon/alien/ascent_nymph/proc/update_nymph_hud() - // Update the HUD. - var/datum/hud/ascent_nymph/nymph_hud = hud_used - if(istype(nymph_hud)) - if(nymph_hud.food) - switch(nutrition) - if(450 to INFINITY) nymph_hud.food.icon_state = "nutrition0" - if(350 to 450) nymph_hud.food.icon_state = "nutrition1" - if(250 to 350) nymph_hud.food.icon_state = "nutrition2" - if(150 to 250) nymph_hud.food.icon_state = "nutrition3" - else nymph_hud.food.icon_state = "nutrition4" - - if(nymph_hud.drink) - switch(hydration) - if(450 to INFINITY) nymph_hud.drink.icon_state = "hydration0" - if(350 to 450) nymph_hud.drink.icon_state = "hydration1" - if(250 to 350) nymph_hud.drink.icon_state = "hydration2" - if(150 to 250) nymph_hud.drink.icon_state = "hydration3" - else nymph_hud.drink.icon_state = "hydration4" - /mob/living/carbon/alien/ascent_nymph/Stat() . = ..() if(client && statpanel("Status")) From f5472248b4d164f4b70efd343823c00efd4d9b17 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 2 Jul 2023 21:11:09 +1000 Subject: [PATCH 14/32] Removing construct Life() overrides. --- .../simple_animal/constructs/constructs.dm | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/living/simple_animal/constructs/constructs.dm b/code/modules/mob/living/simple_animal/constructs/constructs.dm index 51a5df0a53f..3c66cf86b2e 100644 --- a/code/modules/mob/living/simple_animal/constructs/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs/constructs.dm @@ -248,15 +248,19 @@ force = 25 ////////////////HUD////////////////////// +/mob/living/simple_animal/construct/handle_regular_status_updates() + . = ..() + if(.) + silence_spells(purge) -/mob/living/simple_animal/construct/Life() +/mob/living/simple_animal/construct/handle_regular_hud_updates() . = ..() if(.) if(fire) fire.icon_state = "fire[!!fire_alert]" silence_spells(purge) -/mob/living/simple_animal/construct/armoured/Life() +/mob/living/simple_animal/construct/armoured/handle_regular_hud_updates() . = ..() if(healths) switch(current_health) @@ -270,7 +274,7 @@ else healths.icon_state = "juggernaut_health7" -/mob/living/simple_animal/construct/behemoth/Life() +/mob/living/simple_animal/construct/behemoth/handle_regular_hud_updates() . = ..() if(healths) switch(current_health) @@ -283,7 +287,7 @@ if(1 to 124) healths.icon_state = "juggernaut_health6" else healths.icon_state = "juggernaut_health7" -/mob/living/simple_animal/construct/builder/Life() +/mob/living/simple_animal/construct/builder/handle_regular_hud_updates() . = ..() if(healths) switch(current_health) @@ -298,7 +302,7 @@ -/mob/living/simple_animal/construct/wraith/Life() +/mob/living/simple_animal/construct/wraith/handle_regular_hud_updates() . = ..() if(healths) switch(current_health) @@ -312,7 +316,7 @@ else healths.icon_state = "wraith_health7" -/mob/living/simple_animal/construct/harvester/Life() +/mob/living/simple_animal/construct/harvester/handle_regular_hud_updates() . = ..() if(healths) switch(current_health) From da63fed9ec93c34a77dedfe93daa08939f8ab464 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 2 Jul 2023 21:12:28 +1000 Subject: [PATCH 15/32] Collapsed deity life proc. --- code/modules/mob/living/deity/deity_phenomena.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/deity/deity_phenomena.dm b/code/modules/mob/living/deity/deity_phenomena.dm index 694435da2d5..b4c93bea647 100644 --- a/code/modules/mob/living/deity/deity_phenomena.dm +++ b/code/modules/mob/living/deity/deity_phenomena.dm @@ -27,7 +27,7 @@ if(P.refresh_time) P.refresh_time += amount -/mob/living/deity/Life() +/mob/living/deity/handle_regular_status_updates() . = ..() if(.) if(silenced > 0) From 038439397dddc7de26513ff8840acddd4abee755 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 2 Jul 2023 21:21:54 +1000 Subject: [PATCH 16/32] Collapsing other Life() overrides. --- .../mob/living/simple_animal/friendly/farm_animals.dm | 3 +-- .../simple_animal/hostile/retaliate/king_of_goats.dm | 3 +-- code/modules/mob/observer/eye/freelook/life.dm | 4 ++-- code/modules/mob/observer/ghost/ghost.dm | 7 ++++--- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 3334703a4e8..b60559c35bc 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -28,10 +28,9 @@ expected_type = /mob/living/simple_animal/hostile/retaliate/goat /datum/ai/goat/do_process(time_elapsed) - . = ..() - var/mob/living/simple_animal/hostile/retaliate/goat/goat = body //chance to go crazy and start wacking stuff + var/mob/living/simple_animal/hostile/retaliate/goat/goat = body if(!length(goat.enemies) && prob(1)) goat.Retaliate() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm index 23f304d1ad1..37ef546464e 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm @@ -190,14 +190,13 @@ set_scale(1.25) default_pixel_y = 10 -/mob/living/simple_animal/hostile/retaliate/goat/king/phase2/Life() +/mob/living/simple_animal/hostile/retaliate/goat/king/phase2/handle_regular_status_updates() . = ..() if(!.) return FALSE if(special_attacks >= 6 && current_damtype != BRUTE) visible_message(SPAN_MFAUNA("The energy surrounding \the [src]'s horns dissipates.")) current_damtype = BRUTE - if(current_health <= 150 && !phase3 && spellscast == 5) //begin phase 3, reset spell limit and heal phase3_transition() diff --git a/code/modules/mob/observer/eye/freelook/life.dm b/code/modules/mob/observer/eye/freelook/life.dm index 98b9c477e1f..6a8a6975fd7 100644 --- a/code/modules/mob/observer/eye/freelook/life.dm +++ b/code/modules/mob/observer/eye/freelook/life.dm @@ -1,7 +1,7 @@ /mob/observer/eye/freelook/Life() - ..() + . = ..() // If we lost our client, reset the list of visible chunks so they update properly on return - if(owner == src && !client) + if(. && owner == src && !client) visibleChunks.Cut() /*else if(owner && !owner.client) visibleChunks.Cut()*/ diff --git a/code/modules/mob/observer/ghost/ghost.dm b/code/modules/mob/observer/ghost/ghost.dm index a8a3766c85a..5772b4ca058 100644 --- a/code/modules/mob/observer/ghost/ghost.dm +++ b/code/modules/mob/observer/ghost/ghost.dm @@ -108,9 +108,10 @@ Works together with spawning an observer, noted above. */ /mob/observer/ghost/Life() - ..() - if(!loc) return - if(!client) return 0 + + . = ..() + if(!. || !loc || !client) + return FALSE handle_hud_glasses() From 6384fed9c4fc7ea7e5335001987ac70262d45ed7 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 2 Jul 2023 21:31:49 +1000 Subject: [PATCH 17/32] Tweaking robot life() overrides. --- .../mob/living/silicon/robot/flying/flying.dm | 2 +- .../hostile/commanded/nanomachines.dm | 28 ++++++++++++------- .../simple_animal/hostile/retaliate/drone.dm | 6 ++-- .../modules/mob/living/simple_animal/shade.dm | 14 +++------- 4 files changed, 26 insertions(+), 24 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/flying/flying.dm b/code/modules/mob/living/silicon/robot/flying/flying.dm index b242c869bb7..dbd40ea19a0 100644 --- a/code/modules/mob/living/silicon/robot/flying/flying.dm +++ b/code/modules/mob/living/silicon/robot/flying/flying.dm @@ -21,7 +21,7 @@ components["comms"] = new/datum/robot_component/binary_communication(src) components["armour"] = new/datum/robot_component/armour/light(src) -/mob/living/silicon/robot/flying/Life() +/mob/living/silicon/robot/flying/handle_regular_status_updates() . = ..() if(incapacitated() || !is_component_functioning("actuator")) stop_flying() diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm index 8e96b1dcb7e..9a9fa706cf0 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm @@ -14,6 +14,7 @@ response_help_3p = "$USER$ waves $USER_HIS$ hand through $TARGET$." response_harm = "agitates" response_disarm = "fans at" + ai = /datum/ai/nanomachines var/regen_time = 0 var/emergency_protocols = 0 @@ -24,20 +25,27 @@ force = 2 sharp = TRUE -/mob/living/simple_animal/hostile/commanded/nanomachine/Life() +/datum/ai/nanomachines + expected_type = /mob/living/simple_animal/hostile/commanded/nanomachine + +/datum/ai/nanomachines/do_process(time_elapsed) + . = ..() + var/mob/living/simple_animal/hostile/commanded/nanomachine/swarm = body + switch(swarm.stance) + if(COMMANDED_HEAL) + if(!swarm.target_mob) + swarm.target_mob = swarm.FindTarget(COMMANDED_HEAL) + if(swarm.target_mob) + swarm.move_to_heal() + if(COMMANDED_HEALING) + swarm.heal() + +/mob/living/simple_animal/hostile/commanded/nanomachine/handle_regular_status_updates() + . = ..() regen_time++ if(regen_time == 2 && current_health < get_max_health()) //slow regen regen_time = 0 heal_overall_damage(1) - . = ..() - if(.) - switch(stance) - if(COMMANDED_HEAL) - if(!target_mob) - target_mob = FindTarget(COMMANDED_HEAL) - move_to_heal() - if(COMMANDED_HEALING) - heal() /mob/living/simple_animal/hostile/commanded/nanomachine/death(gibbed, deathmessage, show_dead_message) ..(null, "dissipates into thin air", "You have been destroyed.") diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index 1231bdb994c..94eddd8b291 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -85,8 +85,8 @@ . -= M //self repair systems have a chance to bring the drone back to life -/mob/living/simple_animal/hostile/retaliate/malf_drone/Life() - +/mob/living/simple_animal/hostile/retaliate/malf_drone/handle_regular_status_updates() + . = ..() //emps and lots of damage can temporarily shut us down if(disabled > 0) set_stat(UNCONSCIOUS) @@ -148,7 +148,7 @@ if(!disabled && exploding) explosion(get_turf(src), 0, 1, 4, 7) death() - ..() + update_icon() /mob/living/simple_animal/hostile/retaliate/malf_drone/on_update_icon() diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index badc97a032b..282982406c5 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -42,13 +42,7 @@ /mob/living/simple_animal/shade/on_defilement() return -/mob/living/simple_animal/shade/Life() - . = ..() - OnDeathInLife() - -/mob/living/simple_animal/shade/proc/OnDeathInLife() - if(stat == DEAD) - new /obj/item/ectoplasm (src.loc) - visible_message(SPAN_WARNING("\The [src] lets out a contented sigh as their form unwinds.")) - ghostize() - qdel(src) +/mob/living/simple_animal/shade/death(gibbed, deathmessage, show_dead_message) + new /obj/item/ectoplasm (src.loc) + ..(deathmessage = "lets out a contented sigh as their form unwinds", show_dead_message = "You have been released from your earthly binds.") + qdel(src) From 261f335df4b52e82f575a66e84cc15b1997046c0 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 2 Jul 2023 21:43:33 +1000 Subject: [PATCH 18/32] Collapsing more life overrides. --- code/modules/mob/living/bot/bot.dm | 18 ++++++++++-------- code/modules/mob/living/carbon/alien/life.dm | 12 +----------- code/modules/mob/living/carbon/life.dm | 4 ---- .../simple_animal/constructs/constructs.dm | 2 +- .../simple_animal/friendly/farm_animals.dm | 19 ++++++++----------- .../living/simple_animal/hostile/antlion.dm | 9 ++------- .../living/simple_animal/hostile/hivebot.dm | 7 ++----- .../living/simple_animal/hostile/hostile.dm | 2 +- .../mob/living/simple_animal/hostile/leech.dm | 14 ++++++-------- .../mob/living/simple_animal/hostile/slug.dm | 2 +- .../living/simple_animal/hostile/vagrant.dm | 2 +- 11 files changed, 33 insertions(+), 58 deletions(-) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index d872acf804d..eaf9b903f65 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -60,16 +60,18 @@ turn_off() /mob/living/bot/Life() - ..() - if(stat == DEAD) - return - set_status(STAT_WEAK, 0) - set_status(STAT_STUN, 0) - set_status(STAT_PARA, 0) - - if(on && !client && !busy) + . = ..() + if(stat != DEAD && on && !client && !busy) handleAI() +/mob/living/bot/handle_regular_status_updates() + . = ..() + if(stat == DEAD) + else + set_status(STAT_WEAK, 0) + set_status(STAT_STUN, 0) + set_status(STAT_PARA, 0) + /mob/living/bot/get_total_life_damage() return getFireLoss() + getBruteLoss() diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 0acba869d7d..f618cb4f75a 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -1,13 +1,3 @@ -// Alien larva are quite simple. -/mob/living/carbon/alien/Life() - set invisibility = FALSE - set background = TRUE - if (HAS_TRANSFORMATION_MOVEMENT_HANDLER(src)) return - if(!loc) return - ..() - //Status updates, death etc. - update_icon() - /mob/living/carbon/alien/handle_mutations_and_radiation() ..() if(radiation) @@ -19,7 +9,7 @@ adjustToxLoss(-(rads)) /mob/living/carbon/alien/handle_regular_status_updates() - + blinded = null if(status_flags & GODMODE) return 0 update_health() // TODO: unify with parent call, Life() PR diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index ff3b7588e00..26b83d25c8d 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -9,14 +9,10 @@ if(stat != DEAD && !is_in_stasis()) //Mutations and radiation handle_mutations_and_radiation() - //Chemicals in the body handle_chemicals_in_body() - //Random events (vomiting etc) handle_random_events() - // eye, ear, brain damages handle_disabilities() - . = 1 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/constructs/constructs.dm b/code/modules/mob/living/simple_animal/constructs/constructs.dm index 3c66cf86b2e..9ca69b21320 100644 --- a/code/modules/mob/living/simple_animal/constructs/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs/constructs.dm @@ -119,7 +119,7 @@ hitsound = 'sound/weapons/heavysmash.ogg' force = 30 -/mob/living/simple_animal/construct/armoured/Life() +/mob/living/simple_animal/construct/armoured/handle_regular_status_updates() set_status(STAT_WEAK, 0) if ((. = ..())) return diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index b60559c35bc..5adf2bbb7e3 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -183,14 +183,13 @@ pixel_x = rand(-6, 6) pixel_y = rand(0, 10) -/mob/living/simple_animal/chick/Life() +/mob/living/simple_animal/chick/handle_regular_status_updates() . = ..() - if(!.) - return FALSE - amount_grown += rand(1,2) - if(amount_grown >= 100) - new /mob/living/simple_animal/chicken(src.loc) - qdel(src) + if(.) + amount_grown += rand(1,2) + if(amount_grown >= 100) + new /mob/living/simple_animal/chicken(src.loc) + qdel(src) var/global/const/MAX_CHICKENS = 50 var/global/chicken_count = 0 @@ -250,11 +249,9 @@ var/global/chicken_count = 0 else ..() -/mob/living/simple_animal/chicken/Life() +/mob/living/simple_animal/chicken/handle_regular_status_updates() . = ..() - if(!.) - return FALSE - if(prob(3) && eggsleft > 0) + if(. && prob(3) && eggsleft > 0) visible_message("[src] [pick("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")]") eggsleft-- var/obj/item/chems/food/egg/E = new(get_turf(src)) diff --git a/code/modules/mob/living/simple_animal/hostile/antlion.dm b/code/modules/mob/living/simple_animal/hostile/antlion.dm index bc34f48024e..cd297e85789 100644 --- a/code/modules/mob/living/simple_animal/hostile/antlion.dm +++ b/code/modules/mob/living/simple_animal/hostile/antlion.dm @@ -26,15 +26,10 @@ var/healing = FALSE var/heal_amount = 6 -/mob/living/simple_animal/hostile/antlion/Life() +/mob/living/simple_animal/hostile/antlion/handle_regular_status_updates() . = ..() - process_healing() //this needs to occur before if(!.) because of stop_automation - - if(!.) - return - - if(!is_on_special_ability_cooldown() && can_act() && target_mob) + if(. && !is_on_special_ability_cooldown() && can_act() && target_mob) vanish() /mob/living/simple_animal/hostile/antlion/proc/vanish() diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 6e43652a81b..41288fd0c28 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -110,12 +110,9 @@ The megabot . = ..() switch_mode(ATTACK_MODE_ROCKET) -/mob/living/simple_animal/hostile/hivebot/mega/Life() +/mob/living/simple_animal/hostile/hivebot/mega/handle_regular_status_updates() . = ..() - if(!.) - return - - if(!is_on_special_ability_cooldown()) + if(. && !is_on_special_ability_cooldown()) switch_mode(ATTACK_MODE_ROCKET) /mob/living/simple_animal/hostile/hivebot/mega/emp_act(severity) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 06de63ce951..9ffb1a2d606 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -182,7 +182,7 @@ ..(gibbed, deathmessage, show_dead_message) walk(src, 0) -/mob/living/simple_animal/hostile/Life() +/mob/living/simple_animal/hostile/handle_regular_status_updates() . = ..() if(!.) walk(src, 0) diff --git a/code/modules/mob/living/simple_animal/hostile/leech.dm b/code/modules/mob/living/simple_animal/hostile/leech.dm index c08291fe39d..1f73a48752f 100644 --- a/code/modules/mob/living/simple_animal/hostile/leech.dm +++ b/code/modules/mob/living/simple_animal/hostile/leech.dm @@ -19,15 +19,13 @@ adapt_to_current_level() . = ..() -/mob/living/simple_animal/hostile/leech/Life() +/mob/living/simple_animal/hostile/leech/handle_regular_status_updates() . = ..() - if(!.) - return FALSE - - if(target_mob) - belly -= 3 - else - belly -= 1 + if(.) + if(target_mob) + belly -= 3 + else + belly -= 1 /mob/living/simple_animal/hostile/leech/AttackingTarget() . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/slug.dm b/code/modules/mob/living/simple_animal/hostile/slug.dm index fb4f8f4f550..6be1362d635 100644 --- a/code/modules/mob/living/simple_animal/hostile/slug.dm +++ b/code/modules/mob/living/simple_animal/hostile/slug.dm @@ -50,7 +50,7 @@ if(prob(H.getBruteLoss()/2)) attach(H) -/mob/living/simple_animal/hostile/slug/Life() +/mob/living/simple_animal/hostile/slug/handle_regular_status_updates() . = ..() if(. && istype(src.loc, /obj/item/holder) && isliving(src.loc.loc)) //We in somebody var/mob/living/L = src.loc.loc diff --git a/code/modules/mob/living/simple_animal/hostile/vagrant.dm b/code/modules/mob/living/simple_animal/hostile/vagrant.dm index fc6a43e1380..ddfe5bf8287 100644 --- a/code/modules/mob/living/simple_animal/hostile/vagrant.dm +++ b/code/modules/mob/living/simple_animal/hostile/vagrant.dm @@ -42,7 +42,7 @@ if(stat == DEAD && !QDELETED(src) && !gibbed) gib() -/mob/living/simple_animal/hostile/vagrant/Life() +/mob/living/simple_animal/hostile/vagrant/handle_regular_status_updates() . = ..() if(!.) return FALSE From ef668e991e02a5c8d35f3dc2dcd01a26c94b1bcb Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 2 Jul 2023 22:00:17 +1000 Subject: [PATCH 19/32] Slime life override broken up. --- mods/content/xenobiology/slime/life.dm | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/mods/content/xenobiology/slime/life.dm b/mods/content/xenobiology/slime/life.dm index b50a2227157..6019ba38a48 100644 --- a/mods/content/xenobiology/slime/life.dm +++ b/mods/content/xenobiology/slime/life.dm @@ -1,11 +1,13 @@ -/mob/living/slime/Life() +/mob/living/slime/handle_environment(datum/gas_mixture/environment) . = ..() - if(. && stat != DEAD) - handle_turf_contents() - handle_local_conditions() - if(feeding_on) - slime_feed() - ingested.metabolize() + handle_turf_contents() + handle_local_conditions() + +/mob/living/slime/handle_nutrition_and_hydration() + . = ..() + if(feeding_on) + slime_feed() + ingested.metabolize() /mob/living/slime/fluid_act(datum/reagents/fluids) . = ..() From a7a75e88e5e00a33671c7395c18db289448d7f5a Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 2 Jul 2023 22:13:23 +1000 Subject: [PATCH 20/32] Collapsing carbon/Life() into living/Life(). --- code/modules/mob/living/carbon/life.dm | 18 ------------------ code/modules/mob/living/life.dm | 19 +++++++++++++++++-- nebula.dme | 1 - 3 files changed, 17 insertions(+), 21 deletions(-) delete mode 100644 code/modules/mob/living/carbon/life.dm diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm deleted file mode 100644 index 26b83d25c8d..00000000000 --- a/code/modules/mob/living/carbon/life.dm +++ /dev/null @@ -1,18 +0,0 @@ -/mob/living/carbon/Life() - if(!..()) - return - - // Increase germ_level regularly - if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level - germ_level++ - - if(stat != DEAD && !is_in_stasis()) - //Mutations and radiation - handle_mutations_and_radiation() - //Chemicals in the body - handle_chemicals_in_body() - //Random events (vomiting etc) - handle_random_events() - // eye, ear, brain damages - handle_disabilities() - . = 1 \ No newline at end of file diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 94913f0d63e..d1778557732 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -21,10 +21,25 @@ //Handle temperature/pressure differences between body and environment handle_environment(loc.return_air()) + // Increase germ_level regularly + if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level + germ_level++ + if(stat != DEAD && !is_in_stasis()) - //Breathing, if applicable - handle_breathing() + // hungy handle_nutrition_and_hydration() + //Body temperature adjusts itself (self-regulation) + stabilize_body_temperature() + // Breathing, if applicable + handle_breathing() + // Mutations and radiation + handle_mutations_and_radiation() + // Chemicals in the body + handle_chemicals_in_body() + // Random events (vomiting etc) + handle_random_events() + // eye, ear, brain damages + handle_disabilities() handle_immunity() //Body temperature adjusts itself (self-regulation) stabilize_body_temperature() diff --git a/nebula.dme b/nebula.dme index 2b5f05e082a..73d0065054d 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2391,7 +2391,6 @@ #include "code\modules\mob\living\carbon\give.dm" #include "code\modules\mob\living\carbon\hallucinations.dm" #include "code\modules\mob\living\carbon\internals.dm" -#include "code\modules\mob\living\carbon\life.dm" #include "code\modules\mob\living\carbon\resist.dm" #include "code\modules\mob\living\carbon\taste.dm" #include "code\modules\mob\living\carbon\alien\alien.dm" From cb2e54c331c47fa53dd17d8e6b0d1be2df2f0c14 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 2 Jul 2023 22:21:46 +1000 Subject: [PATCH 21/32] Dismantling simple_animal Life(). --- code/game/machinery/alarm.dm | 3 +- code/game/objects/items/weapons/defib.dm | 2 +- code/modules/hydroponics/seed.dm | 2 +- .../hydroponics/spreading/spreading_growth.dm | 6 +-- .../modules/hydroponics/trays/tray_process.dm | 4 +- .../mob/living/simple_animal/simple_animal.dm | 49 ++++++++++--------- 6 files changed, 35 insertions(+), 31 deletions(-) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 5a82cc55e3a..a33ee1e8b9d 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -146,7 +146,8 @@ return // spawned in nullspace, presumably as a prototype for construction purposes. area_uid = alarm_area.uid - // breathable air according to human/Life() + // breathable air according to default human species + // TODO: make it use map default species? var/decl/material/gas_mat = GET_DECL(/decl/material/gas/oxygen) TLV[gas_mat.gas_name] = list(16, 19, 135, 140) // Partial pressure, kpa gas_mat = GET_DECL(/decl/material/gas/carbon_dioxide) diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 8457be4d713..5c6e522873d 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -435,7 +435,7 @@ M.switch_from_dead_to_living_mob_list() M.timeofdeath = 0 - M.set_stat(UNCONSCIOUS) //Life() can bring them back to consciousness if it needs to. + M.set_stat(UNCONSCIOUS) M.try_refresh_visible_overlays() M.failed_last_breath = 0 //So mobs that died of oxyloss don't revive and have perpetual out of breath. M.reload_fullscreen() diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 3a359e1582e..c3b8e583319 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -270,7 +270,7 @@ origin_turf.visible_message(SPAN_DANGER("\The [thrown] splatters against [target]!")) splatter(origin_turf,thrown) -/datum/seed/proc/handle_environment(var/turf/current_turf, var/datum/gas_mixture/environment, var/light_supplied, var/check_only) +/datum/seed/proc/handle_plant_environment(var/turf/current_turf, var/datum/gas_mixture/environment, var/light_supplied, var/check_only) var/health_change = 0 // Handle gas consumption. diff --git a/code/modules/hydroponics/spreading/spreading_growth.dm b/code/modules/hydroponics/spreading/spreading_growth.dm index 770a7b64168..6125017277d 100644 --- a/code/modules/hydroponics/spreading/spreading_growth.dm +++ b/code/modules/hydroponics/spreading/spreading_growth.dm @@ -43,10 +43,10 @@ return //Take damage from bad environment if any - adjust_health(-seed.handle_environment(T,T.return_air(),null,1)) + adjust_health(-seed.handle_plant_environment(T,T.return_air(),null,1)) if(health <= 0) return - + //Vine fight! for(var/obj/effect/vine/other in T) if(other.seed != seed) @@ -76,7 +76,7 @@ var/list/neighbors = get_neighbors() if(neighbors.len) spread_to(pick(neighbors)) - + //Try to settle down if(can_spawn_plant()) plant = new(T,seed) diff --git a/code/modules/hydroponics/trays/tray_process.dm b/code/modules/hydroponics/trays/tray_process.dm index b308e466061..5065d15e7eb 100644 --- a/code/modules/hydroponics/trays/tray_process.dm +++ b/code/modules/hydroponics/trays/tray_process.dm @@ -84,9 +84,9 @@ // Seed datum handles gasses, light and pressure. if(mechanical && closed_system) - plant_health -= seed.handle_environment(T,environment,tray_light) + plant_health -= seed.handle_plant_environment(T,environment,tray_light) else - plant_health -= seed.handle_environment(T,environment) + plant_health -= seed.handle_plant_environment(T,environment) // If we're attached to a pipenet, then we should let the pipenet know we might have modified some gasses if (closed_system && get_port()) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 92e1fbb9a89..0d7e2e9ea19 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -170,35 +170,47 @@ var/global/list/simplemob_icon_bitflag_cache = list() QDEL_NULL(natural_weapon) . = ..() -/mob/living/simple_animal/Life() +/mob/living/simple_animal/handle_regular_status_updates() + . = ..() + if(!.) + return FALSE if(is_aquatic && !submerged() && stat != DEAD) walk(src, 0) if(!HAS_STATUS(src, STAT_PARA)) // gated to avoid redundant update_icon() calls. SET_STATUS_MAX(src, STAT_PARA, 3) update_icon() - . = ..() - if(!.) - return FALSE if(z && !living_observers_present(SSmapping.get_connected_levels(z))) - return - //Health + + if(health <= 0) + death() + else if(health > maxHealth) + health = maxHealth + if(stat == DEAD) if(current_health > 0) switch_from_dead_to_living_mob_list() set_stat(CONSCIOUS) set_density(1) update_icon() - return 0 - - handle_atmos() - handle_supernatural() - handle_impaired_vision() + return + if(purge) + purge -= 1 if(can_bleed && bleed_ticks > 0) handle_bleeding() + if(is_aquatic && !submerged()) + walk(src, 0) + if(PENDING_STATUS(src, STAT_PARA)) + SET_STATUS_MAX(src, STAT_PARA, 3) + update_icon() - delayed_life_action() - return 1 +/mob/living/simple_animal/handle_some_updates() + . = ..() && (!z || living_observers_present(SSmapping.get_connected_levels(z))) + +/mob/living/simple_animal/Life() + . = ..() + if(.) + delayed_life_action() // Handles timed stuff in Life() /mob/living/simple_animal/proc/delayed_life_action() @@ -251,12 +263,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() if("emote_see") visible_emote("[pick(emote_see)].") -/mob/living/simple_animal/proc/handle_atmos(var/atmos_suitable = 1) - //Atmos - if(!loc) - return - - var/datum/gas_mixture/environment = loc.return_air() +/mob/living/simple_animal/handle_environment(datum/gas_mixture/environment) if(environment) // don't bother checking it twice if we got a supplied FALSE val. if(atmos_suitable) @@ -292,10 +299,6 @@ var/global/list/simplemob_icon_bitflag_cache = list() O.unbuckle_mob(M) visible_message(SPAN_DANGER("\The [M] escapes from \the [O]!")) -/mob/living/simple_animal/proc/handle_supernatural() - if(purge) - purge -= 1 - /mob/living/simple_animal/gib() ..(((mob_icon_state_flags & MOB_ICON_HAS_GIB_STATE) ? "world-gib" : null), TRUE) From 2ff07e81a0e95d2a0bcf4cb239545d7cb1a7ed76 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 2 Jul 2023 22:35:00 +1000 Subject: [PATCH 22/32] Dismantling exosuit Life(). --- code/modules/mechs/interface/_interface.dm | 7 ++++ code/modules/mechs/mech_life.dm | 41 +++++++++++-------- code/modules/mob/living/bot/bot.dm | 12 +++--- code/modules/mob/living/carbon/alien/life.dm | 4 +- code/modules/mob/living/carbon/brain/life.dm | 3 ++ code/modules/mob/living/carbon/human/life.dm | 7 +--- code/modules/mob/living/life.dm | 21 ++++++++-- code/modules/mob/living/silicon/robot/life.dm | 5 ++- .../simple_animal/constructs/constructs.dm | 10 ++--- .../mob/living/simple_animal/simple_animal.dm | 9 ++-- code/modules/mob/mob.dm | 11 +++-- mods/species/ascent/mobs/nymph/nymph_life.dm | 2 + 12 files changed, 83 insertions(+), 49 deletions(-) diff --git a/code/modules/mechs/interface/_interface.dm b/code/modules/mechs/interface/_interface.dm index 38535387f41..15036d06419 100644 --- a/code/modules/mechs/interface/_interface.dm +++ b/code/modules/mechs/interface/_interface.dm @@ -58,6 +58,13 @@ refresh_hud() +/mob/living/exosuit/should_do_hud_updates() + . = ..() + if(!. && length(pilots)) + for(var/mob/pilot in pilots) + if(pilot.should_do_hud_updates()) + return TRUE + /mob/living/exosuit/handle_hud_icons() for(var/hardpoint in hardpoint_hud_elements) var/obj/screen/exosuit/hardpoint/H = hardpoint_hud_elements[hardpoint] diff --git a/code/modules/mechs/mech_life.dm b/code/modules/mechs/mech_life.dm index 18975123d54..9e642006d6e 100644 --- a/code/modules/mechs/mech_life.dm +++ b/code/modules/mechs/mech_life.dm @@ -1,7 +1,20 @@ /mob/living/exosuit/handle_disabilities() return -/mob/living/exosuit/Life() +/mob/living/exosuit/update_lying() + lying = FALSE // Prevent carp from proning us + +/mob/living/exosuit/handle_regular_status_updates() + + if(!body && !QDELETED(src)) + physically_destroyed() + return + + updatehealth() + if(health <= 0 && stat != DEAD) + death() + + . = ..() for(var/thing in pilots) var/mob/pilot = thing @@ -12,20 +25,10 @@ UNSETEMPTY(pilots) update_pilots() - if(!body && !QDELETED(src)) - qdel(src) - return - if(radio) radio.on = (head && head.radio && head.radio.is_functional() && get_cell()) - body.update_air(hatch_closed && use_air) - - var/powered = FALSE - if(get_cell()) - powered = get_cell().drain_power(0, 0, calc_power_draw()) > 0 - - if(!powered) + if(!is_suit_powered()) //Shut down all systems if(head) head.active_sensors = FALSE @@ -39,12 +42,14 @@ if(emp_damage > 0) emp_damage -= min(1, emp_damage) //Reduce emp accumulation over time - ..() //Handles stuff like environment - handle_hud_icons() +/mob/living/exosuit/proc/is_suit_powered() + return (get_cell()?.drain_power(0, 0, calc_power_draw())) > 0 - lying = FALSE // Fuck off, carp. - handle_vision(powered) +/mob/living/exosuit/handle_environment(datum/gas_mixture/environment) + if(body) + body.update_air(hatch_closed && use_air) + . = ..() /mob/living/exosuit/get_cell(force) RETURN_TYPE(/obj/item/cell) @@ -123,14 +128,14 @@ qdel(src) return -/mob/living/exosuit/handle_vision(powered) +/mob/living/exosuit/handle_vision() var/was_blind = sight & BLIND if(head) + var/powered = is_suit_powered() sight = head.get_sight(powered) see_invisible = head.get_invisible(powered) if(body && (body.pilot_coverage < 100 || body.transparent_cabin) || !hatch_closed) sight &= ~BLIND - if(sight & BLIND && !was_blind) for(var/mob/pilot in pilots) to_chat(pilot, SPAN_WARNING("The sensors are not operational and you cannot see a thing!")) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index eaf9b903f65..9c154ae58f7 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -59,11 +59,6 @@ else turn_off() -/mob/living/bot/Life() - . = ..() - if(stat != DEAD && on && !client && !busy) - handleAI() - /mob/living/bot/handle_regular_status_updates() . = ..() if(stat == DEAD) @@ -206,7 +201,12 @@ /mob/living/bot/emag_act(var/remaining_charges, var/mob/user) return 0 -/mob/living/bot/proc/handleAI() +/mob/living/bot/handle_legacy_ai() + . = ..() + if(on && !busy) + handle_async_ai() + +/mob/living/bot/proc/handle_async_ai() set waitfor = FALSE if(ignore_list.len) for(var/atom/A in ignore_list) diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index f618cb4f75a..eea4a273956 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -48,6 +48,9 @@ return 1 /mob/living/carbon/alien/handle_regular_hud_updates() + . = ..() + if(!.) + return update_sight() if (healths) if(stat != DEAD) @@ -80,7 +83,6 @@ if(machine) if(machine.check_eye(src) < 0) reset_view(null) - return 1 /mob/living/carbon/alien/handle_environment(var/datum/gas_mixture/environment) ..() diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index 5d8a346840b..50385b4b565 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -126,6 +126,9 @@ return 1 /mob/living/carbon/brain/handle_regular_hud_updates() + . = ..() + if(!.) + return update_sight() if (healths) if (stat != DEAD) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 41013741251..01d8aef1d33 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -468,12 +468,9 @@ /mob/living/carbon/human/handle_regular_hud_updates() if(hud_updateflag) // update our mob's hud overlays, AKA what others see flaoting above our head handle_hud_list() - - // now handle what we see on our screen - - if(!..()) + . = ..() + if(!.) return - if(stat != DEAD) var/half_health = get_max_health()/2 if(stat == UNCONSCIOUS && current_health < half_health) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index d1778557732..8dca2438a04 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -41,9 +41,15 @@ // eye, ear, brain damages handle_disabilities() handle_immunity() + //Body temperature adjusts itself (self-regulation) stabilize_body_temperature() + // Only handle AI stuff if we're not being played. + if(!key) + handle_legacy_ai() + . = 1 + // human/handle_regular_status_updates() needs a cleanup, as blindness should be handled in handle_disabilities() handle_regular_status_updates() // Status & health update, are we dead or alive etc. handle_stasis() @@ -82,6 +88,10 @@ return my_species.hunger_factor return 0 +// Used to handle non-datum AI. +/mob/living/proc/handle_legacy_ai() + return + /mob/living/proc/handle_nutrition_and_hydration() SHOULD_CALL_PARENT(TRUE) if(!experiences_hunger_and_thirst()) @@ -288,15 +298,18 @@ if((sdisabilities & DEAFENED) || stat) //disabled-deaf, doesn't get better on its own SET_STATUS_MAX(src, STAT_TINNITUS, 2) +/mob/living/proc/should_do_hud_updates() + return client + //this handles hud updates. Calls update_vision() and handle_hud_icons() /mob/living/proc/handle_regular_hud_updates() - if(!client) return 0 - + SHOULD_CALL_PARENT(TRUE) + if(!should_do_hud_updates()) + return FALSE handle_hud_icons() handle_vision() handle_low_light_vision() - - return 1 + return TRUE /mob/living/proc/handle_low_light_vision() diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index dfe6b9a17e7..3713f42a416 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -115,8 +115,9 @@ return 1 /mob/living/silicon/robot/handle_regular_hud_updates() - ..() - + . = ..() + if(!.) + return var/obj/item/borg/sight/hud/hud = (locate(/obj/item/borg/sight/hud) in src) if(hud && hud.hud) hud.hud.process_hud(src) diff --git a/code/modules/mob/living/simple_animal/constructs/constructs.dm b/code/modules/mob/living/simple_animal/constructs/constructs.dm index 9ca69b21320..74e15dd0143 100644 --- a/code/modules/mob/living/simple_animal/constructs/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs/constructs.dm @@ -262,7 +262,7 @@ /mob/living/simple_animal/construct/armoured/handle_regular_hud_updates() . = ..() - if(healths) + if(. && healths) switch(current_health) if(250 to INFINITY) healths.icon_state = "juggernaut_health0" if(208 to 249) healths.icon_state = "juggernaut_health1" @@ -276,7 +276,7 @@ /mob/living/simple_animal/construct/behemoth/handle_regular_hud_updates() . = ..() - if(healths) + if(. && healths) switch(current_health) if(750 to INFINITY) healths.icon_state = "juggernaut_health0" if(625 to 749) healths.icon_state = "juggernaut_health1" @@ -289,7 +289,7 @@ /mob/living/simple_animal/construct/builder/handle_regular_hud_updates() . = ..() - if(healths) + if(. && healths) switch(current_health) if(50 to INFINITY) healths.icon_state = "artificer_health0" if(42 to 49) healths.icon_state = "artificer_health1" @@ -304,7 +304,7 @@ /mob/living/simple_animal/construct/wraith/handle_regular_hud_updates() . = ..() - if(healths) + if(. && healths) switch(current_health) if(75 to INFINITY) healths.icon_state = "wraith_health0" if(62 to 74) healths.icon_state = "wraith_health1" @@ -318,7 +318,7 @@ /mob/living/simple_animal/construct/harvester/handle_regular_hud_updates() . = ..() - if(healths) + if(. && healths) switch(current_health) if(150 to INFINITY) healths.icon_state = "harvester_health0" if(125 to 149) healths.icon_state = "harvester_health1" diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 0d7e2e9ea19..dd67ec0044e 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -207,13 +207,12 @@ var/global/list/simplemob_icon_bitflag_cache = list() /mob/living/simple_animal/handle_some_updates() . = ..() && (!z || living_observers_present(SSmapping.get_connected_levels(z))) -/mob/living/simple_animal/Life() +/mob/living/simple_animal/handle_legacy_ai() . = ..() - if(.) - delayed_life_action() + handle_async_life_action() // Handles timed stuff in Life() -/mob/living/simple_animal/proc/delayed_life_action() +/mob/living/simple_animal/proc/handle_async_life_action() set waitfor = FALSE if(performing_delayed_life_action) return @@ -264,6 +263,8 @@ var/global/list/simplemob_icon_bitflag_cache = list() visible_emote("[pick(emote_see)].") /mob/living/simple_animal/handle_environment(datum/gas_mixture/environment) + + var/atmos_suitable = TRUE if(environment) // don't bother checking it twice if we got a supplied FALSE val. if(atmos_suitable) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index dc258343e95..3e6cb98c0f7 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -700,10 +700,9 @@ return 0 //Updates lying and icons -/mob/proc/UpdateLyingBuckledAndVerbStatus() - var/last_lying = lying +/mob/proc/update_lying() if(!resting && cannot_stand() && can_stand_overridden()) - lying = 0 + lying = FALSE else if(buckled) anchored = TRUE if(istype(buckled)) @@ -716,12 +715,16 @@ else lying = incapacitated(INCAPACITATION_KNOCKDOWN) +/mob/proc/UpdateLyingBuckledAndVerbStatus() + var/last_lying = lying + update_lying() + if(buckled) + anchored = (!istype(buckled) || !buckled.buckle_movable) if(lying) set_density(0) drop_held_items() else set_density(initial(density)) - reset_layer() //Temporarily moved here from the various life() procs diff --git a/mods/species/ascent/mobs/nymph/nymph_life.dm b/mods/species/ascent/mobs/nymph/nymph_life.dm index a94c443b54c..cd1a17f31af 100644 --- a/mods/species/ascent/mobs/nymph/nymph_life.dm +++ b/mods/species/ascent/mobs/nymph/nymph_life.dm @@ -1,6 +1,8 @@ /mob/living/carbon/alien/ascent_nymph/handle_regular_hud_updates() . = ..() + if(!.) + return var/datum/hud/ascent_nymph/nymph_hud = hud_used if(!istype(nymph_hud)) return From 0b69a971b5d803157756cbdfc33b6914614031f5 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 2 Jul 2023 22:48:09 +1000 Subject: [PATCH 23/32] Further refinement of various life procs and processes. --- code/modules/clothing/_clothing.dm | 2 +- code/modules/mechs/interface/_interface.dm | 2 +- code/modules/mechs/mech_life.dm | 6 +- code/modules/mob/living/bot/bot.dm | 3 +- code/modules/mob/living/carbon/alien/life.dm | 5 +- code/modules/mob/living/carbon/human/life.dm | 27 +++-- code/modules/mob/living/life.dm | 106 ++++++++++--------- mods/mobs/borers/mob/borer/borer.dm | 23 ++-- 8 files changed, 86 insertions(+), 88 deletions(-) diff --git a/code/modules/clothing/_clothing.dm b/code/modules/clothing/_clothing.dm index 2cb413e41d0..824385c039a 100644 --- a/code/modules/clothing/_clothing.dm +++ b/code/modules/clothing/_clothing.dm @@ -59,7 +59,7 @@ // End placeholder. // Updates the vision of the mob wearing the clothing item, if any -/obj/item/clothing/proc/update_vision() +/obj/item/clothing/proc/update_wearer_vision() if(isliving(src.loc)) var/mob/living/L = src.loc L.handle_vision() diff --git a/code/modules/mechs/interface/_interface.dm b/code/modules/mechs/interface/_interface.dm index 15036d06419..d2ac63b4439 100644 --- a/code/modules/mechs/interface/_interface.dm +++ b/code/modules/mechs/interface/_interface.dm @@ -61,7 +61,7 @@ /mob/living/exosuit/should_do_hud_updates() . = ..() if(!. && length(pilots)) - for(var/mob/pilot in pilots) + for(var/mob/living/pilot in pilots) if(pilot.should_do_hud_updates()) return TRUE diff --git a/code/modules/mechs/mech_life.dm b/code/modules/mechs/mech_life.dm index 9e642006d6e..69ec34b417c 100644 --- a/code/modules/mechs/mech_life.dm +++ b/code/modules/mechs/mech_life.dm @@ -8,11 +8,7 @@ if(!body && !QDELETED(src)) physically_destroyed() - return - - updatehealth() - if(health <= 0 && stat != DEAD) - death() + return FALSE . = ..() diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 9c154ae58f7..3f936bb5468 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -61,8 +61,7 @@ /mob/living/bot/handle_regular_status_updates() . = ..() - if(stat == DEAD) - else + if(.) set_status(STAT_WEAK, 0) set_status(STAT_STUN, 0) set_status(STAT_PARA, 0) diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index eea4a273956..92cd168f3bd 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -9,8 +9,9 @@ adjustToxLoss(-(rads)) /mob/living/carbon/alien/handle_regular_status_updates() - blinded = null - if(status_flags & GODMODE) return 0 + . = ..() + if(!.) + return update_health() // TODO: unify with parent call, Life() PR if(stat == DEAD) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 01d8aef1d33..41c2831493f 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -36,31 +36,30 @@ var/pressure_alert = 0 var/stamina = 100 +/mob/living/carbon/human/handle_living_non_stasis_processes() + //Updates the number of stored chemicals for powers + handle_changeling() + last_pain = null // Clear the last cached pain value so further getHalloss() calls won't use an old value. + //Organs and blood + handle_organs() + stabilize_body_temperature() //Body temperature adjusts itself (self-regulation) + handle_shock() + handle_pain() + handle_stamina() + /mob/living/carbon/human/Life() - set invisibility = FALSE - set background = BACKGROUND_ENABLED - if (HAS_TRANSFORMATION_MOVEMENT_HANDLER(src)) + . = ..() + if(!.) return fire_alert = 0 //Reset this here, because both breathe() and handle_environment() have a chance to set it. - ..() - if(life_tick%30==15) hud_updateflag = 1022 voice = GetVoice() - //No need to update all of these procs if the guy is dead. - if(stat != DEAD && !is_in_stasis()) - last_pain = null // Clear the last cached pain value so further getHalloss() calls won't use an old value. - //Organs and blood - handle_organs() - handle_shock() - handle_pain() - handle_stamina() - if(!handle_some_updates()) return //We go ahead and process them 5 times for HUD images and other stuff though. diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 8dca2438a04..e085acacec0 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -20,59 +20,47 @@ //Handle temperature/pressure differences between body and environment handle_environment(loc.return_air()) - - // Increase germ_level regularly - if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level - germ_level++ - - if(stat != DEAD && !is_in_stasis()) - // hungy - handle_nutrition_and_hydration() - //Body temperature adjusts itself (self-regulation) - stabilize_body_temperature() - // Breathing, if applicable - handle_breathing() - // Mutations and radiation - handle_mutations_and_radiation() - // Chemicals in the body - handle_chemicals_in_body() - // Random events (vomiting etc) - handle_random_events() - // eye, ear, brain damages - handle_disabilities() - handle_immunity() - - //Body temperature adjusts itself (self-regulation) - stabilize_body_temperature() - - // Only handle AI stuff if we're not being played. - if(!key) - handle_legacy_ai() - . = 1 - - // human/handle_regular_status_updates() needs a cleanup, as blindness should be handled in handle_disabilities() handle_regular_status_updates() // Status & health update, are we dead or alive etc. handle_stasis() if(stat != DEAD) + if(!is_in_stasis()) + . = handle_living_non_stasis_processes() aura_check(AURA_TYPE_LIFE) - //Check if we're on fire - handle_fire() - for(var/obj/item/grab/G in get_active_grabs()) G.Process() + //Check if we're on fire + handle_fire() handle_actions() - UpdateLyingBuckledAndVerbStatus() - handle_regular_hud_updates() - handle_status_effects() return 1 +/mob/living/proc/handle_living_non_stasis_processes() + // hungy + handle_nutrition_and_hydration() + // Breathing, if applicable + handle_breathing() + // Mutations and radiation + handle_mutations_and_radiation() + // Chemicals in the body + handle_chemicals_in_body() + // Random events (vomiting etc) + handle_random_events() + // eye, ear, brain damages + handle_disabilities() + handle_immunity() + //Body temperature adjusts itself (self-regulation) + stabilize_body_temperature() + // Only handle AI stuff if we're not being played. + if(!key) + handle_legacy_ai() + return TRUE + /mob/living/proc/experiences_hunger_and_thirst() return TRUE @@ -275,17 +263,40 @@ sound_to(src, sound(send_sound, repeat = TRUE, wait = 0, volume = 30, channel = sound_channels.weather_channel)) //This updates the health and status of the mob (conscious, unconscious, dead) +/mob/living/proc/should_be_dead() + return health < 0 + /mob/living/proc/handle_regular_status_updates() - update_health() - if(stat != DEAD) - if(HAS_STATUS(src, STAT_PARA)) - set_stat(UNCONSCIOUS) - else if (status_flags & FAKEDEATH) - set_stat(UNCONSCIOUS) - else - set_stat(CONSCIOUS) + + SHOULD_CALL_PARENT(TRUE) + + // Godmode just skips most of this processing. + if(status_flags & GODMODE) + set_stat(CONSCIOUS) + germ_level = 0 return TRUE + // Increase germ_level regularly + if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level + germ_level++ + + // Check if we are (or should be) dead at this point. + if(stat == DEAD) + return FALSE + updatehealth() + if(should_be_dead() && stat != DEAD) + death() + return FALSE + + // Handle some general state updates. + if(HAS_STATUS(src, STAT_PARA)) + set_stat(UNCONSCIOUS) + else if (status_flags & FAKEDEATH) + set_stat(UNCONSCIOUS) + else + set_stat(CONSCIOUS) + return TRUE + /mob/living/proc/handle_disabilities() handle_impaired_vision() handle_impaired_hearing() @@ -339,11 +350,10 @@ lighting_master.set_alpha(target_value) /mob/living/proc/handle_vision() + blinded = FALSE update_sight() - if(stat == DEAD) return - if(is_blind()) overlay_fullscreen("blind", /obj/screen/fullscreen/blind) else @@ -351,9 +361,7 @@ set_fullscreen(disabilities & NEARSIGHTED, "impaired", /obj/screen/fullscreen/impaired, 1) set_fullscreen(GET_STATUS(src, STAT_BLURRY), "blurry", /obj/screen/fullscreen/blurry) set_fullscreen(GET_STATUS(src, STAT_DRUGGY), "high", /obj/screen/fullscreen/high) - set_fullscreen(stat == UNCONSCIOUS, "blackout", /obj/screen/fullscreen/blackout) - if(machine) var/viewflags = machine.check_eye(src) if(viewflags < 0) diff --git a/mods/mobs/borers/mob/borer/borer.dm b/mods/mobs/borers/mob/borer/borer.dm index 82b016cca48..7b6c41dd0ea 100644 --- a/mods/mobs/borers/mob/borer/borer.dm +++ b/mods/mobs/borers/mob/borer/borer.dm @@ -81,24 +81,25 @@ /mob/living/simple_animal/borer/proc/set_borer_name() truename = "[borer_names[min(generation, borer_names.len)]] [random_id("borer[generation]", 1000, 9999)]" -/mob/living/simple_animal/borer/handle_regular_status_updates() +/mob/living/simple_animal/borer/handle_vision() + . = ..() + blinded = !!host?.blinded + set_status(STAT_BLIND, host ? GET_STATUS(host, STAT_BLIND) : 0) + set_status(STAT_BLURRY, host ? GET_STATUS(host, STAT_BLURRY) : 0) +/mob/living/simple_animal/borer/handle_disabilities() + . = ..() sdisabilities = 0 if(host) - set_status(STAT_BLIND, GET_STATUS(host, STAT_BLIND)) - set_status(STAT_BLURRY, GET_STATUS(host, STAT_BLURRY)) if(host.sdisabilities & BLINDED) sdisabilities |= BLINDED if(host.sdisabilities & DEAFENED) sdisabilities |= DEAFENED - else - set_status(STAT_BLIND, 0) - set_status(STAT_BLURRY, 0) - ..() +/mob/living/simple_animal/borer/handle_regular_status_updates() + . = ..() if(!host || stat || host.stat) return - if(host.reagents.has_reagent(/decl/material/liquid/nutriment/sugar)) if(!docile) if(controlling) @@ -113,26 +114,20 @@ else to_chat(src, SPAN_NOTICE("You shake off your lethargy as the sugar leaves your host's blood.")) docile = 0 - if(chemicals < 250 && host.nutrition >= (neutered ? 200 : 50)) host.nutrition-- chemicals++ - if(!controlling) return - if(neutered) host.release_control() return - if(docile) to_chat(host, SPAN_NOTICE("You are feeling far too docile to continue controlling your host...")) host.release_control() return - if(prob(5)) host.adjustBrainLoss(0.1) - if(prob(host.getBrainLoss()/20)) INVOKE_ASYNC(host, /mob/proc/say, "*[pick(list("blink","blink_r","choke","aflap","drool","twitch","twitch_v","gasp"))]") From d7a34632ec19c113279e980f01b84217936cf5e0 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 2 Jul 2023 23:01:09 +1000 Subject: [PATCH 24/32] Cleaning up, condensing blinded status. --- code/__defines/mob_status.dm | 7 +++---- code/modules/clothing/_clothing.dm | 2 +- code/modules/clothing/glasses/_glasses.dm | 2 +- code/modules/clothing/head/misc_special.dm | 2 +- code/modules/clothing/spacesuits/rig/rig.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 13 ++++++++----- code/modules/mob/living/life.dm | 9 +++++++-- code/modules/mob/living/living_status.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 2 +- mods/mobs/borers/mob/borer/borer.dm | 1 - 10 files changed, 24 insertions(+), 18 deletions(-) diff --git a/code/__defines/mob_status.dm b/code/__defines/mob_status.dm index 1e8ac3ef70c..606fc086ec5 100644 --- a/code/__defines/mob_status.dm +++ b/code/__defines/mob_status.dm @@ -1,5 +1,4 @@ -#define PENDING_STATUS(MOB, COND) (LAZYACCESS(MOB.pending_status_counters, COND) || LAZYACCESS(MOB.status_counters, COND)) #define GET_STATUS(MOB, COND) (LAZYACCESS(MOB.status_counters, COND)) -#define HAS_STATUS(MOB, COND) (GET_STATUS(MOB, COND) > 0) -#define ADJ_STATUS(MOB, COND, AMT) (MOB.set_status(COND, PENDING_STATUS(MOB, COND) + AMT)) -#define SET_STATUS_MAX(MOB, COND, AMT) (MOB.set_status(COND, max(PENDING_STATUS(MOB, COND), AMT))) +#define HAS_STATUS(MOB, COND) ((LAZYACCESS(MOB.pending_status_counters, COND) || LAZYACCESS(MOB.status_counters, COND)) > 0) +#define ADJ_STATUS(MOB, COND, AMT) (MOB.set_status(COND, HAS_STATUS(MOB, COND) + AMT)) +#define SET_STATUS_MAX(MOB, COND, AMT) (MOB.set_status(COND, max(HAS_STATUS(MOB, COND), AMT))) diff --git a/code/modules/clothing/_clothing.dm b/code/modules/clothing/_clothing.dm index 824385c039a..06eca0e8542 100644 --- a/code/modules/clothing/_clothing.dm +++ b/code/modules/clothing/_clothing.dm @@ -147,7 +147,7 @@ /obj/item/clothing/equipped(var/mob/user) if(needs_vision_update()) - update_vision() + update_wearer_vision() return ..() /obj/item/clothing/proc/refit_for_bodytype(var/target_bodytype) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 6cf4c26780b..f18c7d9eeb1 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -69,7 +69,7 @@ active = _active update_icon() update_clothing_icon() - update_vision() + update_wearer_vision() /obj/item/clothing/glasses/on_update_icon() . = ..() diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 8e1a1901d64..090b5d0ff48 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -60,7 +60,7 @@ flags_inv &= ~(HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) to_chat(usr, "You push the [src] up out of your face.") update_icon() - update_vision() + update_wearer_vision() usr.update_action_buttons() /obj/item/clothing/head/welding/on_update_icon() diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index f752dd8294f..d96b4abb6e8 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -200,7 +200,7 @@ LAZYSET(chest.slowdown_per_slot, slot_wear_suit_str, (active? online_slowdown : offline_slowdown)) if(helmet) helmet.tint = (active? vision_restriction : offline_vision_restriction) - helmet.update_vision() + helmet.update_wearer_vision() /obj/item/rig/proc/suit_is_deployed() if(!istype(wearer) || src.loc != wearer || wearer.get_equipped_item(slot_back_str) != src) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 41c2831493f..d7fbb2d7145 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -143,7 +143,11 @@ return ONE_ATMOSPHERE + pressure_difference /mob/living/carbon/human/handle_impaired_vision() - ..() + + . = ..() + if(!.) + return + //Vision var/obj/item/organ/vision var/decl/bodytype/root_bodytype = get_bodytype() @@ -162,10 +166,9 @@ /mob/living/carbon/human/handle_disabilities() ..() - if(stat != DEAD) - if ((disabilities & COUGHING) && prob(5) && GET_STATUS(src, STAT_PARA) <= 1) - drop_held_items() - cough() + if(stat != DEAD && (disabilities & COUGHING) && prob(5) && GET_STATUS(src, STAT_PARA) <= 1) + drop_held_items() + cough() /mob/living/carbon/human/handle_mutations_and_radiation() if(getFireLoss()) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index e085acacec0..692f5654662 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -302,8 +302,14 @@ handle_impaired_hearing() /mob/living/proc/handle_impaired_vision() - if((sdisabilities & BLINDED) || stat) //blindness from disability or unconsciousness doesn't get better on its own + SHOULD_CALL_PARENT(TRUE) + if(stat == DEAD) + SET_STATUS_MAX(src, STAT_BLIND, 0) + if(stat != CONSCIOUS && (sdisabilities & BLINDED)) //blindness from disability or unconsciousness doesn't get better on its own SET_STATUS_MAX(src, STAT_BLIND, 2) + else + return TRUE + return FALSE /mob/living/proc/handle_impaired_hearing() if((sdisabilities & DEAFENED) || stat) //disabled-deaf, doesn't get better on its own @@ -350,7 +356,6 @@ lighting_master.set_alpha(target_value) /mob/living/proc/handle_vision() - blinded = FALSE update_sight() if(stat == DEAD) return diff --git a/code/modules/mob/living/living_status.dm b/code/modules/mob/living/living_status.dm index 1014107e700..fa7abf8bd2e 100644 --- a/code/modules/mob/living/living_status.dm +++ b/code/modules/mob/living/living_status.dm @@ -10,7 +10,7 @@ if(!cond.check_can_set(src)) return FALSE amount = clamp(amount, 0, 1000) - if(amount == PENDING_STATUS(src, condition)) + if(amount == HAS_STATUS(src, condition)) return FALSE LAZYSET(pending_status_counters, condition, amount) addtimer(CALLBACK(src, .proc/apply_pending_status_changes), 0, TIMER_UNIQUE) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index dd67ec0044e..14516e656ef 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -200,7 +200,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() handle_bleeding() if(is_aquatic && !submerged()) walk(src, 0) - if(PENDING_STATUS(src, STAT_PARA)) + if(HAS_STATUS(src, STAT_PARA)) SET_STATUS_MAX(src, STAT_PARA, 3) update_icon() diff --git a/mods/mobs/borers/mob/borer/borer.dm b/mods/mobs/borers/mob/borer/borer.dm index 7b6c41dd0ea..dec19b154d0 100644 --- a/mods/mobs/borers/mob/borer/borer.dm +++ b/mods/mobs/borers/mob/borer/borer.dm @@ -83,7 +83,6 @@ /mob/living/simple_animal/borer/handle_vision() . = ..() - blinded = !!host?.blinded set_status(STAT_BLIND, host ? GET_STATUS(host, STAT_BLIND) : 0) set_status(STAT_BLURRY, host ? GET_STATUS(host, STAT_BLURRY) : 0) From 0f333145866e9dece61ae065edf8709279cda738 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 2 Jul 2023 23:13:49 +1000 Subject: [PATCH 25/32] Dismantling human life(). --- code/modules/mob/living/carbon/human/life.dm | 34 +++++++------------- code/modules/mob/living/life.dm | 3 ++ 2 files changed, 15 insertions(+), 22 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index d7fbb2d7145..e1014a5f020 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -47,25 +47,6 @@ handle_pain() handle_stamina() -/mob/living/carbon/human/Life() - - . = ..() - if(!.) - return - - fire_alert = 0 //Reset this here, because both breathe() and handle_environment() have a chance to set it. - - if(life_tick%30==15) - hud_updateflag = 1022 - - voice = GetVoice() - - if(!handle_some_updates()) - return //We go ahead and process them 5 times for HUD images and other stuff though. - - //Update our name based on whether our face is obscured/disfigured - SetName(get_visible_name()) - /mob/living/carbon/human/get_stamina() return stamina @@ -384,10 +365,16 @@ return TRUE /mob/living/carbon/human/handle_regular_status_updates() - if(!handle_some_updates()) - return 0 - if(status_flags & GODMODE) return 0 + voice = GetVoice() + SetName(get_visible_name()) + + . = ..() + if(!.) + return + + if(status_flags & GODMODE) + return FALSE update_health() // TODO: unify with parent call, Life() PR //SSD check, if a logged player is awake put them back to sleep! @@ -468,6 +455,9 @@ return 1 /mob/living/carbon/human/handle_regular_hud_updates() + fire_alert = 0 //Reset this here, because both breathe() and handle_environment() have a chance to set it. + if(life_tick%30==15) + hud_updateflag = 1022 if(hud_updateflag) // update our mob's hud overlays, AKA what others see flaoting above our head handle_hud_list() . = ..() diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 692f5654662..ccb61a02a77 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -270,6 +270,9 @@ SHOULD_CALL_PARENT(TRUE) + if(!handle_some_updates()) + return FALSE + // Godmode just skips most of this processing. if(status_flags & GODMODE) set_stat(CONSCIOUS) From 905a73d8e493c4a8ed0277923ffe5b39c86cede4 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 2 Jul 2023 23:24:07 +1000 Subject: [PATCH 26/32] Further refining status updates. --- code/modules/mob/living/carbon/alien/life.dm | 60 ++++---- code/modules/mob/living/carbon/brain/life.dm | 104 +++++++------- code/modules/mob/living/carbon/human/life.dm | 136 ++++++++---------- code/modules/mob/living/life.dm | 6 + .../mob/living/silicon/robot/drone/drone.dm | 4 +- code/modules/mob/living/silicon/robot/life.dm | 1 + .../simple_animal/friendly/farm_animals.dm | 8 +- .../hostile/commanded/nanomachines.dm | 11 +- .../simple_animal/hostile/retaliate/drone.dm | 5 +- .../hostile/retaliate/king_of_goats.dm | 2 +- .../living/simple_animal/hostile/vagrant.dm | 4 +- .../mob/living/simple_animal/simple_animal.dm | 22 --- code/modules/mob/living/stasis.dm | 5 + mods/content/xenobiology/slime/life.dm | 17 ++- mods/mobs/borers/mob/borer/borer.dm | 4 +- 15 files changed, 178 insertions(+), 211 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 92cd168f3bd..4135de0cb1b 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -9,44 +9,42 @@ adjustToxLoss(-(rads)) /mob/living/carbon/alien/handle_regular_status_updates() - . = ..() - if(!.) - return + . = ..() update_health() // TODO: unify with parent call, Life() PR if(stat == DEAD) SET_STATUS_MAX(src, STAT_BLIND, 2) set_status(STAT_SILENCE, 0) - else - if(stat == DEAD) - return 1 - if(HAS_STATUS(src, STAT_PARA)) - SET_STATUS_MAX(src, STAT_BLIND, 2) - set_stat(UNCONSCIOUS) - if(getHalLoss() > 0) - adjustHalLoss(-3) - - if(HAS_STATUS(src, STAT_ASLEEP)) + else if(HAS_STATUS(src, STAT_PARA)) + SET_STATUS_MAX(src, STAT_BLIND, 2) + set_stat(UNCONSCIOUS) + if(getHalLoss() > 0) adjustHalLoss(-3) - SET_STATUS_MAX(src, STAT_BLIND, 2) - set_stat(UNCONSCIOUS) - else if(resting) - if(getHalLoss() > 0) - adjustHalLoss(-3) - - else - set_stat(CONSCIOUS) - if(getHalLoss() > 0) - adjustHalLoss(-1) - - // Eyes and blindness. - if(!check_has_eyes()) - SET_STATUS_MAX(src, STAT_BLIND, 2) - SET_STATUS_MAX(src, STAT_BLURRY, 1) - - update_icon() + if(HAS_STATUS(src, STAT_ASLEEP)) + adjustHalLoss(-3) + if (mind) + if(mind.active && client != null) + ADJ_STATUS(src, STAT_ASLEEP, -1) + SET_STATUS_MAX(src, STAT_BLIND, 2) + set_stat(UNCONSCIOUS) + else if(resting) + if(getHalLoss() > 0) + adjustHalLoss(-3) + else + set_stat(CONSCIOUS) + if(getHalLoss() > 0) + adjustHalLoss(-1) - return 1 + // Eyes and blindness. + if(!check_has_eyes()) + set_status(STAT_BLIND, 1) + SET_STATUS_MAX(src, STAT_BLIND, 2) + set_status(STAT_BLURRY, 1) + else if(GET_STATUS(src, STAT_BLIND)) + ADJ_STATUS(src, STAT_BLIND, -1) + SET_STATUS_MAX(src, STAT_BLIND, 2) + update_icon() + return TRUE /mob/living/carbon/alien/handle_regular_hud_updates() . = ..() diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index 50385b4b565..47434d538c7 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -63,67 +63,65 @@ ADJ_STATUS(src, STAT_DIZZY, -4) return TRUE -/mob/living/carbon/brain/should_be_dead() - return (!container && (current_health < config.health_threshold_dead || (config.revival_brain_life >= 0 && (world.time - timeofhostdeath) > config.revival_brain_life)) ) +/mob/living/carbon/brain/is_blind() + return !container || ..() -/mob/living/carbon/brain/handle_regular_status_updates() //TODO: comment out the unused bits >_> +/mob/living/carbon/brain/should_be_dead() + return !container && (health < config.health_threshold_dead || (config.revival_brain_life >= 0 && (world.time - timeofhostdeath) > config.revival_brain_life)) - update_health() // TODO: unify with parent call, Life() PR +/mob/living/carbon/brain/handle_regular_status_updates() - if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP - return 1 + . = ..() + if(!. || stat == DEAD || !emp_damage || !container) + return //Handling EMP effect in the Life(), it's made VERY simply, and has some additional effects handled elsewhere - if(emp_damage) //This is pretty much a damage type only used by MMIs, dished out by the emp_act - if(!(container && istype(container, /obj/item/mmi))) - emp_damage = 0 - else - emp_damage = round(emp_damage,1)//Let's have some nice numbers to work with - switch(emp_damage) - if(31 to INFINITY) - emp_damage = 30//Let's not overdo it - if(21 to 30)//High level of EMP damage, unable to see, hear, or speak - set_status(STAT_BLIND, 1) - SET_STATUS_MAX(src, STAT_DEAF, 1) - set_status(STAT_SILENCE, 1) - if(!alert)//Sounds an alarm, but only once per 'level' - emote("alarm") - to_chat(src, "Major electrical distruption detected: System rebooting.") - alert = 1 - if(prob(75)) - emp_damage -= 1 - if(20) - alert = 0 - set_status(STAT_BLIND, 0) - set_status(STAT_DEAF, 0) - set_status(STAT_SILENCE, 0) + //This is pretty much a damage type only used by MMIs, dished out by the emp_act + emp_damage = round(emp_damage,1)//Let's have some nice numbers to work with + switch(emp_damage) + if(31 to INFINITY) + emp_damage = 30//Let's not overdo it + if(21 to 30)//High level of EMP damage, unable to see, hear, or speak + SET_STATUS_MAX(src, STAT_BLIND, 2) + SET_STATUS_MAX(src, STAT_DEAF, 1) + set_status(STAT_SILENCE, 1) + if(!alert)//Sounds an alarm, but only once per 'level' + emote("alarm") + to_chat(src, SPAN_WARNING("Major electrical distruption detected: System rebooting.")) + alert = 1 + if(prob(75)) emp_damage -= 1 - if(11 to 19)//Moderate level of EMP damage, resulting in nearsightedness and ear damage - set_status(STAT_BLURRY, 1) - set_status(STAT_TINNITUS, 1) - if(!alert) - emote("alert") - to_chat(src, "Primary systems are now online.") - alert = 1 - if(prob(50)) - emp_damage -= 1 - if(10) - alert = 0 - set_status(STAT_BLURRY, 0) - set_status(STAT_TINNITUS, 0) + if(20) + alert = 0 + set_status(STAT_BLIND, 0) + set_status(STAT_DEAF, 0) + set_status(STAT_SILENCE, 0) + emp_damage -= 1 + if(11 to 19)//Moderate level of EMP damage, resulting in nearsightedness and ear damage + set_status(STAT_BLURRY, 1) + set_status(STAT_TINNITUS, 1) + if(!alert) + emote("alert") + to_chat(src, SPAN_WARNING("Primary systems are now online.")) + alert = 1 + if(prob(50)) emp_damage -= 1 - if(2 to 9)//Low level of EMP damage, has few effects(handled elsewhere) - if(!alert) - emote("notice") - to_chat(src, "System reboot nearly complete.") - alert = 1 - if(prob(25)) - emp_damage -= 1 - if(1) - alert = 0 - to_chat(src, "All systems restored.") + if(10) + alert = 0 + set_status(STAT_BLURRY, 0) + set_status(STAT_TINNITUS, 0) + emp_damage -= 1 + if(2 to 9)//Low level of EMP damage, has few effects(handled elsewhere) + if(!alert) + emote("notice") + to_chat(src, SPAN_WARNING("System reboot nearly complete.")) + alert = 1 + if(prob(25)) emp_damage -= 1 - return 1 + if(1) + alert = 0 + to_chat(src, SPAN_WARNING("All systems restored.")) + emp_damage -= 1 /mob/living/carbon/brain/handle_regular_hud_updates() . = ..() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index e1014a5f020..05fb5403eaf 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -369,90 +369,68 @@ voice = GetVoice() SetName(get_visible_name()) - . = ..() - if(!.) - return - if(status_flags & GODMODE) return FALSE - update_health() // TODO: unify with parent call, Life() PR - //SSD check, if a logged player is awake put them back to sleep! - if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP - SET_STATUS_MAX(src, STAT_BLIND, 2) - set_status(STAT_SILENCE, 0) - else //ALIVE. LIGHTS ARE ON - - if(hallucination_power) - handle_hallucinations() - - if(get_shock() >= species.total_health) - if(!stat) - to_chat(src, "[species.halloss_message_self]") - src.visible_message("[src] [species.halloss_message]") - SET_STATUS_MAX(src, STAT_PARA, 10) - - if(HAS_STATUS(src, STAT_PARA) ||HAS_STATUS(src, STAT_ASLEEP)) - SET_STATUS_MAX(src, STAT_BLIND, 2) - set_stat(UNCONSCIOUS) - animate_tail_reset() - adjustHalLoss(-3) - - if(prob(2) && is_asystole() && isSynthetic()) - visible_message("[src] [pick("emits low pitched whirr","beeps urgently")].") - //CONSCIOUS - else - set_stat(CONSCIOUS) - - // Check everything else. - - //Periodically double-check embedded_flag - if(embedded_flag && !(life_tick % 10)) - if(!embedded_needs_process()) - embedded_flag = 0 - - //Resting - if(resting) - if(HAS_STATUS(src, STAT_DIZZY)) - ADJ_STATUS(src, STAT_DIZZY, -15) - if(HAS_STATUS(src, STAT_JITTER)) - ADJ_STATUS(src, STAT_JITTER, -15) - adjustHalLoss(-3) - else - if(HAS_STATUS(src, STAT_DIZZY)) - ADJ_STATUS(src, STAT_DIZZY, -3) - if(HAS_STATUS(src, STAT_JITTER)) - ADJ_STATUS(src, STAT_JITTER, -3) - adjustHalLoss(-1) + if(vsc.contaminant_control.CONTAMINATION_LOSS) + var/total_contamination= 0 + for(var/obj/item/I in src) + if(I.contaminated) + total_contamination += vsc.contaminant_control.CONTAMINATION_LOSS + adjustToxLoss(total_contamination) - if(HAS_STATUS(src, STAT_DROWSY)) - SET_STATUS_MAX(src, STAT_BLURRY, 2) - var/sleepy = GET_STATUS(src, STAT_DROWSY) - if(sleepy > 10) - var/zzzchance = min(5, 5*sleepy/30) - if((prob(zzzchance) || sleepy >= 60)) - if(stat == CONSCIOUS) - to_chat(src, "You are about to fall asleep...") - SET_STATUS_MAX(src, STAT_ASLEEP, 5) - - // If you're dirty, your gloves will become dirty, too. - var/obj/item/gloves = get_equipped_item(slot_gloves_str) - if(gloves && germ_level > gloves.germ_level && prob(10)) - gloves.germ_level += 1 - - if(vsc.contaminant_control.CONTAMINATION_LOSS) - var/total_contamination= 0 - for(var/obj/item/I in src) - if(I.contaminated) - total_contamination += vsc.contaminant_control.CONTAMINATION_LOSS - adjustToxLoss(total_contamination) - - if(stasis_value > 1 && GET_STATUS(src, STAT_DROWSY) < stasis_value * 4) - ADJ_STATUS(src, STAT_DROWSY, min(stasis_value, 3)) - if(!stat && prob(1)) - to_chat(src, "You feel slow and sluggish...") + . = ..() + if(!.) + return + + if(hallucination_power) + handle_hallucinations() + + if(get_shock() >= species.total_health) + if(!stat) + to_chat(src, "[species.halloss_message_self]") + src.visible_message("[src] [species.halloss_message]") + SET_STATUS_MAX(src, STAT_PARA, 10) + + if(HAS_STATUS(src, STAT_PARA) || HAS_STATUS(src, STAT_ASLEEP)) + set_stat(UNCONSCIOUS) + animate_tail_reset() + adjustHalLoss(-3) + if(prob(2) && is_asystole() && isSynthetic()) + visible_message("[src] [pick("emits low pitched whirr","beeps urgently")].") + else + set_stat(CONSCIOUS) + + // Check everything else. + //Periodically double-check embedded_flag + if(embedded_flag && !(life_tick % 10)) + if(!embedded_needs_process()) + embedded_flag = 0 + + //Resting + if(resting) + if(HAS_STATUS(src, STAT_DIZZY)) + ADJ_STATUS(src, STAT_DIZZY, -15) + if(HAS_STATUS(src, STAT_JITTER)) + ADJ_STATUS(src, STAT_JITTER, -15) + adjustHalLoss(-3) + else + if(HAS_STATUS(src, STAT_DIZZY)) + ADJ_STATUS(src, STAT_DIZZY, -3) + if(HAS_STATUS(src, STAT_JITTER)) + ADJ_STATUS(src, STAT_JITTER, -3) + adjustHalLoss(-1) + + if(HAS_STATUS(src, STAT_DROWSY)) + SET_STATUS_MAX(src, STAT_BLURRY, 2) + var/sleepy = GET_STATUS(src, STAT_DROWSY) + if(sleepy > 10) + var/zzzchance = min(5, 5*sleepy/30) + if((prob(zzzchance) || sleepy >= 60)) + if(stat == CONSCIOUS) + to_chat(src, SPAN_NOICE("You are about to fall asleep...")) + SET_STATUS_MAX(src, STAT_ASLEEP, 5) - return 1 /mob/living/carbon/human/handle_regular_hud_updates() fire_alert = 0 //Reset this here, because both breathe() and handle_environment() have a chance to set it. diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index ccb61a02a77..98ca74a0130 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -282,6 +282,10 @@ // Increase germ_level regularly if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level germ_level++ + // If you're dirty, your gloves will become dirty, too. + var/obj/item/gloves = get_equipped_item(slot_gloves_str) + if(gloves && germ_level > gloves.germ_level && prob(10)) + gloves.germ_level++ // Check if we are (or should be) dead at this point. if(stat == DEAD) @@ -289,6 +293,8 @@ updatehealth() if(should_be_dead() && stat != DEAD) death() + set_status(STAT_BLIND, 0) + set_status(STAT_SILENCE, 0) return FALSE // Handle some general state updates. diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index c529954a21a..6f7c2c03fd1 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -246,8 +246,8 @@ /mob/living/silicon/robot/drone/death() if(stat != DEAD && should_be_dead()) self_destruct() - return - return ..() + return FALSE + . = ..() /mob/living/silicon/robot/drone/self_destruct() timeofdeath = world.time diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 3713f42a416..7417d421591 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -71,6 +71,7 @@ return current_health < config.health_threshold_dead /mob/living/silicon/robot/handle_regular_status_updates() + SHOULD_CALL_PARENT(FALSE) update_health() if(HAS_STATUS(src, STAT_ASLEEP)) diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 5adf2bbb7e3..3568d883147 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -65,7 +65,7 @@ QDEL_NULL(udder) . = ..() -/mob/living/simple_animal/hostile/retaliate/goat/handle_regular_status_updates() +/mob/living/simple_animal/hostile/retaliate/goat/handle_living_non_stasis_processes() . = ..() if(. && stat == CONSCIOUS && udder && prob(5)) udder.add_reagent(/decl/material/liquid/drink/milk, rand(5, 10)) @@ -139,7 +139,7 @@ return TRUE . = ..() -/mob/living/simple_animal/cow/handle_regular_status_updates() +/mob/living/simple_animal/cow/handle_living_non_stasis_processes() . = ..() if(. && udder && prob(5)) udder.add_reagent(/decl/material/liquid/drink/milk, rand(5, 10)) @@ -183,7 +183,7 @@ pixel_x = rand(-6, 6) pixel_y = rand(0, 10) -/mob/living/simple_animal/chick/handle_regular_status_updates() +/mob/living/simple_animal/chick/handle_living_non_stasis_processes() . = ..() if(.) amount_grown += rand(1,2) @@ -249,7 +249,7 @@ var/global/chicken_count = 0 else ..() -/mob/living/simple_animal/chicken/handle_regular_status_updates() +/mob/living/simple_animal/chicken/handle_living_non_stasis_processes() . = ..() if(. && prob(3) && eggsleft > 0) visible_message("[src] [pick("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")]") diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm index 9a9fa706cf0..8710a382067 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm @@ -40,12 +40,13 @@ if(COMMANDED_HEALING) swarm.heal() -/mob/living/simple_animal/hostile/commanded/nanomachine/handle_regular_status_updates() +/mob/living/simple_animal/hostile/commanded/nanomachine/handle_living_non_stasis_processes() . = ..() - regen_time++ - if(regen_time == 2 && current_health < get_max_health()) //slow regen - regen_time = 0 - heal_overall_damage(1) + if(.) + regen_time++ + if(regen_time == 2 && health < maxHealth) //slow regen + regen_time = 0 + heal_overall_damage(1) /mob/living/simple_animal/hostile/commanded/nanomachine/death(gibbed, deathmessage, show_dead_message) ..(null, "dissipates into thin air", "You have been destroyed.") diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index 94eddd8b291..e0d30571c1c 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -85,8 +85,11 @@ . -= M //self repair systems have a chance to bring the drone back to life -/mob/living/simple_animal/hostile/retaliate/malf_drone/handle_regular_status_updates() +/mob/living/simple_animal/hostile/retaliate/malf_drone/handle_living_non_stasis_processes() . = ..() + if(!.) + return + //emps and lots of damage can temporarily shut us down if(disabled > 0) set_stat(UNCONSCIOUS) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm index 37ef546464e..017b5fe527f 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm @@ -190,7 +190,7 @@ set_scale(1.25) default_pixel_y = 10 -/mob/living/simple_animal/hostile/retaliate/goat/king/phase2/handle_regular_status_updates() +/mob/living/simple_animal/hostile/retaliate/goat/king/phase2/handle_living_non_stasis_processes() . = ..() if(!.) return FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/vagrant.dm b/code/modules/mob/living/simple_animal/hostile/vagrant.dm index ddfe5bf8287..36ad1d84c93 100644 --- a/code/modules/mob/living/simple_animal/hostile/vagrant.dm +++ b/code/modules/mob/living/simple_animal/hostile/vagrant.dm @@ -42,7 +42,7 @@ if(stat == DEAD && !QDELETED(src) && !gibbed) gib() -/mob/living/simple_animal/hostile/vagrant/handle_regular_status_updates() +/mob/living/simple_animal/hostile/vagrant/handle_living_non_stasis_processes() . = ..() if(!.) return FALSE @@ -56,7 +56,7 @@ gripping.vessel.remove_any(blood_per_tick) heal_overall_damage(health_per_tick) if(prob(15)) - to_chat(gripping, "You feel your fluids being drained!") + to_chat(gripping, SPAN_DANGER("You feel your fluids being drained!")) else gripping = null diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 14516e656ef..0a7ce1a85f4 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -172,28 +172,6 @@ var/global/list/simplemob_icon_bitflag_cache = list() /mob/living/simple_animal/handle_regular_status_updates() . = ..() - if(!.) - return FALSE - if(is_aquatic && !submerged() && stat != DEAD) - walk(src, 0) - if(!HAS_STATUS(src, STAT_PARA)) // gated to avoid redundant update_icon() calls. - SET_STATUS_MAX(src, STAT_PARA, 3) - update_icon() - if(z && !living_observers_present(SSmapping.get_connected_levels(z))) - - if(health <= 0) - death() - else if(health > maxHealth) - health = maxHealth - - if(stat == DEAD) - if(current_health > 0) - switch_from_dead_to_living_mob_list() - set_stat(CONSCIOUS) - set_density(1) - update_icon() - return - if(purge) purge -= 1 if(can_bleed && bleed_ticks > 0) diff --git a/code/modules/mob/living/stasis.dm b/code/modules/mob/living/stasis.dm index 490b49be8e4..9fc4fa3695f 100644 --- a/code/modules/mob/living/stasis.dm +++ b/code/modules/mob/living/stasis.dm @@ -16,6 +16,11 @@ stasis_value += stasis_sources[source] stasis_sources = null + if(stasis_value > 1 && GET_STATUS(src, STAT_DROWSY) < stasis_value * 4) + ADJ_STATUS(src, STAT_DROWSY, min(stasis_value, 3)) + if(stat == CONSCIOUS && prob(1)) + to_chat(src, SPAN_NOTICE("You feel slow and sluggish...")) + /mob/living/proc/get_cryogenic_factor(var/bodytemperature) if(isSynthetic()) diff --git a/mods/content/xenobiology/slime/life.dm b/mods/content/xenobiology/slime/life.dm index 6019ba38a48..5c16db54e99 100644 --- a/mods/content/xenobiology/slime/life.dm +++ b/mods/content/xenobiology/slime/life.dm @@ -34,16 +34,15 @@ change = -(change) bodytemperature += (min(loc_temp, current + change) - current) -/mob/living/slime/handle_regular_status_updates() +/mob/living/slime/handle_living_non_stasis_processes() . = ..() - if(stat != DEAD) - set_stat(CONSCIOUS) - if(prob(30)) - adjustOxyLoss(-1) - adjustToxLoss(-1) - adjustFireLoss(-1) - adjustCloneLoss(-1) - adjustBruteLoss(-1) + set_stat(CONSCIOUS) + if(prob(30)) + adjustOxyLoss(-1) + adjustToxLoss(-1) + adjustFireLoss(-1) + adjustCloneLoss(-1) + adjustBruteLoss(-1) /mob/living/slime/proc/handle_turf_contents() // If we're standing on top of a dead mob or small items, we can diff --git a/mods/mobs/borers/mob/borer/borer.dm b/mods/mobs/borers/mob/borer/borer.dm index dec19b154d0..e92806d6e3a 100644 --- a/mods/mobs/borers/mob/borer/borer.dm +++ b/mods/mobs/borers/mob/borer/borer.dm @@ -95,9 +95,9 @@ if(host.sdisabilities & DEAFENED) sdisabilities |= DEAFENED -/mob/living/simple_animal/borer/handle_regular_status_updates() +/mob/living/simple_animal/borer/handle_living_non_stasis_processes() . = ..() - if(!host || stat || host.stat) + if(!. || !host || host.stat) return if(host.reagents.has_reagent(/decl/material/liquid/nutriment/sugar)) if(!docile) From a44a0177c10169b0b53b7e53e959e477a1cb33d7 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 2 Jul 2023 23:38:37 +1000 Subject: [PATCH 27/32] Dismantling pAI Life(). --- code/modules/mob/living/carbon/human/life.dm | 2 +- code/modules/mob/living/silicon/pai/life.dm | 47 +++++++++++--------- code/modules/mob/living/silicon/pai/pai.dm | 9 ++-- code/modules/mob/living/silicon/pai/say.dm | 2 +- 4 files changed, 31 insertions(+), 29 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 05fb5403eaf..be683d6dde5 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -428,7 +428,7 @@ var/zzzchance = min(5, 5*sleepy/30) if((prob(zzzchance) || sleepy >= 60)) if(stat == CONSCIOUS) - to_chat(src, SPAN_NOICE("You are about to fall asleep...")) + to_chat(src, SPAN_NOTICE("You are about to fall asleep...")) SET_STATUS_MAX(src, STAT_ASLEEP, 5) diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index b6ed6962fff..db82beefc46 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -1,31 +1,36 @@ -/mob/living/silicon/pai/Life() +/mob/living/silicon/pai/handle_regular_hud_updates() + . = ..() + if(.) + if(src.secHUD == 1) + process_sec_hud(src, 1, network = get_computer_network()) + if(src.medHUD == 1) + process_med_hud(src, 1, network = get_computer_network()) + +/mob/living/silicon/pai/handle_regular_status_updates() + . = ..() + if(src.cable && get_dist(src, cable) > 1) + visible_message( \ + message = SPAN_NOTICE("The data cable rapidly retracts back into its spool."), \ + blind_message = SPAN_NOTICE("You hear a click and the sound of wire spooling rapidly.")) + QDEL_NULL(cable) + +/mob/living/silicon/pai/death(gibbed, deathmessage, show_dead_message) + return ..(deathmessage = "gives one shrill beep before falling lifeless.") +/mob/living/silicon/pai/Life() SHOULD_CALL_PARENT(FALSE) update_health() if (src.stat == DEAD) return - - if(src.cable) - if(get_dist(src, cable) > 1) - visible_message( \ - message = SPAN_NOTICE("The data cable rapidly retracts back into its spool."), \ - blind_message = SPAN_NOTICE("You hear a click and the sound of wire spooling rapidly.")) - QDEL_NULL(cable) - handle_regular_hud_updates() - - if(src.secHUD == 1) - process_sec_hud(src, 1, network = get_computer_network()) - - if(src.medHUD == 1) - process_med_hud(src, 1, network = get_computer_network()) - process_os() // better safe than sorry, in case some pAI has it - if(silence_time) - if(world.timeofday >= silence_time) - silence_time = null - to_chat(src, SPAN_NOTICE("Communication circuit reinitialized. Speech and messaging functionality restored.")) - handle_status_effects() + +/mob/living/silicon/pai/updatehealth() + if(status_flags & GODMODE) + health = 100 + set_stat(CONSCIOUS) + else + health = 100 - getBruteLoss() - getFireLoss() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index e84d57e0ee2..484ae76783b 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -59,8 +59,6 @@ var/global/list/possible_say_verbs = list( var/pai_law0 = "Serve your master." var/pai_laws // String for additional operating instructions our master might give us - var/silence_time // Timestamp when we were silenced (normally via EMP burst), set to null after silence has faded - // Various software-specific vars var/secHUD = 0 // Toggles whether the Security HUD is active or not @@ -107,9 +105,8 @@ var/global/list/possible_say_verbs = list( // this function shows the information about being silenced as a pAI in the Status panel /mob/living/silicon/pai/proc/show_silenced() - if(silence_time) - var/timeleft = round((silence_time - world.timeofday)/10 ,1) - stat(null, "Communications system reboot in -[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]") + var/timeleft = round((HAS_STATUS(src, STAT_SILENCE) * SSmobs.wait) / 10, 1) + stat(null, "Communications system reboot in -[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]") /mob/living/silicon/pai/Stat() . = ..() @@ -132,7 +129,7 @@ var/global/list/possible_say_verbs = list( // 33% chance to change prime directive (based on severity) // 33% chance of no additional effect - silence_time = world.timeofday + 120 * 10 // Silence for 2 minutes + SET_STATUS_MAX(src, STAT_SILENCE, 2 MINUTES) to_chat(src, SPAN_DANGER("Communication circuit overload. Shutting down and reloading communication circuits - speech and messaging functionality will be unavailable until the reboot is complete.")) if(prob(20)) visible_message( \ diff --git a/code/modules/mob/living/silicon/pai/say.dm b/code/modules/mob/living/silicon/pai/say.dm index efc75877826..732261c052d 100644 --- a/code/modules/mob/living/silicon/pai/say.dm +++ b/code/modules/mob/living/silicon/pai/say.dm @@ -1,5 +1,5 @@ /mob/living/silicon/pai/say(var/msg) - if(silence_time) + if(HAS_STATUS(src, STAT_SILENCE)) to_chat(src, SPAN_WARNING("Communication circuits are disabled.")) return return ..(msg) From 817450b8f406277a4afcf188d788d531e6aa313f Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 2 Jul 2023 23:43:10 +1000 Subject: [PATCH 28/32] Dismantling robot life(). --- code/modules/mob/living/life.dm | 2 +- code/modules/mob/living/silicon/pai/life.dm | 14 ++------ code/modules/mob/living/silicon/robot/life.dm | 35 +++---------------- 3 files changed, 8 insertions(+), 43 deletions(-) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 98ca74a0130..a6441858b7b 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -4,7 +4,7 @@ ..() - if (HasMovementHandler(/datum/movement_handler/mob/transformation/)) + if (HasMovementHandler(/datum/movement_handler/mob/transformation)) return // update the current life tick, can be used to e.g. only do something every 4 ticks diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index db82beefc46..f2c5a07045a 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -8,6 +8,7 @@ /mob/living/silicon/pai/handle_regular_status_updates() . = ..() + process_os() // better safe than sorry, in case some pAI has it if(src.cable && get_dist(src, cable) > 1) visible_message( \ message = SPAN_NOTICE("The data cable rapidly retracts back into its spool."), \ @@ -17,20 +18,9 @@ /mob/living/silicon/pai/death(gibbed, deathmessage, show_dead_message) return ..(deathmessage = "gives one shrill beep before falling lifeless.") -/mob/living/silicon/pai/Life() - SHOULD_CALL_PARENT(FALSE) - - update_health() - if (src.stat == DEAD) - return - handle_regular_hud_updates() - process_os() // better safe than sorry, in case some pAI has it - - handle_status_effects() - /mob/living/silicon/pai/updatehealth() if(status_flags & GODMODE) health = 100 set_stat(CONSCIOUS) else - health = 100 - getBruteLoss() - getFireLoss() \ No newline at end of file + health = 100 - getBruteLoss() - getFireLoss() diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 7417d421591..a428261a854 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -1,39 +1,12 @@ -/mob/living/silicon/robot/Life() - - SHOULD_CALL_PARENT(FALSE) - - set invisibility = FALSE - set background = 1 - - if (HAS_TRANSFORMATION_MOVEMENT_HANDLER(src)) - return - - //Status updates, death etc. - clamp_values() - handle_regular_status_updates() - handle_actions() - - if(client) - handle_regular_hud_updates() - update_items() - if (src.stat != DEAD) //still using power +/mob/living/silicon/robot/handle_living_non_stasis_processes() + . = ..() + if(.) use_power() process_killswitch() process_locks() process_queued_alarms() process_os() - handle_status_effects() - UpdateLyingBuckledAndVerbStatus() - -/mob/living/silicon/robot/proc/clamp_values() - set_status(STAT_PARA, min(GET_STATUS(src, STAT_PARA), 30)) - set_status(STAT_ASLEEP, 0) - adjustBruteLoss(0) - adjustToxLoss(0) - adjustOxyLoss(0) - adjustFireLoss(0) - /mob/living/silicon/robot/proc/use_power() used_power_this_tick = 0 for(var/V in components) @@ -74,6 +47,7 @@ SHOULD_CALL_PARENT(FALSE) update_health() + set_status(STAT_PARA, min(GET_STATUS(src, STAT_PARA), 30)) if(HAS_STATUS(src, STAT_ASLEEP)) SET_STATUS_MAX(src, STAT_PARA, 3) @@ -232,6 +206,7 @@ set_fullscreen(GET_STATUS(src, STAT_BLURRY), "blurry", /obj/screen/fullscreen/blurry) set_fullscreen(GET_STATUS(src, STAT_DRUGGY), "high", /obj/screen/fullscreen/high) + update_items() return 1 /mob/living/silicon/robot/handle_vision() From 5640831a3c1918d4dc2a9e87c0273f29c8e0187e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 2 Jul 2023 23:45:41 +1000 Subject: [PATCH 29/32] Dismantling AI life(). --- code/modules/mob/living/silicon/ai/life.dm | 27 ++++++++-------------- 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index faa97d12108..4a77484086b 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -1,48 +1,39 @@ /mob/living/silicon/ai/should_be_dead() return get_health_percent() <= 0 || backup_capacitor() <= 0 -/mob/living/silicon/ai/Life() - SHOULD_CALL_PARENT(FALSE) +/mob/living/silicon/ai/should_be_dead() + return ((hardware_integrity() <= 0) || (backup_capacitor() <= 0)) - if (src.stat!=CONSCIOUS) +/mob/living/silicon/ai/handle_regular_status_updates() + . = ..() + if(stat != CONSCIOUS) src.cameraFollow = null src.reset_view(null) - update_health() // TODO: move to handle_regular_status_updates() and preserve parent call chain, Life() PR - if(stat == DEAD) - return +/mob/living/silicon/ai/update_lying() + lying = FALSE +/mob/living/silicon/ai/handle_living_non_stasis_processes() + . = ..() // If our powersupply object was destroyed somehow, create new one. if(!psupply) create_powersupply() - - lying = 0 // Handle lying down - // We aren't shut down, and we lack external power. Try to fix it using the restoration routine. if (!self_shutdown && !has_power(0)) // AI's restore power routine is not running. Start it automatically. if(aiRestorePowerRoutine == AI_RESTOREPOWER_IDLE) aiRestorePowerRoutine = AI_RESTOREPOWER_STARTING handle_power_failure() - - handle_impaired_vision() update_power_usage() handle_power_oxyloss() - update_sight() - process_queued_alarms() - handle_regular_hud_updates() - switch(src.sensor_mode) if (SEC_HUD) process_sec_hud(src,0,src.eyeobj,get_computer_network()) if (MED_HUD) process_med_hud(src,0,src.eyeobj,get_computer_network()) - process_os() - handle_status_effects() - if(controlling_drone && stat != CONSCIOUS) controlling_drone.release_ai_control("WARNING: Primary control loop failure. Session terminated.") From a15e1be682d1abc9fbe7b203f5337c51bd65cea3 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 2 Jul 2023 23:59:01 +1000 Subject: [PATCH 30/32] Reverting some status changes. --- code/__defines/mob_status.dm | 7 ++++--- code/modules/mob/living/living_status.dm | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/code/__defines/mob_status.dm b/code/__defines/mob_status.dm index 606fc086ec5..42bc8854a7a 100644 --- a/code/__defines/mob_status.dm +++ b/code/__defines/mob_status.dm @@ -1,4 +1,5 @@ +#define PENDING_STATUS(MOB, COND) (LAZYACCESS(MOB.pending_status_counters, COND) || LAZYACCESS(MOB.status_counters, COND)) #define GET_STATUS(MOB, COND) (LAZYACCESS(MOB.status_counters, COND)) -#define HAS_STATUS(MOB, COND) ((LAZYACCESS(MOB.pending_status_counters, COND) || LAZYACCESS(MOB.status_counters, COND)) > 0) -#define ADJ_STATUS(MOB, COND, AMT) (MOB.set_status(COND, HAS_STATUS(MOB, COND) + AMT)) -#define SET_STATUS_MAX(MOB, COND, AMT) (MOB.set_status(COND, max(HAS_STATUS(MOB, COND), AMT))) +#define HAS_STATUS(MOB, COND) (GET_STATUS(MOB, COND) > 0) +#define ADJ_STATUS(MOB, COND, AMT) (MOB.set_status(COND, PENDING_STATUS(MOB, COND) + AMT)) +#define SET_STATUS_MAX(MOB, COND, AMT) (MOB.set_status(COND, max(PENDING_STATUS(MOB, COND), AMT))) \ No newline at end of file diff --git a/code/modules/mob/living/living_status.dm b/code/modules/mob/living/living_status.dm index fa7abf8bd2e..1014107e700 100644 --- a/code/modules/mob/living/living_status.dm +++ b/code/modules/mob/living/living_status.dm @@ -10,7 +10,7 @@ if(!cond.check_can_set(src)) return FALSE amount = clamp(amount, 0, 1000) - if(amount == HAS_STATUS(src, condition)) + if(amount == PENDING_STATUS(src, condition)) return FALSE LAZYSET(pending_status_counters, condition, amount) addtimer(CALLBACK(src, .proc/apply_pending_status_changes), 0, TIMER_UNIQUE) From c53650843836945a1e9784f341461a669565d778 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 3 Jul 2023 00:11:13 +1000 Subject: [PATCH 31/32] Post-rebase update. --- code/modules/mechs/mech_life.dm | 15 ++-- code/modules/mob/living/carbon/alien/life.dm | 2 +- code/modules/mob/living/carbon/brain/brain.dm | 2 - code/modules/mob/living/carbon/brain/life.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 3 - code/modules/mob/living/life.dm | 14 +--- code/modules/mob/living/living.dm | 2 + code/modules/mob/living/living_defines.dm | 2 +- code/modules/mob/living/silicon/ai/life.dm | 4 - code/modules/mob/living/silicon/pai/life.dm | 7 -- .../hostile/commanded/nanomachines.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 19 +++-- mods/content/xenobiology/slime/life.dm | 83 ++++++++++--------- 13 files changed, 71 insertions(+), 86 deletions(-) diff --git a/code/modules/mechs/mech_life.dm b/code/modules/mechs/mech_life.dm index 69ec34b417c..ad1964eb516 100644 --- a/code/modules/mechs/mech_life.dm +++ b/code/modules/mechs/mech_life.dm @@ -34,19 +34,12 @@ if(istype(M) && M.active && M.passive_power_use) M.deactivate() - update_health() // TODO: move to handle_regular_status_updates(), Life PR - if(emp_damage > 0) emp_damage -= min(1, emp_damage) //Reduce emp accumulation over time /mob/living/exosuit/proc/is_suit_powered() return (get_cell()?.drain_power(0, 0, calc_power_draw())) > 0 -/mob/living/exosuit/handle_environment(datum/gas_mixture/environment) - if(body) - body.update_air(hatch_closed && use_air) - . = ..() - /mob/living/exosuit/get_cell(force) RETURN_TYPE(/obj/item/cell) if(power == MECH_POWER_ON || force) //For most intents we can assume that a powered off exosuit acts as if it lacked a cell @@ -72,7 +65,13 @@ /mob/living/exosuit/handle_environment(var/datum/gas_mixture/environment) ..() - if(!environment) return + + if(body) + body.update_air(hatch_closed && use_air) + + if(!environment) + return + //Mechs and vehicles in general can be assumed to just tend to whatever ambient temperature if(abs(environment.temperature - bodytemperature) > 0 ) bodytemperature += ((environment.temperature - bodytemperature) / 6) diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 4135de0cb1b..04a3e322368 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -11,7 +11,7 @@ /mob/living/carbon/alien/handle_regular_status_updates() . = ..() - update_health() // TODO: unify with parent call, Life() PR + if(stat == DEAD) SET_STATUS_MAX(src, STAT_BLIND, 2) set_status(STAT_SILENCE, 0) diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index 834a772a439..9380fd3eef7 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -18,8 +18,6 @@ /mob/living/carbon/brain/Destroy() if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting. - if(stat!=DEAD) //If not dead. - death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA ghostize() //Ghostize checks for key so nothing else is necessary. . = ..() diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index 47434d538c7..c38a51ff930 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -67,7 +67,7 @@ return !container || ..() /mob/living/carbon/brain/should_be_dead() - return !container && (health < config.health_threshold_dead || (config.revival_brain_life >= 0 && (world.time - timeofhostdeath) > config.revival_brain_life)) + return !container && (current_health < config.health_threshold_dead || (config.revival_brain_life >= 0 && (world.time - timeofhostdeath) > config.revival_brain_life)) /mob/living/carbon/brain/handle_regular_status_updates() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index be683d6dde5..4371599630c 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -37,12 +37,9 @@ var/stamina = 100 /mob/living/carbon/human/handle_living_non_stasis_processes() - //Updates the number of stored chemicals for powers - handle_changeling() last_pain = null // Clear the last cached pain value so further getHalloss() calls won't use an old value. //Organs and blood handle_organs() - stabilize_body_temperature() //Body temperature adjusts itself (self-regulation) handle_shock() handle_pain() handle_stamina() diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index a6441858b7b..af99d264ffe 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -263,13 +263,13 @@ sound_to(src, sound(send_sound, repeat = TRUE, wait = 0, volume = 30, channel = sound_channels.weather_channel)) //This updates the health and status of the mob (conscious, unconscious, dead) -/mob/living/proc/should_be_dead() - return health < 0 - /mob/living/proc/handle_regular_status_updates() SHOULD_CALL_PARENT(TRUE) + // Check if we are (or should be) dead at this point. + update_health() + if(!handle_some_updates()) return FALSE @@ -287,15 +287,9 @@ if(gloves && germ_level > gloves.germ_level && prob(10)) gloves.germ_level++ - // Check if we are (or should be) dead at this point. + // If we're dead, don't continue further. if(stat == DEAD) return FALSE - updatehealth() - if(should_be_dead() && stat != DEAD) - death() - set_status(STAT_BLIND, 0) - set_status(STAT_SILENCE, 0) - return FALSE // Handle some general state updates. if(HAS_STATUS(src, STAT_PARA)) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 1ac0e80cd5a..21da555e7fd 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -202,10 +202,12 @@ default behaviour is: return (getOxyLoss()+getToxLoss()+getFireLoss()+getBruteLoss()+getCloneLoss()+getHalLoss()) /mob/living/proc/update_health() + SHOULD_CALL_PARENT(TRUE) if(status_flags & GODMODE) current_health = get_max_health() set_stat(CONSCIOUS) return + var/max_health = get_max_health() current_health = clamp(max_health-get_total_life_damage(), -(max_health), max_health) if(stat != DEAD && should_be_dead()) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index daa5cf114a7..7eab17ec15a 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -6,7 +6,7 @@ //Health and life related vars var/mob_default_max_health = 100 //Maximum health that should be possible. - var/current_health = INFINITY // A mob's current health. Set by updatehealth(). Defaults to INFINITY so mobs don't die on init. + var/current_health = INFINITY // A mob's current health. Set by update_health(). Defaults to INFINITY so mobs don't die on init. var/hud_updateflag = 0 diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 4a77484086b..68df276f1d2 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -1,10 +1,6 @@ /mob/living/silicon/ai/should_be_dead() return get_health_percent() <= 0 || backup_capacitor() <= 0 - -/mob/living/silicon/ai/should_be_dead() - return ((hardware_integrity() <= 0) || (backup_capacitor() <= 0)) - /mob/living/silicon/ai/handle_regular_status_updates() . = ..() if(stat != CONSCIOUS) diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index f2c5a07045a..c59c817f66a 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -17,10 +17,3 @@ /mob/living/silicon/pai/death(gibbed, deathmessage, show_dead_message) return ..(deathmessage = "gives one shrill beep before falling lifeless.") - -/mob/living/silicon/pai/updatehealth() - if(status_flags & GODMODE) - health = 100 - set_stat(CONSCIOUS) - else - health = 100 - getBruteLoss() - getFireLoss() diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm index 8710a382067..2844891e93b 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm @@ -44,7 +44,7 @@ . = ..() if(.) regen_time++ - if(regen_time == 2 && health < maxHealth) //slow regen + if(regen_time == 2 && current_health < get_max_health()) //slow regen regen_time = 0 heal_overall_damage(1) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 0a7ce1a85f4..4979d1244e4 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -171,16 +171,17 @@ var/global/list/simplemob_icon_bitflag_cache = list() . = ..() /mob/living/simple_animal/handle_regular_status_updates() - . = ..() if(purge) purge -= 1 - if(can_bleed && bleed_ticks > 0) - handle_bleeding() - if(is_aquatic && !submerged()) - walk(src, 0) - if(HAS_STATUS(src, STAT_PARA)) - SET_STATUS_MAX(src, STAT_PARA, 3) - update_icon() + . = ..() + if(.) + if(can_bleed && bleed_ticks > 0) + handle_bleeding() + if(is_aquatic && !submerged()) + walk(src, 0) + if(HAS_STATUS(src, STAT_PARA)) + SET_STATUS_MAX(src, STAT_PARA, 3) + update_icon() /mob/living/simple_animal/handle_some_updates() . = ..() && (!z || living_observers_present(SSmapping.get_connected_levels(z))) @@ -241,7 +242,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() visible_emote("[pick(emote_see)].") /mob/living/simple_animal/handle_environment(datum/gas_mixture/environment) - + . = ..() var/atmos_suitable = TRUE if(environment) // don't bother checking it twice if we got a supplied FALSE val. diff --git a/mods/content/xenobiology/slime/life.dm b/mods/content/xenobiology/slime/life.dm index 5c16db54e99..bdab275be05 100644 --- a/mods/content/xenobiology/slime/life.dm +++ b/mods/content/xenobiology/slime/life.dm @@ -1,50 +1,17 @@ /mob/living/slime/handle_environment(datum/gas_mixture/environment) . = ..() - handle_turf_contents() - handle_local_conditions() -/mob/living/slime/handle_nutrition_and_hydration() - . = ..() - if(feeding_on) - slime_feed() - ingested.metabolize() - -/mob/living/slime/fluid_act(datum/reagents/fluids) - . = ..() - if(!QDELETED(src) && fluids?.total_volume >= FLUID_SHALLOW && stat == DEAD) - var/turf/T = get_turf(src) - if(T) - T.add_fluid(/decl/material/liquid/slimejelly, (is_adult ? rand(30, 40) : rand(10, 30))) - visible_message(SPAN_DANGER("\The [src] melts away...")) // Slimes are water soluble. - qdel(src) - -/mob/living/slime/proc/handle_local_conditions() - var/datum/gas_mixture/environment = loc?.return_air() - adjust_body_temperature(bodytemperature, (environment?.temperature || T0C), 1) + if(environment) + var/delta = abs(bodytemperature - environment.temperature) + var/change = (delta / (delta > 50 ? 5 : 10)) + if(bodytemperature > environment.temperature) + change = -(change) + bodytemperature += (min(environment.temperature, bodytemperature + change) - bodytemperature) if(bodytemperature <= die_temperature) adjustToxLoss(200) - death() else if(bodytemperature <= hurt_temperature) adjustToxLoss(30, do_update_health = TRUE) -/mob/living/slime/proc/adjust_body_temperature(current, loc_temp, boost) - var/delta = abs(current-loc_temp) - var/change = (delta / (delta > 50 ? 5 : 10)) * boost - if(current > loc_temp) - change = -(change) - bodytemperature += (min(loc_temp, current + change) - current) - -/mob/living/slime/handle_living_non_stasis_processes() - . = ..() - set_stat(CONSCIOUS) - if(prob(30)) - adjustOxyLoss(-1) - adjustToxLoss(-1) - adjustFireLoss(-1) - adjustCloneLoss(-1) - adjustBruteLoss(-1) - -/mob/living/slime/proc/handle_turf_contents() // If we're standing on top of a dead mob or small items, we can // ingest it (or just melt it a little if we're too small) // Also helps to keep our cell tidy! @@ -75,13 +42,51 @@ if(length(contents) != last_contents_length) queue_icon_update() +/mob/living/slime/handle_nutrition_and_hydration() + . = ..() + if(feeding_on) + slime_feed() + ingested.metabolize() + +/mob/living/slime/fluid_act(datum/reagents/fluids) + . = ..() + if(!QDELETED(src) && fluids?.total_volume >= FLUID_SHALLOW && stat == DEAD) + var/turf/T = get_turf(src) + if(T) + T.add_fluid(/decl/material/liquid/slimejelly, (is_adult ? rand(30, 40) : rand(10, 30))) + visible_message(SPAN_DANGER("\The [src] melts away...")) // Slimes are water soluble. + qdel(src) + /mob/living/slime/get_hunger_factor() return (0.1 + 0.05 * is_adult) /mob/living/slime/get_thirst_factor() return 0 +/mob/living/slime/fluid_act(datum/reagents/fluids) + . = ..() + if(stat == DEAD) + var/obj/effect/fluid/F = locate() in loc + if(F && F.reagents?.total_volume >= FLUID_SHALLOW) + F.reagents.add_reagent(/decl/material/liquid/slimejelly, (is_adult ? rand(30, 40) : rand(10, 30))) + visible_message(SPAN_DANGER("\The [src] melts away...")) // Slimes are water soluble. + qdel(src) + +/mob/living/slime/handle_living_non_stasis_processes() + . = ..() + set_stat(CONSCIOUS) + if(prob(30)) + adjustOxyLoss(-1) + adjustToxLoss(-1) + adjustFireLoss(-1) + adjustCloneLoss(-1) + adjustBruteLoss(-1) + /mob/living/slime/handle_nutrition_and_hydration() + . = ..() + if(feeding_on) + slime_feed() + ingested.metabolize() // Digest whatever we've got floating around in our goop. if(length(contents)) From df08fd4769866e3ed8d837f7c5e61ab991019ec1 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 16 Jun 2023 19:02:15 +1000 Subject: [PATCH 32/32] Condensed HUD rewrite commit, do not merge. --- code/__defines/hud.dm | 4 + code/_onclick/click.dm | 4 +- code/_onclick/hud/_defines.dm | 1 - code/_onclick/hud/_hud.dm | 539 ++++++++++++++++++ code/_onclick/hud/ability_screen_objects.dm | 22 +- code/_onclick/hud/ai.dm | 6 +- code/_onclick/hud/ai_screen_objects.dm | 2 +- code/_onclick/hud/animal.dm | 9 - code/_onclick/hud/constructs.dm | 72 +++ code/_onclick/hud/deity.dm | 23 +- code/_onclick/hud/fullscreen.dm | 32 +- code/_onclick/hud/gun_mode.dm | 65 --- code/_onclick/hud/hud.dm | 450 --------------- .../_onclick/hud/hud_elements/_hud_element.dm | 49 ++ .../hud/hud_elements/ability_master.dm | 8 + .../hud/hud_elements/action_intent.dm | 29 + code/_onclick/hud/hud_elements/bodytemp.dm | 37 ++ code/_onclick/hud/hud_elements/cells.dm | 21 + code/_onclick/hud/hud_elements/drop.dm | 7 + code/_onclick/hud/hud_elements/fire.dm | 8 + code/_onclick/hud/hud_elements/gun_mode.dm | 95 +++ code/_onclick/hud/hud_elements/health.dm | 81 +++ code/_onclick/hud/hud_elements/hydration.dm | 21 + code/_onclick/hud/hud_elements/internals.dm | 8 + code/_onclick/hud/hud_elements/move_intent.dm | 9 + code/_onclick/hud/hud_elements/nutrition.dm | 26 + code/_onclick/hud/hud_elements/oxygen.dm | 9 + code/_onclick/hud/hud_elements/pain.dm | 2 + code/_onclick/hud/hud_elements/pressure.dm | 9 + code/_onclick/hud/hud_elements/resist.dm | 7 + code/_onclick/hud/hud_elements/stamina.dm | 12 + code/_onclick/hud/hud_elements/throwing.dm | 7 + code/_onclick/hud/hud_elements/toxins.dm | 9 + code/_onclick/hud/hud_elements/up_hint.dm | 5 + .../hud/hud_elements/zone_selector.dm | 3 + code/_onclick/hud/human.dm | 262 ++------- code/_onclick/hud/other_mobs.dm | 42 -- code/_onclick/hud/pai.dm | 13 +- code/_onclick/hud/robot.dm | 241 ++++---- code/_onclick/hud/screen_objects.dm | 48 +- code/game/machinery/oxygen_pump.dm | 5 +- code/game/objects/effects/bump_teleporter.dm | 2 +- code/game/objects/effects/decals/misc.dm | 2 +- code/game/objects/effects/landmarks.dm | 2 +- code/game/objects/effects/manifest.dm | 2 +- .../objects/effects/spawners/bombspawner.dm | 4 +- code/game/objects/item.dm | 4 +- code/game/objects/items/robot/robot_items.dm | 8 +- .../objects/items/robot/robot_upgrades.dm | 16 +- code/modules/admin/admin_attack_log.dm | 3 +- code/modules/awaymissions/loot.dm | 2 +- code/modules/blob/blob.dm | 12 +- code/modules/client/ui_style.dm | 20 +- code/modules/clothing/glasses/_glasses.dm | 2 +- code/modules/clothing/glasses/eyepatch.dm | 2 +- code/modules/clothing/glasses/glasses.dm | 2 +- code/modules/clothing/glasses/hud.dm | 6 +- .../gasses/material_gas_mundane.dm | 8 - code/modules/mechs/interface/_interface.dm | 2 +- code/modules/mechs/mech.dm | 2 + code/modules/mechs/mech_interaction.dm | 18 +- code/modules/mechs/mech_movement.dm | 8 +- code/modules/mob/death.dm | 10 +- code/modules/mob/examine.dm | 7 +- code/modules/mob/grab/grab_object.dm | 10 +- code/modules/mob/grab/normal/grab_normal.dm | 2 +- code/modules/mob/living/bot/bot.dm | 1 + code/modules/mob/living/carbon/alien/life.dm | 40 -- code/modules/mob/living/carbon/brain/life.dm | 86 --- .../mob/living/carbon/human/examine.dm | 6 +- code/modules/mob/living/carbon/human/human.dm | 2 +- .../living/carbon/human/human_attackhand.dm | 5 +- .../mob/living/carbon/human/human_defines.dm | 2 - .../mob/living/carbon/human/human_movement.dm | 3 - code/modules/mob/living/carbon/human/life.dm | 155 +---- .../mob/living/carbon/human/update_icons.dm | 6 +- code/modules/mob/living/carbon/internals.dm | 1 + code/modules/mob/living/carbon/resist.dm | 1 + .../mob/living/deity/deity_phenomena.dm | 10 +- .../mob/living/deity/menu/deity_nano.dm | 2 +- .../living/deity/phenomena/communication.dm | 2 +- code/modules/mob/living/inventory.dm | 17 +- code/modules/mob/living/life.dm | 16 +- code/modules/mob/living/living.dm | 15 +- code/modules/mob/living/living_bodytemp.dm | 6 +- code/modules/mob/living/living_breath.dm | 1 + code/modules/mob/living/living_defense.dm | 1 - code/modules/mob/living/living_grabs.dm | 3 +- code/modules/mob/living/silicon/pai/pai.dm | 3 +- .../mob/living/silicon/robot/flying/flying.dm | 4 + code/modules/mob/living/silicon/robot/life.dm | 96 +--- .../silicon/robot/modules/module_illegal.dm | 2 +- .../robot/modules/module_maintenance_drone.dm | 3 +- .../modules/mob/living/silicon/robot/robot.dm | 2 +- .../mob/living/silicon/robot/robot_damage.dm | 13 +- .../living/silicon/robot/robot_movement.dm | 9 +- .../simple_animal/constructs/constructs.dm | 87 +-- .../simple_animal/friendly/farm_animals.dm | 7 + .../living/simple_animal/friendly/possum.dm | 1 + .../living/simple_animal/hostile/antlion.dm | 1 + .../simple_animal/hostile/giant_spider.dm | 8 +- .../living/simple_animal/hostile/hostile.dm | 5 +- .../simple_animal/hostile/retaliate/drone.dm | 4 +- .../hostile/retaliate/king_of_goats.dm | 4 +- .../mob/living/simple_animal/hostile/slug.dm | 4 +- .../living/simple_animal/hostile/vagrant.dm | 4 +- .../mob/living/simple_animal/simple_animal.dm | 17 +- code/modules/mob/login.dm | 7 +- code/modules/mob/mob.dm | 65 +-- code/modules/mob/mob_defines.dm | 30 - code/modules/mob/mob_helpers.dm | 14 +- code/modules/mob/mob_movement.dm | 5 +- code/modules/organs/external/_external.dm | 1 - code/modules/organs/internal/lungs.dm | 18 +- code/modules/organs/pain.dm | 9 +- .../organs/prosthetics/_prosthetics.dm | 4 +- .../projectiles/targeting/targeting_client.dm | 20 +- .../targeting/targeting_overlay.dm | 34 +- code/modules/species/species.dm | 6 +- code/modules/species/species_hud.dm | 15 +- code/modules/species/species_shapeshifter.dm | 2 +- code/modules/species/station/monkey.dm | 2 +- code/modules/spells/contracts.dm | 2 +- code/modules/spells/hand/hand_item.dm | 4 +- code/modules/spells/spell_code.dm | 2 +- code/modules/spells/spells.dm | 30 +- .../spells/targeted/equip/burning_touch.dm | 2 +- code/modules/supermatter/setup_supermatter.dm | 2 +- code/unit_tests/mob_tests.dm | 2 +- icons/mob/{screen_ai.dmi => screen/ai.dmi} | Bin icons/mob/screen/arrow.dmi | Bin 0 -> 353 bytes icons/mob/screen/condition.dmi | Bin 0 -> 8769 bytes icons/mob/screen/construct.dmi | Bin 0 -> 2562 bytes icons/mob/screen/crosses.dmi | Bin 0 -> 533 bytes icons/mob/screen/fill.dmi | Bin 0 -> 108304 bytes .../mob/{screen_full.dmi => screen/full.dmi} | Bin icons/mob/screen/grabs.dmi | Bin 0 -> 9167 bytes .../mob/screen/health_construct_artificer.dmi | Bin 0 -> 2107 bytes .../mob/screen/health_construct_harvester.dmi | Bin 0 -> 1845 bytes .../screen/health_construct_juggernaut.dmi | Bin 0 -> 1744 bytes icons/mob/screen/health_construct_wraith.dmi | Bin 0 -> 2746 bytes icons/mob/screen/health_human.dmi | Bin 0 -> 2174 bytes icons/mob/screen/health_robot.dmi | Bin 0 -> 4009 bytes icons/mob/screen/intent.dmi | Bin 0 -> 1305 bytes icons/mob/screen/internals.dmi | Bin 0 -> 794 bytes icons/mob/screen/midnight.dmi | Bin 37819 -> 21293 bytes icons/mob/screen/minimalist.dmi | Bin 26703 -> 11563 bytes icons/mob/screen/old-noborder.dmi | Bin 32084 -> 17179 bytes icons/mob/screen/old.dmi | Bin 33462 -> 18211 bytes icons/mob/screen/orange.dmi | Bin 51538 -> 33110 bytes .../phenomena.dmi} | Bin icons/mob/screen/robot.dmi | Bin 0 -> 7280 bytes icons/mob/screen/robot_charge.dmi | Bin 0 -> 823 bytes icons/mob/screen/robot_conditions.dmi | Bin 0 -> 1818 bytes icons/mob/screen/robot_drop_grab.dmi | Bin 0 -> 410 bytes icons/mob/screen/robot_intent.dmi | Bin 0 -> 951 bytes icons/mob/screen/robot_modules.dmi | Bin 0 -> 4182 bytes icons/mob/screen/spells.dmi | Bin 0 -> 256 bytes icons/mob/screen/white.dmi | Bin 42868 -> 26174 bytes icons/mob/screen1.dmi | Bin 167621 -> 0 bytes icons/mob/screen1_construct.dmi | Bin 15637 -> 0 bytes icons/mob/screen1_health.dmi | Bin 888 -> 0 bytes icons/mob/screen1_robot.dmi | Bin 129643 -> 0 bytes icons/mob/screen_gen.dmi | Bin 214 -> 0 bytes icons/mob/screen_spells.dmi | Bin 43631 -> 0 bytes icons/mob/status_hunger.dmi | Bin 2361 -> 0 bytes icons/mob/status_indicators.dmi | Bin 4832 -> 0 bytes mods/content/xenobiology/slime/_slime.dm | 2 +- mods/content/xenobiology/slime/slime_hud.dm | 7 +- mods/mobs/borers/mob/borer/borer.dm | 26 +- mods/mobs/borers/mob/borer/borer_attacks.dm | 9 +- mods/mobs/borers/mob/borer/borer_hud.dm | 74 +-- mods/mobs/dionaea/mob/_nymph.dm | 3 +- mods/mobs/dionaea/mob/nymph_ui.dm | 30 +- mods/mobs/dionaea/mob/~diona.dm | 1 - mods/species/ascent/mobs/nymph/_nymph.dm | 3 +- mods/species/ascent/mobs/nymph/nymph_life.dm | 19 +- mods/species/ascent/mobs/nymph/nymph_ui.dm | 50 +- .../bayliens/adherent/datum/species.dm | 3 +- mods/species/serpentid/datum/species.dm | 2 +- .../serpentid/mobs/bodyparts_serpentid.dm | 6 +- nebula.dme | 29 +- 182 files changed, 1721 insertions(+), 1932 deletions(-) create mode 100644 code/__defines/hud.dm create mode 100644 code/_onclick/hud/_hud.dm delete mode 100644 code/_onclick/hud/animal.dm create mode 100644 code/_onclick/hud/constructs.dm delete mode 100644 code/_onclick/hud/gun_mode.dm delete mode 100644 code/_onclick/hud/hud.dm create mode 100644 code/_onclick/hud/hud_elements/_hud_element.dm create mode 100644 code/_onclick/hud/hud_elements/ability_master.dm create mode 100644 code/_onclick/hud/hud_elements/action_intent.dm create mode 100644 code/_onclick/hud/hud_elements/bodytemp.dm create mode 100644 code/_onclick/hud/hud_elements/cells.dm create mode 100644 code/_onclick/hud/hud_elements/drop.dm create mode 100644 code/_onclick/hud/hud_elements/fire.dm create mode 100644 code/_onclick/hud/hud_elements/gun_mode.dm create mode 100644 code/_onclick/hud/hud_elements/health.dm create mode 100644 code/_onclick/hud/hud_elements/hydration.dm create mode 100644 code/_onclick/hud/hud_elements/internals.dm create mode 100644 code/_onclick/hud/hud_elements/move_intent.dm create mode 100644 code/_onclick/hud/hud_elements/nutrition.dm create mode 100644 code/_onclick/hud/hud_elements/oxygen.dm create mode 100644 code/_onclick/hud/hud_elements/pain.dm create mode 100644 code/_onclick/hud/hud_elements/pressure.dm create mode 100644 code/_onclick/hud/hud_elements/resist.dm create mode 100644 code/_onclick/hud/hud_elements/stamina.dm create mode 100644 code/_onclick/hud/hud_elements/throwing.dm create mode 100644 code/_onclick/hud/hud_elements/toxins.dm create mode 100644 code/_onclick/hud/hud_elements/up_hint.dm create mode 100644 code/_onclick/hud/hud_elements/zone_selector.dm delete mode 100644 code/_onclick/hud/other_mobs.dm rename icons/mob/{screen_ai.dmi => screen/ai.dmi} (100%) create mode 100644 icons/mob/screen/arrow.dmi create mode 100644 icons/mob/screen/condition.dmi create mode 100644 icons/mob/screen/construct.dmi create mode 100644 icons/mob/screen/crosses.dmi create mode 100644 icons/mob/screen/fill.dmi rename icons/mob/{screen_full.dmi => screen/full.dmi} (100%) create mode 100644 icons/mob/screen/grabs.dmi create mode 100644 icons/mob/screen/health_construct_artificer.dmi create mode 100644 icons/mob/screen/health_construct_harvester.dmi create mode 100644 icons/mob/screen/health_construct_juggernaut.dmi create mode 100644 icons/mob/screen/health_construct_wraith.dmi create mode 100644 icons/mob/screen/health_human.dmi create mode 100644 icons/mob/screen/health_robot.dmi create mode 100644 icons/mob/screen/intent.dmi create mode 100644 icons/mob/screen/internals.dmi rename icons/mob/{screen_phenomena.dmi => screen/phenomena.dmi} (100%) create mode 100644 icons/mob/screen/robot.dmi create mode 100644 icons/mob/screen/robot_charge.dmi create mode 100644 icons/mob/screen/robot_conditions.dmi create mode 100644 icons/mob/screen/robot_drop_grab.dmi create mode 100644 icons/mob/screen/robot_intent.dmi create mode 100644 icons/mob/screen/robot_modules.dmi create mode 100644 icons/mob/screen/spells.dmi delete mode 100644 icons/mob/screen1.dmi delete mode 100644 icons/mob/screen1_construct.dmi delete mode 100644 icons/mob/screen1_health.dmi delete mode 100644 icons/mob/screen1_robot.dmi delete mode 100644 icons/mob/screen_gen.dmi delete mode 100644 icons/mob/screen_spells.dmi delete mode 100644 icons/mob/status_hunger.dmi delete mode 100644 icons/mob/status_indicators.dmi diff --git a/code/__defines/hud.dm b/code/__defines/hud.dm new file mode 100644 index 00000000000..9c08cf7d025 --- /dev/null +++ b/code/__defines/hud.dm @@ -0,0 +1,4 @@ +#define CLEAR_HUD_ALERTS(M) if(istype(M?.hud_used, /datum/hud) && M.hud_used.alerts) { M.hud_used.alerts = null; } +#define SET_HUD_ALERT(M, A, V) if(istype(M?.hud_used, /datum/hud)) { LAZYSET(M.hud_used.alerts, A, V); } +#define SET_HUD_ALERT_MIN(M, A, V) if(istype(M?.hud_used, /datum/hud) && V < LAZYACCESS(M.hud_used.alerts, A)) { LAZYSET(M.hud_used.alerts, A, V); } +#define SET_HUD_ALERT_MAX(M, A, V) if(istype(M?.hud_used, /datum/hud) && V > LAZYACCESS(M.hud_used.alerts, A)) { LAZYSET(M.hud_used.alerts, A, V); } diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index b7ec77eacc7..f68fe6e1ffe 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -351,8 +351,8 @@ var/global/list/click_catchers return global.click_catchers /obj/screen/click_catcher - icon = 'icons/mob/screen_gen.dmi' - icon_state = "click_catcher" + icon = 'icons/mob/screen/fill.dmi' + icon_state = "blank" plane = CLICKCATCHER_PLANE mouse_opacity = MOUSE_OPACITY_PRIORITY screen_loc = "CENTER-7,CENTER-7" diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 705994a1400..e308bd0ccdf 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -74,7 +74,6 @@ #define ui_up_hint "RIGHT-1:28,TOP-1:29" #define ui_toxin "RIGHT-1:28,TOP-2:27" #define ui_fire "RIGHT-1:28,TOP-3:25" -#define ui_oxygen "RIGHT-1:28,TOP-4:23" #define ui_pressure "RIGHT-1:28,TOP-5:21" #define ui_alien_toxin "RIGHT-1:28,TOP-2:25" diff --git a/code/_onclick/hud/_hud.dm b/code/_onclick/hud/_hud.dm new file mode 100644 index 00000000000..4de22e1df01 --- /dev/null +++ b/code/_onclick/hud/_hud.dm @@ -0,0 +1,539 @@ +/* + The hud datum + Used to show and hide huds for all the different mob types, + including inventories and item quick actions. +*/ +/mob + var/datum/hud/hud_used + +/mob/proc/InitializeHud() + if(ispath(hud_used)) + hud_used = new hud_used(src) + else if(istype(hud_used)) + hud_used.mymob = src // Probably unnecessary. + hud_used.refresh_client_hud() + refresh_lighting_master() + +/datum/hud + var/mob/mymob + + var/hud_shown = 1 //Used for the HUD toggle (F12) + var/inventory_shown = TRUE //the inventory + + /// A assoc lazylist of hud elements by category type + var/list/hud_elements_by_category + /// A assoc lazylist of hud element types to elements that need updating in Life() + var/list/updating_hud_elements + /// A linear list of types to populate the HUD with + var/list/hud_elements = list( + /decl/hud_element/health, + /decl/hud_element/condition/bodytemp, + /decl/hud_element/zone_selector, + /decl/hud_element/move_intent, + /decl/hud_element/action_intent, + /decl/hud_element/condition/pressure, + /decl/hud_element/condition/fire, + /decl/hud_element/condition/toxins, + /decl/hud_element/condition/oxygen, + /decl/hud_element/condition/nutrition, + /decl/hud_element/condition/hydration, + /decl/hud_element/stamina_bar, + /decl/hud_element/drop, + /decl/hud_element/resist, + /decl/hud_element/throwing, + /decl/hud_element/up_hint, + /decl/hud_element/pain, + /decl/hud_element/internals, + /decl/hud_element/gun_mode, + /decl/hud_element/gun_flag_item, + /decl/hud_element/gun_flag_move, + /decl/hud_element/gun_flag_radio + ) + var/health_hud_type = /decl/hud_element/health + var/list/alerts + + /// Whether or not the hotkey UI has been hidden. + var/hotkey_ui_hidden = FALSE + /// Linear list of hotkey UI elements. + var/list/obj/screen/hotkey_hud_elements = list() + var/list/obj/screen/misc_hud_elements = list() + var/list/obj/screen/hidable_hud_elements = list() + + var/list/hand_hud_objects + var/list/swaphand_hud_objects + + var/obj/screen/action_button/hide_toggle/hide_actions_toggle + var/action_buttons_hidden = FALSE + +/datum/hud/New(mob/owner) + mymob = owner + instantiate() + ..() + +/datum/hud/proc/clear_client_hud() + if(!mymob?.client) + return + mymob.client.screen -= hand_hud_objects + mymob.client.screen -= swaphand_hud_objects + mymob.client.screen -= misc_hud_elements + mymob.client.screen -= hidable_hud_elements + mymob.client.screen -= hotkey_hud_elements + +/datum/hud/proc/populate_client_hud() + if(!mymob?.client) + return + if(length(hand_hud_objects)) + mymob.client.screen |= hand_hud_objects + if(length(swaphand_hud_objects)) + mymob.client.screen |= swaphand_hud_objects + if(length(misc_hud_elements)) + mymob.client.screen |= misc_hud_elements + if(length(hidable_hud_elements)) + mymob.client.screen |= hidable_hud_elements + if(length(hotkey_hud_elements)) + mymob.client.screen |= hotkey_hud_elements + +/datum/hud/Destroy() + . = ..() + + clear_client_hud() + + mymob = null + hud_elements = null + hud_elements_by_category = null + updating_hud_elements = null + + QDEL_NULL_LIST(misc_hud_elements) + QDEL_NULL_LIST(hidable_hud_elements) + QDEL_NULL_LIST(hotkey_hud_elements) + QDEL_NULL_LIST(hand_hud_objects) + QDEL_NULL_LIST(swaphand_hud_objects) + +/mob/proc/get_hud_element(var/hud_elem_type) + if(istype(hud_used)) + return hud_used.get_element(hud_elem_type) + +/datum/hud/proc/get_element(var/hud_elem_type) + return LAZYACCESS(hud_elements_by_category, hud_elem_type) + +/datum/hud/proc/update_stamina() + var/obj/screen/stamina/stamina_bar = get_element(/decl/hud_element/stamina_bar) + if(istype(stamina_bar)) + stamina_bar.invisibility = INVISIBILITY_MAXIMUM + var/stamina = mymob.get_stamina() + if(stamina < 100) + stamina_bar.invisibility = 0 + stamina_bar.icon_state = "prog_bar_[FLOOR(stamina/5)*5][(stamina >= 5) && (stamina <= 25) ? "_fail" : null]" + +/datum/hud/proc/hide_inventory() + inventory_shown = FALSE + hidden_inventory_update() + persistant_inventory_update() + +/datum/hud/proc/show_inventory() + inventory_shown = TRUE + hidden_inventory_update() + persistant_inventory_update() + +/datum/hud/proc/hidden_inventory_update() + var/decl/species/species = mymob?.get_species() + if(species?.hud) + refresh_inventory_slots(species.hud.hidden_slots, (inventory_shown && hud_shown)) + +/datum/hud/proc/persistant_inventory_update() + var/decl/species/species = mymob?.get_species() + if(species?.hud) + refresh_inventory_slots(species.hud.persistent_slots, hud_shown) + +/datum/hud/proc/refresh_inventory_slots(var/list/checking_slots, var/show_hud) + + for(var/slot in checking_slots) + + var/datum/inventory_slot/inv_slot = mymob.get_inventory_slot_datum(slot) + if(!istype(inv_slot)) + continue + + // Check if we're even wearing anything in that slot. + var/obj/item/gear = inv_slot.get_equipped_item() + if(!istype(gear)) + continue + + // We're not showing anything, hide it. + if(!show_hud) + inv_slot.hide_slot() + else + inv_slot.show_slot() + +/datum/hud/proc/instantiate() + if(ismob(mymob) && mymob.client) + FinalizeInstantiation() + return TRUE + return FALSE + +/datum/hud/proc/FinalizeInstantiation() + SHOULD_CALL_PARENT(TRUE) + + for(var/elem_type in hud_elements) + var/decl/hud_element/elem_data = GET_DECL(elem_type) + var/obj/screen/elem = elem_data.create_screen_object(src) + if(QDELETED(elem)) + hud_elements -= elem_type + continue + hud_elements[elem_type] = elem + if(elem_data.update_in_life) + LAZYSET(updating_hud_elements, elem_type, elem) + if(elem_data.hud_element_category) + LAZYSET(hud_elements_by_category, elem_data.hud_element_category, elem) + + build_inventory_ui() + build_hands_ui() + refresh_client_hud() + +/datum/hud/proc/update_health_hud() + if(!health_hud_type) + return + var/obj/screen/elem = LAZYACCESS(hud_elements, health_hud_type) + if(!elem) + return + var/decl/hud_element/elem_data = GET_DECL(health_hud_type) + elem_data.refresh_screen_object(src, elem) + +/datum/hud/proc/refresh_client_hud() + if(mymob?.client) + mymob.client.screen.Cut() + + populate_client_hud() + hide_inventory() + refresh_ability_hud() + +/datum/hud/proc/get_ui_style() + return ui_style2icon(mymob?.client?.prefs?.UI_style) || 'icons/mob/screen/white.dmi' + +/datum/hud/proc/get_ui_color() + return mymob?.client?.prefs?.UI_style_color || COLOR_WHITE + +/datum/hud/proc/get_ui_alpha() + return mymob?.client?.prefs?.UI_style_alpha || 255 + +/datum/hud/proc/rebuild_hands() + + var/ui_style = get_ui_style() + var/ui_color = get_ui_color() + var/ui_alpha = get_ui_alpha() + + // Build held item boxes for missing slots. + var/list/held_slots = mymob.get_held_item_slots() + for(var/hand_tag in held_slots) + var/obj/screen/inventory/inv_box + for(var/obj/screen/inventory/existing_box in hand_hud_objects) + if(existing_box.slot_id == hand_tag) + inv_box = existing_box + break + if(!inv_box) + inv_box = new /obj/screen/inventory() + var/datum/inventory_slot/inv_slot = mymob.get_inventory_slot_datum(hand_tag) + inv_box.SetName(hand_tag) + inv_box.icon = ui_style + inv_box.icon_state = "hand_base" + + inv_box.cut_overlays() + inv_box.add_overlay("hand_[hand_tag]") + if(inv_slot.ui_label) + inv_box.add_overlay("hand_[inv_slot.ui_label]") + if(mymob.get_active_held_item_slot() == hand_tag) + inv_box.add_overlay("hand_selected") + inv_box.compile_overlays() + + inv_box.slot_id = hand_tag + inv_box.color = ui_color + inv_box.alpha = ui_alpha + inv_box.appearance_flags |= KEEP_TOGETHER + + LAZYDISTINCTADD(hand_hud_objects, inv_box) + + // Clear held item boxes with no held slot. + for(var/obj/screen/inventory/inv_box in hand_hud_objects) + if(!(inv_box.slot_id in held_slots)) + if(mymob.client) + mymob.client.screen -= inv_box + LAZYREMOVE(hand_hud_objects, inv_box) + qdel(inv_box) + + // Rebuild offsets for the hand elements. + var/hand_y_offset = 5 + var/list/elements = hand_hud_objects?.Copy() + while(length(elements)) + var/copy_index = min(length(elements), 2)+1 + var/list/sublist = elements.Copy(1, copy_index) + elements.Cut(1, copy_index) + var/obj/screen/inventory/inv_box + if(length(sublist) == 1) + inv_box = sublist[1] + inv_box.screen_loc = "CENTER,BOTTOM:[hand_y_offset]" + else + inv_box = sublist[1] + inv_box.screen_loc = "CENTER:-[world.icon_size/2],BOTTOM:[hand_y_offset]" + inv_box = sublist[2] + inv_box.screen_loc = "CENTER:[world.icon_size/2],BOTTOM:[hand_y_offset]" + hand_y_offset += world.icon_size + if(mymob.client) + mymob.client.screen |= inv_box + + // Make sure all held items are on the screen and set to the correct screen loc. + var/datum/inventory_slot/inv_slot + for(var/obj/inv_elem in hand_hud_objects) + inv_slot = mymob.get_inventory_slot_datum(inv_elem.name) + if(inv_slot) + inv_slot.ui_loc = inv_elem.screen_loc + var/obj/item/held = inv_slot.get_equipped_item() + if(held) + held.screen_loc = inv_slot.ui_loc + if(mymob.client) + mymob.client.screen |= held // just to make sure it's visible post-login + + var/hand_x_offset = -(world.icon_size/2) + for(var/i = 1 to length(swaphand_hud_objects)) + var/obj/swap_elem = swaphand_hud_objects[i] + swap_elem.screen_loc = "CENTER:[hand_x_offset],BOTTOM:[hand_y_offset]" + if(i > 1) // first two elems share a slot + hand_x_offset += world.icon_size + if(mymob.client) + mymob.client.screen |= swap_elem + +/datum/hud/proc/build_inventory_ui() + + var/ui_style = get_ui_style() + var/ui_color = get_ui_color() + var/ui_alpha = get_ui_alpha() + + var/has_hidden_gear = FALSE + + // Draw the various inventory equipment slots. + var/obj/screen/inventory/inv_box + var/list/held_slots = mymob.get_held_item_slots() + var/list/inventory_slots = mymob.get_inventory_slots() + for(var/gear_slot in inventory_slots) + + if(gear_slot in held_slots) + continue + + inv_box = new /obj/screen/inventory() + inv_box.icon = ui_style + inv_box.color = ui_color + inv_box.alpha = ui_alpha + + var/datum/inventory_slot/inv_slot = inventory_slots[gear_slot] + inv_box.SetName(inv_slot.slot_name) + inv_box.slot_id = inv_slot.slot_id + inv_box.icon_state = inv_slot.slot_state + inv_box.screen_loc = inv_slot.ui_loc + + if(inv_slot.slot_dir) + inv_box.set_dir(inv_slot.slot_dir) + + if(inv_slot.can_be_hidden) + hidable_hud_elements += inv_box + has_hidden_gear = TRUE + else + misc_hud_elements += inv_box + + if(has_hidden_gear) + var/obj/screen/using = new /obj/screen + using.SetName("toggle") + using.icon = ui_style + using.icon_state = "other" + using.screen_loc = ui_inventory + using.color = ui_color + using.alpha = ui_alpha + misc_hud_elements += using + +/datum/hud/proc/build_hands_ui() + + var/ui_style = get_ui_style() + var/ui_color = get_ui_color() + var/ui_alpha = get_ui_alpha() + + var/obj/screen/using + + // Swap hand and quick equip screen elems. + using = new /obj/screen + using.SetName("equip") + using.icon = ui_style + using.icon_state = "act_equip" + using.color = ui_color + using.alpha = ui_alpha + misc_hud_elements += using + LAZYADD(swaphand_hud_objects, using) + + var/list/held_slots = mymob.get_held_item_slots() + if(length(held_slots) > 1) + + using = new /obj/screen/inventory() + using.SetName("hand") + using.icon = ui_style + using.icon_state = "hand1" + using.color = ui_color + using.alpha = ui_alpha + misc_hud_elements += using + LAZYADD(swaphand_hud_objects, using) + + using = new /obj/screen/inventory() + using.SetName("hand") + using.icon = ui_style + using.icon_state = "hand2" + using.color = ui_color + using.alpha = ui_alpha + misc_hud_elements += using + LAZYADD(swaphand_hud_objects, using) + + // Actual hand elems. + rebuild_hands() + +/mob/verb/minimize_hud_verb() + set name = "Minimize Hud" + set hidden = TRUE + set category = "OOC" + minimize_hud() + +/mob/proc/minimize_hud(var/zoom = FALSE) + + if(!istype(hud_used)) + return + + if(!client || client.view != world.view || !hud_used) + return + + var/obj/screen/action_intent = get_hud_element(/decl/hud_element/action_intent) + if(hud_used.hud_shown) + client.screen -= hud_used.misc_hud_elements + client.screen -= hud_used.hidable_hud_elements + client.screen -= hud_used.hotkey_hud_elements + if(action_intent) + action_intent.screen_loc = ui_acti_alt // move this to the alternative position, where zone_select usually is. + else + if(length(hud_used.misc_hud_elements)) + client.screen |= hud_used.misc_hud_elements + if(hud_used.inventory_shown && length(hud_used.hidable_hud_elements)) + client.screen |= hud_used.hidable_hud_elements + if(!hud_used.hotkey_ui_hidden && length(hud_used.hotkey_hud_elements)) + client.screen |= hud_used.hotkey_hud_elements + if(action_intent) + action_intent.screen_loc = ui_acti //Restore intent selection to the original position + + // We always want to show our hands. + if(LAZYLEN(hud_used.hand_hud_objects)) + client.screen |= hud_used.hand_hud_objects + if(LAZYLEN(hud_used.swaphand_hud_objects)) + client.screen |= hud_used.swaphand_hud_objects + + hud_used.hud_shown = !hud_used.hud_shown + hud_used.hidden_inventory_update() + hud_used.persistant_inventory_update() + update_action_buttons() + +/client/proc/reset_click_catchers() + + var/xmin = -(round(last_view_x_dim*0.5)) + var/xmax = last_view_x_dim - abs(xmin) + var/ymin = -(round(last_view_y_dim*0.5)) + var/ymax = last_view_y_dim - abs(ymin) + + var/list/click_catchers = get_click_catchers() + for(var/obj/screen/click_catcher/catcher in click_catchers) + if(catcher.x_offset <= xmin || catcher.x_offset >= xmax || catcher.y_offset <= ymin || catcher.y_offset >= ymax) + screen -= catcher + else + screen |= catcher + +/mob/proc/reset_click_catchers() + client.reset_click_catchers() + +/mob/new_player/reset_click_catchers() + return + +/datum/hud/proc/update_icons() + if(!length(updating_hud_elements) || QDELETED(mymob)) + return + + var/obj/screen/ability_master/ability_master = get_element(/decl/hud_element/ability_master) + if(ability_master) + ability_master.update_spells(0) + + var/datum/gas_mixture/environment = mymob.loc?.return_air() + for(var/elem_type in updating_hud_elements) + var/decl/hud_element/hud_elem_data = GET_DECL(elem_type) + hud_elem_data.refresh_screen_object(src, hud_elements[elem_type], environment) + +/datum/hud/proc/hide_ability_hud() + var/ui_alpha = get_ui_alpha() + for(var/elem_type in hud_elements) + var/decl/hud_element/hud_elem = GET_DECL(elem_type) + if(hud_elem.hidable) + var/obj/thing = hud_elements[elem_type] + if(istype(thing)) + thing.alpha = hud_elem.apply_hud_alpha ? ui_alpha : initial(thing.alpha) + thing.invisibility = initial(thing.invisibility) + +/datum/hud/proc/show_ability_hud() + for(var/elem_type in hud_elements) + var/decl/hud_element/hud_elem = GET_DECL(elem_type) + if(hud_elem.hidable) + var/obj/thing = hud_elements[elem_type] + if(istype(thing)) + thing.alpha = 0 + thing.invisibility = INVISIBILITY_MAXIMUM + +/datum/hud/proc/should_show_ability_hud() + return TRUE + +/datum/hud/proc/refresh_ability_hud() + + var/obj/screen/ability_master/ability_master = get_element(/decl/hud_element/ability_master) + if(ability_master) + ability_master.update_abilities(TRUE, mymob) + ability_master.toggle_open(1) + ability_master.synch_spells_to_mind(mymob?.mind) + + if(should_show_ability_hud()) + show_ability_hud() + else + hide_ability_hud() + +/datum/hud/proc/reset_hud_callback() + if(mymob.is_on_special_ability_cooldown()) + return + var/ui_color = get_ui_color() + for(var/elem_type in hud_elements) + var/decl/hud_element/hud_elem = GET_DECL(elem_type) + if(hud_elem.apply_color_on_cooldown) + var/obj/thing = hud_elements[elem_type] + if(istype(thing)) + thing.color = hud_elem.apply_hud_color ? ui_color : initial(thing.color) + +/datum/hud/proc/set_hud_cooldown(var/time, var/cooldown_color) + var/colored_a_thing = FALSE + for(var/elem_type in hud_elements) + var/decl/hud_element/hud_elem = GET_DECL(elem_type) + if(hud_elem.apply_color_on_cooldown) + var/obj/thing = hud_elements[elem_type] + if(istype(thing)) + colored_a_thing = TRUE + thing.color = cooldown_color + if(colored_a_thing) + addtimer(CALLBACK(src, /datum/hud/proc/reset_hud_callback), time+1) + +/datum/hud/proc/refresh_stat_panel() + var/obj/screen/ability_master/ability_master = mymob.get_hud_element(/decl/hud_element/ability_master) + if(!ability_master?.spell_objects) + return + for(var/obj/screen/ability/spell/screen in ability_master.spell_objects) + var/spell/S = screen.spell + if((!S.connected_button) || !statpanel(S.panel)) + continue //Not showing the noclothes spell + switch(S.charge_type) + if(Sp_RECHARGE) + statpanel(S.panel,"[S.charge_counter/10.0]/[S.charge_max/10]",S.connected_button) + if(Sp_CHARGES) + statpanel(S.panel,"[S.charge_counter]/[S.charge_max]",S.connected_button) + if(Sp_HOLDVAR) + statpanel(S.panel,"[S.holder_var_type] [S.holder_var_amount]",S.connected_button) diff --git a/code/_onclick/hud/ability_screen_objects.dm b/code/_onclick/hud/ability_screen_objects.dm index 54094c25e4b..44c9e587523 100644 --- a/code/_onclick/hud/ability_screen_objects.dm +++ b/code/_onclick/hud/ability_screen_objects.dm @@ -1,6 +1,6 @@ /obj/screen/ability_master name = "Abilities" - icon = 'icons/mob/screen_spells.dmi' + icon = 'icons/mob/screen/spells.dmi' icon_state = "grey_spell_ready" var/list/obj/screen/ability/ability_objects = list() var/list/obj/screen/ability/spell_objects = list() @@ -27,11 +27,6 @@ . = ..() remove_all_abilities() //Get rid of the ability objects. ability_objects.Cut() - if(my_mob) // After that, remove ourselves from the mob seeing us, so we can qdel cleanly. - my_mob.ability_master = null - if(my_mob.client && my_mob.client.screen) - my_mob.client.screen -= src - my_mob = null /obj/screen/ability_master/handle_mouse_drop(var/atom/over, var/mob/user) if(showing) @@ -41,7 +36,6 @@ /obj/screen/ability_master/Click() if(!ability_objects.len) // If we're empty for some reason. return - toggle_open() /obj/screen/ability_master/proc/toggle_open(var/forced_state = 0) @@ -149,15 +143,11 @@ var/spell/S = screen.spell M.learned_spells |= S -/mob/Initialize() - . = ..() - ability_master = new /obj/screen/ability_master(null,src) - ///////////ACTUAL ABILITIES//////////// //This is what you click to do things// /////////////////////////////////////// /obj/screen/ability - icon = 'icons/mob/screen_spells.dmi' + icon = 'icons/mob/screen/spells.dmi' icon_state = "grey_spell_base" maptext_x = 3 var/background_base_state = "grey" @@ -204,11 +194,13 @@ if(isnull(slot) || !isnum(slot)) to_chat(src,".activate_ability requires a number as input, corrisponding to the slot you wish to use.") return // Bad input. - if(!mob.ability_master) + + var/obj/screen/ability_master/ability_master = mob.get_hud_element(/decl/hud_element/ability_master) + if(!ability_master) return // No abilities. - if(slot > mob.ability_master.ability_objects.len || slot <= 0) + if(slot > ability_master.ability_objects.len || slot <= 0) return // Out of bounds. - var/obj/screen/ability/A = mob.ability_master.ability_objects[slot] + var/obj/screen/ability/A = ability_master.ability_objects[slot] A.activate() //////////Verb Abilities////////// diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index 40b6339f64d..eefa3565072 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -1,11 +1,11 @@ /mob/living/silicon/ai - hud_type = /datum/hud/ai + hud_used = /datum/hud/ai /datum/hud/ai/FinalizeInstantiation() var/list/ai_hud_data = decls_repository.get_decls_of_subtype(/decl/ai_hud) for(var/elem_type in ai_hud_data) var/decl/ai_hud/ai_hud = ai_hud_data[elem_type] - adding += new /obj/screen/ai_button(null, + misc_hud_elements += new /obj/screen/ai_button(null, ai_hud.screen_loc, ai_hud.name, ai_hud.icon_state, @@ -13,4 +13,4 @@ ai_hud.input_procs, ai_hud.input_args ) - ..() + return ..() diff --git a/code/_onclick/hud/ai_screen_objects.dm b/code/_onclick/hud/ai_screen_objects.dm index cbbff7d5d96..77945ee7e4a 100644 --- a/code/_onclick/hud/ai_screen_objects.dm +++ b/code/_onclick/hud/ai_screen_objects.dm @@ -2,7 +2,7 @@ var/mob/living/silicon/ai/ai_verb var/list/input_procs var/list/input_args - icon = 'icons/mob/screen_ai.dmi' + icon = 'icons/mob/screen/ai.dmi' var/list/template_icon = list(null, "template") var/image/template_undelay diff --git a/code/_onclick/hud/animal.dm b/code/_onclick/hud/animal.dm deleted file mode 100644 index 81868526a39..00000000000 --- a/code/_onclick/hud/animal.dm +++ /dev/null @@ -1,9 +0,0 @@ - -/mob/living/simple_animal - hud_type = /datum/hud/animal - -/datum/hud/animal/FinalizeInstantiation() - action_intent = new /obj/screen/intent() - adding += action_intent - ..() - diff --git a/code/_onclick/hud/constructs.dm b/code/_onclick/hud/constructs.dm new file mode 100644 index 00000000000..30a8ac6f975 --- /dev/null +++ b/code/_onclick/hud/constructs.dm @@ -0,0 +1,72 @@ +/mob/living/simple_animal/construct + hud_used = /datum/hud/construct/wraith + +/mob/living/simple_animal/construct/armoured + hud_used = /datum/hud/construct/juggernaut + +/mob/living/simple_animal/construct/behemoth + hud_used = /datum/hud/construct/juggernaut + +/mob/living/simple_animal/construct/builder + hud_used = /datum/hud/construct/artificer + +/mob/living/simple_animal/construct/harvester + hud_used = /datum/hud/construct/harvester + +/decl/hud_element/condition/fire/construct + screen_loc = ui_construct_fire + +/decl/hud_element/health/construct + screen_loc = ui_construct_health + abstract_type = /decl/hud_element/health/construct + +/decl/hud_element/health/construct/artificer + screen_icon = 'icons/mob/screen/health_construct_artificer.dmi' + +/decl/hud_element/health/construct/wraith + screen_icon = 'icons/mob/screen/health_construct_wraith.dmi' + +/decl/hud_element/health/construct/juggernaut + screen_icon = 'icons/mob/screen/health_construct_juggernaut.dmi' + +/decl/hud_element/health/construct/harvester + screen_icon = 'icons/mob/screen/health_construct_harvester.dmi' + +/datum/hud/construct/get_ui_style() + return 'icons/mob/screen/construct.dmi' + +/datum/hud/construct/artificer + health_hud_type = /decl/hud_element/health/construct/artificer + hud_elements = list( + /decl/hud_element/health/construct/artificer, + /decl/hud_element/zone_selector, + /decl/hud_element/action_intent, + /decl/hud_element/condition/fire/construct + ) + +/datum/hud/construct/wraith + health_hud_type = /decl/hud_element/health/construct/wraith + hud_elements = list( + /decl/hud_element/health/construct/wraith, + /decl/hud_element/zone_selector, + /decl/hud_element/action_intent, + /decl/hud_element/condition/fire/construct + ) + +/datum/hud/construct/juggernaut + health_hud_type = /decl/hud_element/health/construct/juggernaut + hud_elements = list( + /decl/hud_element/health/construct/juggernaut, + /decl/hud_element/zone_selector, + /decl/hud_element/action_intent, + /decl/hud_element/condition/fire/construct + ) + +/datum/hud/construct/harvester + health_hud_type = /decl/hud_element/health/construct/harvester + hud_elements = list( + /decl/hud_element/health/construct/harvester, + /decl/hud_element/zone_selector, + /decl/hud_element/action_intent, + /decl/hud_element/condition/fire/construct + ) diff --git a/code/_onclick/hud/deity.dm b/code/_onclick/hud/deity.dm index 44512dbdf7e..b7866b523c5 100644 --- a/code/_onclick/hud/deity.dm +++ b/code/_onclick/hud/deity.dm @@ -1,12 +1,19 @@ /mob/living/deity - hud_type = /datum/hud/deity + hud_used = /datum/hud/deity -/datum/hud/deity/FinalizeInstantiation() - var/obj/screen/intent/deity/D = new() - adding += D - action_intent = D - ..() - D.sync_to_mob(mymob) +/datum/hud/deity + hud_elements = list( + /decl/hud_element/action_intent/deity + ) + +/decl/hud_element/action_intent/deity + screen_object_type = /obj/screen/intent/deity + +/decl/hud_element/action_intent/deity/register_screen_object(obj/screen/elem, datum/hud/hud) + var/obj/screen/intent/deity/deity_elem = elem + if(istype(deity_elem)) + deity_elem.sync_to_mob(hud.mymob) + return ..() /obj/screen/intent/deity var/list/desc_screens = list() @@ -14,7 +21,7 @@ /obj/screen/intent/deity/Initialize() . = ..() - overlays += image('icons/mob/screen_phenomena.dmi', icon_state = "hud", pixel_x = -138, pixel_y = -1) + overlays += image('icons/mob/screen/phenomena.dmi', icon_state = "hud", pixel_x = -138, pixel_y = -1) /obj/screen/intent/deity/proc/sync_to_mob(var/mob) var/mob/living/deity/D = mob diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index cf42a0e99ab..f180f8f608d 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -1,12 +1,12 @@ /mob - var/list/screens = list() + var/list/_screens /mob/proc/set_fullscreen(condition, screen_name, screen_type, arg) condition ? overlay_fullscreen(screen_name, screen_type, arg) : clear_fullscreen(screen_name) /mob/proc/overlay_fullscreen(category, type, severity) - var/obj/screen/fullscreen/screen = screens[category] + var/obj/screen/fullscreen/screen = LAZYACCESS(_screens, category) if(screen) if(screen.type != type) @@ -21,7 +21,7 @@ screen.icon_state = "[initial(screen.icon_state)][severity]" screen.severity = severity - screens[category] = screen + LAZYSET(_screens, category, screen) screen.transform = null if(screen && client && (stat != DEAD || screen.allstate)) client.screen += screen @@ -36,11 +36,11 @@ qdel(screen) /mob/proc/clear_fullscreen(category, animated = 10) - var/obj/screen/fullscreen/screen = screens[category] + var/obj/screen/fullscreen/screen = LAZYACCESS(_screens, category) if(!screen) return - screens -= category + LAZYREMOVE(_screens, category) if(animated) show_screen(screen, animated) @@ -50,19 +50,19 @@ qdel(screen) /mob/proc/clear_fullscreens() - for(var/category in screens) + for(var/category in _screens) clear_fullscreen(category) /mob/proc/hide_fullscreens() if(client) - for(var/category in screens) - client.screen -= screens[category] + for(var/category in _screens) + client.screen -= _screens[category] /mob/proc/reload_fullscreen() if(client) var/largest_bound = max(client.last_view_x_dim, client.last_view_y_dim) - for(var/category in screens) - var/obj/screen/fullscreen/screen = screens[category] + for(var/category in _screens) + var/obj/screen/fullscreen/screen = _screens[category] screen.transform = null if(screen.screen_loc != ui_entire_screen && largest_bound > 7) var/matrix/M = matrix() @@ -71,7 +71,7 @@ client.screen |= screen /obj/screen/fullscreen - icon = 'icons/mob/screen_full.dmi' + icon = 'icons/mob/screen/full.dmi' icon_state = "default" screen_loc = ui_center_fullscreen plane = FULLSCREEN_PLANE @@ -101,7 +101,7 @@ layer = BLIND_LAYER /obj/screen/fullscreen/blackout - icon = 'icons/mob/screen1.dmi' + icon = 'icons/mob/screen/fill.dmi' icon_state = "black" screen_loc = ui_entire_screen layer = BLIND_LAYER @@ -111,13 +111,13 @@ layer = IMPAIRED_LAYER /obj/screen/fullscreen/blurry - icon = 'icons/mob/screen1.dmi' + icon = 'icons/mob/screen/fill.dmi' screen_loc = ui_entire_screen icon_state = "blurry" alpha = 100 /obj/screen/fullscreen/flash - icon = 'icons/mob/screen1.dmi' + icon = 'icons/mob/screen/fill.dmi' screen_loc = ui_entire_screen icon_state = "flash" @@ -125,7 +125,7 @@ icon_state = "noise" /obj/screen/fullscreen/high - icon = 'icons/mob/screen1.dmi' + icon = 'icons/mob/screen/fill.dmi' screen_loc = ui_entire_screen icon_state = "druggy" alpha = 180 @@ -138,7 +138,7 @@ alpha = 127 /obj/screen/fullscreen/fadeout - icon = 'icons/mob/screen1.dmi' + icon = 'icons/mob/screen/fill.dmi' icon_state = "black" screen_loc = ui_entire_screen alpha = 0 diff --git a/code/_onclick/hud/gun_mode.dm b/code/_onclick/hud/gun_mode.dm deleted file mode 100644 index 349fce96b0f..00000000000 --- a/code/_onclick/hud/gun_mode.dm +++ /dev/null @@ -1,65 +0,0 @@ -/obj/screen/gun - name = "gun" - icon = 'icons/mob/screen1.dmi' - dir = SOUTH - -/obj/screen/gun/Click(location, control, params) - if(!usr) - return - return 1 - -/obj/screen/gun/move - name = "Allow Movement" - icon_state = "no_walk1" - screen_loc = ui_gun2 - -/obj/screen/gun/move/Click(location, control, params) - if(..()) - var/mob/living/user = usr - if(istype(user)) - if(!user.aiming) user.aiming = new(user) - user.aiming.toggle_permission(TARGET_CAN_MOVE) - return 1 - return 0 - -/obj/screen/gun/item - name = "Allow Item Use" - icon_state = "no_item1" - screen_loc = ui_gun1 - -/obj/screen/gun/item/Click(location, control, params) - if(..()) - var/mob/living/user = usr - if(istype(user)) - if(!user.aiming) user.aiming = new(user) - user.aiming.toggle_permission(TARGET_CAN_CLICK) - return 1 - return 0 - -/obj/screen/gun/mode - name = "Toggle Gun Mode" - icon_state = "gun0" - screen_loc = ui_gun_select - -/obj/screen/gun/mode/Click(location, control, params) - if(..()) - var/mob/living/user = usr - if(istype(user)) - if(!user.aiming) user.aiming = new(user) - user.aiming.toggle_active() - return 1 - return 0 - -/obj/screen/gun/radio - name = "Disallow Radio Use" - icon_state = "no_radio1" - screen_loc = ui_gun4 - -/obj/screen/gun/radio/Click(location, control, params) - if(..()) - var/mob/living/user = usr - if(istype(user)) - if(!user.aiming) user.aiming = new(user) - user.aiming.toggle_permission(TARGET_CAN_RADIO) - return 1 - return 0 diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm deleted file mode 100644 index 01c911e1572..00000000000 --- a/code/_onclick/hud/hud.dm +++ /dev/null @@ -1,450 +0,0 @@ -/* - The hud datum - Used to show and hide huds for all the different mob types, - including inventories and item quick actions. -*/ - -/mob - var/hud_type = null - var/datum/hud/hud_used = null - -/mob/proc/InitializeHud() - if(hud_used) - qdel(hud_used) - if(hud_type) - hud_used = new hud_type(src) - else - hud_used = new /datum/hud(src) - refresh_lighting_master() - -/datum/hud - var/mob/mymob - - var/hud_shown = 1 //Used for the HUD toggle (F12) - var/inventory_shown = TRUE //the inventory - var/show_intent_icons = FALSE - var/hotkey_ui_hidden = FALSE //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) - - var/obj/screen/lingchemdisplay - var/list/hand_hud_objects - var/list/swaphand_hud_objects - var/obj/screen/action_intent - var/obj/screen/move_intent - var/obj/screen/stamina/stamina_bar - - var/list/adding = list() - var/list/other = list() - var/list/hud_elements = list() - var/list/obj/screen/hotkeybuttons - - var/obj/screen/action_button/hide_toggle/hide_actions_toggle - var/action_buttons_hidden = FALSE - -/datum/hud/New(mob/owner) - mymob = owner - instantiate() - ..() - -/datum/hud/Destroy() - . = ..() - stamina_bar = null - lingchemdisplay = null - action_intent = null - move_intent = null - adding = null - other = null - hotkeybuttons = null - mymob = null - QDEL_NULL_LIST(hand_hud_objects) - QDEL_NULL_LIST(swaphand_hud_objects) - -/datum/hud/proc/update_stamina() - if(mymob && stamina_bar) - stamina_bar.set_invisibility(INVISIBILITY_MAXIMUM) - var/stamina = mymob.get_stamina() - if(stamina < 100) - stamina_bar.set_invisibility(INVISIBILITY_NONE) - stamina_bar.icon_state = "prog_bar_[FLOOR(stamina/5)*5][(stamina >= 5) && (stamina <= 25) ? "_fail" : null]" - -/datum/hud/proc/hide_inventory() - inventory_shown = FALSE - hidden_inventory_update() - persistant_inventory_update() - -/datum/hud/proc/show_inventory() - inventory_shown = TRUE - hidden_inventory_update() - persistant_inventory_update() - -/datum/hud/proc/hidden_inventory_update() - var/decl/species/species = mymob?.get_species() - if(species?.hud) - refresh_inventory_slots(species.hud.hidden_slots, (inventory_shown && hud_shown)) - -/datum/hud/proc/persistant_inventory_update() - var/decl/species/species = mymob?.get_species() - if(species?.hud) - refresh_inventory_slots(species.hud.persistent_slots, hud_shown) - -/datum/hud/proc/refresh_inventory_slots(var/list/checking_slots, var/show_hud) - - for(var/slot in checking_slots) - - var/datum/inventory_slot/inv_slot = mymob.get_inventory_slot_datum(slot) - if(!istype(inv_slot)) - continue - - // Check if we're even wearing anything in that slot. - var/obj/item/gear = inv_slot.get_equipped_item() - if(!istype(gear)) - continue - - // We're not showing anything, hide it. - gear.reconsider_client_screen_presence(mymob?.client, slot) - if(!show_hud) - inv_slot.hide_slot() - else - inv_slot.show_slot() - -/datum/hud/proc/instantiate() - if(ismob(mymob) && mymob.client) - FinalizeInstantiation() - return TRUE - return FALSE - -/datum/hud/proc/FinalizeInstantiation() - SHOULD_CALL_PARENT(TRUE) - BuildInventoryUI() - if(mymob.client) - mymob.client.screen = list() - if(length(hand_hud_objects)) - mymob.client.screen |= hand_hud_objects - if(length(swaphand_hud_objects)) - mymob.client.screen |= swaphand_hud_objects - if(length(hud_elements)) - mymob.client.screen |= hud_elements - if(length(adding)) - mymob.client.screen |= adding - if(length(hotkeybuttons)) - mymob.client.screen |= hotkeybuttons - hide_inventory() - -/datum/hud/proc/get_ui_style() - return ui_style2icon(mymob?.client?.prefs?.UI_style) || 'icons/mob/screen/white.dmi' - -/datum/hud/proc/get_ui_color() - return mymob?.client?.prefs?.UI_style_color || COLOR_WHITE - -/datum/hud/proc/get_ui_alpha() - return mymob?.client?.prefs?.UI_style_alpha || 255 - -/datum/hud/proc/rebuild_hands() - - var/ui_style = get_ui_style() - var/ui_color = get_ui_color() - var/ui_alpha = get_ui_alpha() - - // Build held item boxes for missing slots. - var/list/held_slots = mymob.get_held_item_slots() - - // Sort our slots for display. - var/list/gripper_datums = list() - for(var/hand_tag in held_slots) - gripper_datums += mymob.get_inventory_slot_datum(hand_tag) - gripper_datums = sortTim(gripper_datums, /proc/cmp_gripper_asc) - - for(var/datum/inventory_slot/inv_slot in gripper_datums) - - // Re-order the held slot list so it aligns with the display order. - var/hand_tag = inv_slot.slot_id - held_slots -= hand_tag - held_slots += hand_tag - - var/obj/screen/inventory/inv_box - for(var/obj/screen/inventory/existing_box in hand_hud_objects) - if(existing_box.slot_id == hand_tag) - inv_box = existing_box - break - if(!inv_box) - inv_box = new /obj/screen/inventory(null, mymob) - inv_box.SetName(hand_tag) - inv_box.icon = ui_style - inv_box.icon_state = "hand_base" - - inv_box.cut_overlays() - inv_box.add_overlay("hand_[hand_tag]", TRUE) - if(inv_slot.ui_label) - inv_box.add_overlay("hand_[inv_slot.ui_label]", TRUE) - inv_box.update_icon() - - inv_box.slot_id = hand_tag - inv_box.color = ui_color - inv_box.alpha = ui_alpha - inv_box.appearance_flags |= KEEP_TOGETHER - - LAZYDISTINCTADD(hand_hud_objects, inv_box) - - // Clear held item boxes with no held slot. - for(var/obj/screen/inventory/inv_box in hand_hud_objects) - if(!(inv_box.slot_id in held_slots)) - if(mymob.client) - mymob.client.screen -= inv_box - LAZYREMOVE(hand_hud_objects, inv_box) - qdel(inv_box) - - // Rebuild offsets for the hand elements. - var/hand_y_offset = 5 - var/list/elements = hand_hud_objects?.Copy() - while(length(elements)) - var/copy_index = min(length(elements), 2)+1 - var/list/sublist = elements.Copy(1, copy_index) - elements.Cut(1, copy_index) - var/obj/screen/inventory/inv_box - if(length(sublist) == 1) - inv_box = sublist[1] - inv_box.screen_loc = "CENTER,BOTTOM:[hand_y_offset]" - else - inv_box = sublist[1] - inv_box.screen_loc = "CENTER:-[world.icon_size/2],BOTTOM:[hand_y_offset]" - inv_box = sublist[2] - inv_box.screen_loc = "CENTER:[world.icon_size/2],BOTTOM:[hand_y_offset]" - hand_y_offset += world.icon_size - if(mymob.client) - mymob.client.screen |= inv_box - - // Make sure all held items are on the screen and set to the correct screen loc. - var/datum/inventory_slot/inv_slot - for(var/obj/inv_elem in hand_hud_objects) - inv_slot = mymob.get_inventory_slot_datum(inv_elem.name) - if(inv_slot) - inv_slot.ui_loc = inv_elem.screen_loc - var/obj/item/held = inv_slot.get_equipped_item() - if(held) - held.screen_loc = inv_slot.ui_loc - if(mymob.client) - mymob.client.screen |= held // just to make sure it's visible post-login - - var/hand_x_offset = -(world.icon_size/2) - for(var/i = 1 to length(swaphand_hud_objects)) - var/obj/swap_elem = swaphand_hud_objects[i] - swap_elem.screen_loc = "CENTER:[hand_x_offset],BOTTOM:[hand_y_offset]" - if(i > 1) // first two elems share a slot - hand_x_offset += world.icon_size - if(mymob.client) - mymob.client.screen |= swap_elem - -/datum/hud/proc/BuildInventoryUI() - - var/ui_style = get_ui_style() - var/ui_color = get_ui_color() - var/ui_alpha = get_ui_alpha() - - var/has_hidden_gear = FALSE - - // Draw the various inventory equipment slots. - var/obj/screen/inventory/inv_box - var/list/held_slots = mymob.get_held_item_slots() - var/list/inventory_slots = mymob.get_inventory_slots() - for(var/gear_slot in inventory_slots) - - if(gear_slot in held_slots) - continue - - inv_box = new /obj/screen/inventory(null, mymob) - inv_box.icon = ui_style - inv_box.color = ui_color - inv_box.alpha = ui_alpha - - var/datum/inventory_slot/inv_slot = inventory_slots[gear_slot] - inv_box.SetName(inv_slot.slot_name) - inv_box.slot_id = inv_slot.slot_id - inv_box.icon_state = inv_slot.slot_state - inv_box.screen_loc = inv_slot.ui_loc - - if(inv_slot.slot_dir) - inv_box.set_dir(inv_slot.slot_dir) - - if(inv_slot.can_be_hidden) - other += inv_box - has_hidden_gear = TRUE - else - adding += inv_box - - if(has_hidden_gear) - var/obj/screen/using = new /obj/screen() - using.SetName("toggle") - using.icon = ui_style - using.icon_state = "other" - using.screen_loc = ui_inventory - using.color = ui_color - using.alpha = ui_alpha - adding += using - -/datum/hud/proc/BuildHandsUI() - - var/ui_style = get_ui_style() - var/ui_color = get_ui_color() - var/ui_alpha = get_ui_alpha() - - var/obj/screen/using - - // Swap hand and quick equip screen elems. - using = new /obj/screen() - using.SetName("equip") - using.icon = ui_style - using.icon_state = "act_equip" - using.color = ui_color - using.alpha = ui_alpha - src.adding += using - LAZYADD(swaphand_hud_objects, using) - - var/list/held_slots = mymob.get_held_item_slots() - if(length(held_slots) > 1) - - using = new /obj/screen/inventory(null, mymob) - using.SetName("hand") - using.icon = ui_style - using.icon_state = "hand1" - using.color = ui_color - using.alpha = ui_alpha - src.adding += using - LAZYADD(swaphand_hud_objects, using) - - using = new /obj/screen/inventory(null, mymob) - using.SetName("hand") - using.icon = ui_style - using.icon_state = "hand2" - using.color = ui_color - using.alpha = ui_alpha - src.adding += using - LAZYADD(swaphand_hud_objects, using) - - // Actual hand elems. - rebuild_hands() - -/mob/verb/minimize_hud(full = FALSE as null) - set name = "Minimize Hud" - set hidden = TRUE - - if(!hud_used) - to_chat(usr, "This mob type does not use a HUD.") - return - - if(!ishuman(src)) - to_chat(usr, "Inventory hiding is currently only supported for human mobs, sorry.") - return - - if(!client) return - if(client.view != world.view) - return - if(hud_used.hud_shown) - hud_used.hud_shown = 0 - if(src.hud_used.adding) - src.client.screen -= src.hud_used.adding - if(src.hud_used.other) - src.client.screen -= src.hud_used.other - if(src.hud_used.hotkeybuttons) - src.client.screen -= src.hud_used.hotkeybuttons - - //Due to some poor coding some things need special treatment: - //These ones are a part of 'adding', 'other' or 'hotkeybuttons' but we want them to stay - if(!full) - if(LAZYLEN(hud_used.hand_hud_objects)) - client.screen += hud_used.hand_hud_objects // we want the hands to be visible - if(LAZYLEN(hud_used.swaphand_hud_objects)) - client.screen += hud_used.swaphand_hud_objects // we want the hands swap thingy to be visible - src.client.screen += src.hud_used.action_intent // we want the intent swticher visible - src.hud_used.action_intent.screen_loc = ui_acti_alt // move this to the alternative position, where zone_select usually is. - else - src.client.screen -= src.healths - src.client.screen -= src.internals - src.client.screen -= src.gun_setting_icon - - //These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone. - src.client.screen -= src.zone_sel //zone_sel is a mob variable for some reason. - - else - hud_used.hud_shown = 1 - if(src.hud_used.adding) - src.client.screen += src.hud_used.adding - if(src.hud_used.other && src.hud_used.inventory_shown) - src.client.screen += src.hud_used.other - if(src.hud_used.hotkeybuttons && !src.hud_used.hotkey_ui_hidden) - src.client.screen += src.hud_used.hotkeybuttons - if(src.healths) - src.client.screen |= src.healths - if(src.internals) - src.client.screen |= src.internals - if(src.gun_setting_icon) - src.client.screen |= src.gun_setting_icon - - src.hud_used.action_intent.screen_loc = ui_acti //Restore intent selection to the original position - src.client.screen += src.zone_sel //This one is a special snowflake - - hud_used.hidden_inventory_update() - hud_used.persistant_inventory_update() - update_action_buttons() - -//Similar to minimize_hud() but keeps zone_sel, gun_setting_icon, and healths. -/mob/proc/toggle_zoom_hud() - if(!hud_used) - return - if(!ishuman(src)) - return - if(!client) - return - if(client.view != world.view) - return - - if(hud_used.hud_shown) - hud_used.hud_shown = 0 - if(src.hud_used.adding) - src.client.screen -= src.hud_used.adding - if(src.hud_used.other) - src.client.screen -= src.hud_used.other - if(src.hud_used.hotkeybuttons) - src.client.screen -= src.hud_used.hotkeybuttons - src.client.screen -= src.internals - src.client.screen += src.hud_used.action_intent //we want the intent swticher visible - else - hud_used.hud_shown = 1 - if(src.hud_used.adding) - src.client.screen += src.hud_used.adding - if(src.hud_used.other && src.hud_used.inventory_shown) - src.client.screen += src.hud_used.other - if(src.hud_used.hotkeybuttons && !src.hud_used.hotkey_ui_hidden) - src.client.screen += src.hud_used.hotkeybuttons - if(src.internals) - src.client.screen |= src.internals - src.hud_used.action_intent.screen_loc = ui_acti //Restore intent selection to the original position - - hud_used.hidden_inventory_update() - hud_used.persistant_inventory_update() - update_action_buttons() - -/client/proc/reset_click_catchers() - - var/xmin = -(round(last_view_x_dim*0.5)) - var/xmax = last_view_x_dim - abs(xmin) - var/ymin = -(round(last_view_y_dim*0.5)) - var/ymax = last_view_y_dim - abs(ymin) - - var/list/click_catchers = get_click_catchers() - for(var/obj/screen/click_catcher/catcher in click_catchers) - if(catcher.x_offset <= xmin || catcher.x_offset >= xmax || catcher.y_offset <= ymin || catcher.y_offset >= ymax) - screen -= catcher - else - screen |= catcher - -/mob/proc/add_click_catcher() - client.reset_click_catchers() - -/mob/new_player/add_click_catcher() - return - -/obj/screen/stamina - name = "stamina" - icon = 'icons/effects/progressbar.dmi' - icon_state = "prog_bar_100" - invisibility = INVISIBILITY_MAXIMUM - screen_loc = ui_stamina diff --git a/code/_onclick/hud/hud_elements/_hud_element.dm b/code/_onclick/hud/hud_elements/_hud_element.dm new file mode 100644 index 00000000000..4d091c58951 --- /dev/null +++ b/code/_onclick/hud/hud_elements/_hud_element.dm @@ -0,0 +1,49 @@ +/decl/hud_element + abstract_type = /decl/hud_element + var/screen_name + var/screen_icon + var/screen_icon_state + var/screen_loc + var/screen_object_type = /obj/screen + + var/hidable = FALSE + var/apply_hud_color = TRUE + var/apply_hud_alpha = TRUE + var/apply_hud_icon = TRUE + var/apply_color_on_cooldown = FALSE + + var/update_in_life = FALSE + + var/hud_element_category + +/decl/hud_element/proc/refresh_screen_object(var/datum/hud/hud, var/obj/screen/elem, var/datum/gas_mixture/environment) + return + +/decl/hud_element/proc/create_screen_object(var/datum/hud/hud) + var/obj/screen/elem = new screen_object_type + if(screen_name) + elem.SetName(screen_name) + if(apply_hud_color) + elem.color = hud.get_ui_color() + if(apply_hud_alpha) + elem.alpha = hud.get_ui_alpha() + if(apply_hud_icon) + elem.icon = hud.get_ui_style() + else if(screen_icon) + elem.icon = screen_icon + if(screen_icon_state) + elem.icon_state = screen_icon_state + if(screen_loc) + elem.screen_loc = screen_loc + register_screen_object(elem, hud) + return elem + +/decl/hud_element/proc/register_screen_object(var/obj/screen/elem, var/datum/hud/hud) + hud.misc_hud_elements |= elem + +/decl/hud_element/condition + screen_icon = 'icons/mob/screen/condition.dmi' + apply_hud_icon = FALSE + apply_hud_alpha = FALSE + apply_hud_color = FALSE + update_in_life = TRUE diff --git a/code/_onclick/hud/hud_elements/ability_master.dm b/code/_onclick/hud/hud_elements/ability_master.dm new file mode 100644 index 00000000000..3f09c1f9f78 --- /dev/null +++ b/code/_onclick/hud/hud_elements/ability_master.dm @@ -0,0 +1,8 @@ +/decl/hud_element/ability_master + apply_hud_icon = FALSE + apply_hud_alpha = FALSE + apply_hud_color = FALSE + hud_element_category = /decl/hud_element/ability_master + +/decl/hud_element/ability_master/create_screen_object(datum/hud/hud) + return new /obj/screen/ability_master(null, hud?.mymob) diff --git a/code/_onclick/hud/hud_elements/action_intent.dm b/code/_onclick/hud/hud_elements/action_intent.dm new file mode 100644 index 00000000000..595ee131b57 --- /dev/null +++ b/code/_onclick/hud/hud_elements/action_intent.dm @@ -0,0 +1,29 @@ +/decl/hud_element/action_intent + screen_object_type = /obj/screen/intent + screen_icon = 'icons/mob/screen/intent.dmi' + hud_element_category = /decl/hud_element/action_intent + +/obj/screen/intent + name = "intent" + icon = 'icons/mob/screen/white.dmi' + icon_state = "intent_help" + screen_loc = ui_acti + var/intent = I_HELP + +/obj/screen/intent/Click(var/location, var/control, var/params) + var/list/P = params2list(params) + var/icon_x = text2num(P["icon-x"]) + var/icon_y = text2num(P["icon-y"]) + intent = I_DISARM + if(icon_x <= world.icon_size/2) + if(icon_y <= world.icon_size/2) + intent = I_HURT + else + intent = I_HELP + else if(icon_y <= world.icon_size/2) + intent = I_GRAB + update_icon() + usr.a_intent = intent + +/obj/screen/intent/on_update_icon() + icon_state = "intent_[intent]" diff --git a/code/_onclick/hud/hud_elements/bodytemp.dm b/code/_onclick/hud/hud_elements/bodytemp.dm new file mode 100644 index 00000000000..1854f103a56 --- /dev/null +++ b/code/_onclick/hud/hud_elements/bodytemp.dm @@ -0,0 +1,37 @@ +/decl/hud_element/condition/bodytemp + screen_name = "body temperature" + screen_object_type = /obj/screen/bodytemp + hud_element_category = /decl/hud_element/condition/bodytemp + screen_icon_state = "temp1" + screen_loc = ui_temp + +/decl/hud_element/condition/bodytemp/refresh_screen_object(var/datum/hud/hud, var/obj/screen/elem, var/datum/gas_mixture/environment) + //TODO: precalculate all of this stuff when the species datum is created + var/bodytemp = hud.mymob.bodytemperature + var/base_temperature = hud.mymob.get_ideal_bodytemp() + if (bodytemp >= base_temperature) + var/heat_level_1 = hud.mymob.get_temperature_threshold(HEAT_LEVEL_1) + var/temp_step = (heat_level_1 - base_temperature)/4 + if (bodytemp >= heat_level_1) + elem.icon_state = "temp4" + else if (bodytemp >= base_temperature + temp_step*3) + elem.icon_state = "temp3" + else if (bodytemp >= base_temperature + temp_step*2) + elem.icon_state = "temp2" + else if (bodytemp >= base_temperature + temp_step*1) + elem.icon_state = "temp1" + else + elem.icon_state = "temp0" + else if (bodytemp < base_temperature) + var/cold_level_1 = hud.mymob.get_temperature_threshold(COLD_LEVEL_1) + var/temp_step = (base_temperature - cold_level_1)/4 + if (bodytemp <= cold_level_1) + elem.icon_state = "temp-4" + else if (bodytemp <= base_temperature - temp_step*3) + elem.icon_state = "temp-3" + else if (bodytemp <= base_temperature - temp_step*2) + elem.icon_state = "temp-2" + else if (bodytemp <= base_temperature - temp_step*1) + elem.icon_state = "temp-1" + else + elem.icon_state = "temp0" diff --git a/code/_onclick/hud/hud_elements/cells.dm b/code/_onclick/hud/hud_elements/cells.dm new file mode 100644 index 00000000000..34aacb6d77e --- /dev/null +++ b/code/_onclick/hud/hud_elements/cells.dm @@ -0,0 +1,21 @@ +/decl/hud_element/cells + screen_name = "cell" + screen_icon_state = "charge-empty" + screen_icon = 'icons/mob/screen/robot_charge.dmi' + screen_loc = ui_nutrition + update_in_life = TRUE + +/decl/hud_element/cells/refresh_screen_object(datum/hud/hud, obj/screen/elem, datum/gas_mixture/environment) + if(!isliving(hud?.mymob)) + return + var/mob/living/user = hud.mymob + if(!user.isSynthetic()) + elem.invisibility = INVISIBILITY_MAXIMUM + else + elem.invisibility = 0 + var/obj/item/cell/cell = user.get_cell() + if(cell) + // 0-100 maps to 0-4, but give it a paranoid clamp just in case. + elem.icon_state = "charge[clamp(CEILING(cell.percent()/25), 0, 4)]" + else + elem.icon_state = "charge-empty" diff --git a/code/_onclick/hud/hud_elements/drop.dm b/code/_onclick/hud/hud_elements/drop.dm new file mode 100644 index 00000000000..d957a227b96 --- /dev/null +++ b/code/_onclick/hud/hud_elements/drop.dm @@ -0,0 +1,7 @@ +/decl/hud_element/drop + screen_name = "drop" + screen_icon_state = "act_drop" + screen_loc = ui_drop_throw + +/decl/hud_element/drop/register_screen_object(obj/screen/elem, datum/hud/hud) + hud.hotkey_hud_elements |= elem diff --git a/code/_onclick/hud/hud_elements/fire.dm b/code/_onclick/hud/hud_elements/fire.dm new file mode 100644 index 00000000000..706ee23b465 --- /dev/null +++ b/code/_onclick/hud/hud_elements/fire.dm @@ -0,0 +1,8 @@ +/decl/hud_element/condition/fire + screen_name = "fire" + screen_icon_state = "fire0" + screen_loc = ui_fire + hud_element_category = /decl/hud_element/condition/fire + +/decl/hud_element/condition/fire/refresh_screen_object(var/datum/hud/hud, var/obj/screen/elem, var/datum/gas_mixture/environment) + screen_icon_state = "fire[hud?.alerts ? (hud.alerts[hud_element_category] || 0) : 0]" diff --git a/code/_onclick/hud/hud_elements/gun_mode.dm b/code/_onclick/hud/hud_elements/gun_mode.dm new file mode 100644 index 00000000000..76f2d224d69 --- /dev/null +++ b/code/_onclick/hud/hud_elements/gun_mode.dm @@ -0,0 +1,95 @@ +// Omit the base gun_mode because it doesn't care about specific gun use flags +var/global/list/gun_hud_flag_decl_types = list( + /decl/hud_element/gun_flag_move, + /decl/hud_element/gun_flag_item, + /decl/hud_element/gun_flag_radio +) + +/// Root type for flag toggling in gun mode. +/obj/screen/gun_flag + name = "gun" + master = null + dir = SOUTH + + var/option_name + var/option_state + var/option_flag + +/obj/screen/gun_flag/proc/update_from_aiming_overlay(var/obj/aiming_overlay/aiming_overlay) + if(!aiming_overlay || !option_flag || !option_name || !option_state) + return + if(aiming_overlay.target_permissions & option_flag) + icon_state = "[option_state]1" + SetName("Disallow [option_name]]") + else + icon_state = "[option_state]0" + SetName("Allow [option_name]") + +/obj/screen/gun_flag/Click(location, control, params) + if(isliving(usr) && option_flag && option_name && option_state) + var/mob/living/user = usr + if(!user.aiming) + user.aiming = new(user) + user.aiming.toggle_permission(option_flag) + return TRUE + return FALSE + +/// Root gun mode type - toggles aiming mode off or on when ticked. +/obj/screen/gun_mode + name = "Toggle Gun Mode" + icon_state = "gun0" + screen_loc = ui_gun_select + master = null + dir = SOUTH + +/decl/hud_element/gun_mode + screen_object_type = /obj/screen/gun_mode + hud_element_category = /decl/hud_element/gun_mode + +/// Element for dis/allowing gun mode target clicking. +/obj/screen/gun_flag/item + name = "Allow Item Use" + icon_state = "no_item1" + screen_loc = ui_gun1 + option_name = "Item Use" + option_state = "no_item" + option_flag = TARGET_CAN_CLICK + +/decl/hud_element/gun_flag_item + screen_object_type = /obj/screen/gun_flag/item + hud_element_category = /decl/hud_element/gun_flag_item + +/decl/hud_element/gun_flag_item/register_screen_object(obj/screen/elem, datum/hud/hud) + return + +/// Element for dis/allowing gun mode target movement. +/obj/screen/gun_flag/move + name = "Allow Movement" + icon_state = "no_walk1" + screen_loc = ui_gun2 + option_name = "Movement" + option_state = "no_walk" + option_flag = TARGET_CAN_MOVE + +/decl/hud_element/gun_flag_move + screen_object_type = /obj/screen/gun_flag/move + hud_element_category = /decl/hud_element/gun_flag_move + +/decl/hud_element/gun_flag_move/register_screen_object(obj/screen/elem, datum/hud/hud) + return + +/// Element for dis/allowing gun mode target radio use. +/decl/hud_element/gun_flag_radio + screen_object_type = /obj/screen/gun_flag/radio + hud_element_category = /decl/hud_element/gun_flag_radio + +/decl/hud_element/gun_flag_radio/register_screen_object(obj/screen/elem, datum/hud/hud) + return + +/obj/screen/gun_flag/radio + name = "Disallow Radio Use" + icon_state = "no_radio1" + screen_loc = ui_gun4 + option_name = "Radio Use" + option_state = "no_radio" + option_flag = TARGET_CAN_RADIO diff --git a/code/_onclick/hud/hud_elements/health.dm b/code/_onclick/hud/hud_elements/health.dm new file mode 100644 index 00000000000..2d84c53ccd1 --- /dev/null +++ b/code/_onclick/hud/hud_elements/health.dm @@ -0,0 +1,81 @@ +/decl/hud_element/health + screen_name = "health" + screen_icon = 'icons/mob/screen/health_human.dmi' + screen_icon_state = "health0" + apply_hud_icon = FALSE + apply_hud_alpha = FALSE + apply_hud_color = FALSE + var/health_states = 6 + var/death_state = 7 + var/numb_state = "_numb" + +/decl/hud_element/health/refresh_screen_object(datum/hud/hud, obj/screen/elem, datum/gas_mixture/environment) + if(!isliving(hud?.mymob)) + return + var/mob/living/user = hud.mymob + reset_health_overlays(user, elem) + if(user.stat == DEAD) + elem.icon_state = "health[death_state]" + else if(user.has_chemical_effect(CE_PAINKILLER, 100)) + elem.icon_state = "health[numb_state]" + else + update_health_overlays(user, elem) + +/decl/hud_element/health/proc/reset_health_overlays(mob/living/user, obj/screen/elem) + return + +/decl/hud_element/health/proc/update_health_overlays(mob/living/user, obj/screen/elem) + elem.icon_state = "health[health_states - round(user.get_health_ratio() * health_states)]" + +/decl/hud_element/health/human + screen_icon_state = "blank" + var/health_icon = 'icons/mob/screen/health_human.dmi' + var/burning_image + var/softcrit_image + var/hardcrit_image + var/fullhealth_image + +/decl/hud_element/health/human/Initialize() + . = ..() + burning_image = image(health_icon, "burning") + softcrit_image = image(health_icon, "softcrit") + hardcrit_image = image(health_icon, "hardcrit") + fullhealth_image = image(health_icon, "fullhealth") + +/decl/hud_element/health/human/reset_health_overlays(mob/living/user, obj/screen/elem) + elem.cut_overlays() + elem.icon_state = "blank" + +/decl/hud_element/health/human/update_health_overlays(mob/living/user, obj/screen/elem) + + // Generate a by-limb health display. + // Pain modifies the effective pain level used to colour the limb. + var/no_damage = 1 + var/trauma_val = 0 // Used in calculating softcrit/hardcrit indicators. + if(user.can_feel_pain() && ishuman(user)) + var/mob/living/carbon/human/human = user + trauma_val = max(human.shock_stage, human.get_shock()) / (user.get_max_health()-100) // TODO: where is this 100 coming from? + + for(var/obj/item/organ/external/E in user.get_external_organs()) + if(no_damage && (E.brute_dam || E.burn_dam)) + no_damage = 0 + var/organ_image = E.get_damage_hud_image() + if(organ_image) + elem.add_overlay(organ_image) + + // Apply a fire overlay if we're burning. + if(user.on_fire) + elem.add_overlay(burning_image) + + // Show a general pain/crit indicator if needed. + if(user.is_asystole()) + elem.add_overlay(hardcrit_image) + else if(trauma_val) + if(user.can_feel_pain()) + if(trauma_val > 0.7) + elem.add_overlay(softcrit_image) + if(trauma_val >= 1) + elem.add_overlay(hardcrit_image) + else if(no_damage) + elem.add_overlay(fullhealth_image) + elem.compile_overlays() diff --git a/code/_onclick/hud/hud_elements/hydration.dm b/code/_onclick/hud/hud_elements/hydration.dm new file mode 100644 index 00000000000..cd6569f94cd --- /dev/null +++ b/code/_onclick/hud/hud_elements/hydration.dm @@ -0,0 +1,21 @@ +/decl/hud_element/condition/hydration + screen_name = "hydration" + screen_object_type = /obj/screen/drink + screen_icon_state = "hydration1" + screen_loc = ui_nutrition_small + hud_element_category = /decl/hud_element/condition/hydration + var/hud_states = 4 + +/decl/hud_element/condition/hydration/refresh_screen_object(datum/hud/hud, obj/screen/elem, datum/gas_mixture/environment) + if(!isliving(hud?.mymob)) + return + var/mob/living/user = hud.mymob + var/max_hyd = user.get_max_hydration() + var/hyd = user.get_hydration() + var/hyd_offset = max_hyd * 0.2 + if(hyd >= max_hyd - hyd_offset) + elem.icon_state = "hydration[hud_states]" + else if(hyd <= hyd_offset * 2) + elem.icon_state = "hydration" + else + elem.icon_state = "hydration[round(((hyd-(hyd_offset*2))/(max_hyd-hyd_offset))*(hud_states-2))+1]" diff --git a/code/_onclick/hud/hud_elements/internals.dm b/code/_onclick/hud/hud_elements/internals.dm new file mode 100644 index 00000000000..16eb2360536 --- /dev/null +++ b/code/_onclick/hud/hud_elements/internals.dm @@ -0,0 +1,8 @@ +/decl/hud_element/internals + screen_name = "internal" + screen_icon = 'icons/mob/screen/internals.dmi' + screen_icon_state = "internal0" + screen_loc = ui_internal + apply_hud_icon = FALSE + apply_hud_alpha = FALSE + apply_hud_color = FALSE diff --git a/code/_onclick/hud/hud_elements/move_intent.dm b/code/_onclick/hud/hud_elements/move_intent.dm new file mode 100644 index 00000000000..df79aeb7a99 --- /dev/null +++ b/code/_onclick/hud/hud_elements/move_intent.dm @@ -0,0 +1,9 @@ +/decl/hud_element/move_intent + screen_name = "movement method" + screen_object_type = /obj/screen/movement + screen_loc = ui_movi + hud_element_category = /decl/hud_element/move_intent + +/decl/hud_element/move_intent/create_screen_object(var/datum/hud/hud) + var/obj/screen/elem = ..() + elem.icon_state = hud.mymob.move_intent.hud_icon_state diff --git a/code/_onclick/hud/hud_elements/nutrition.dm b/code/_onclick/hud/hud_elements/nutrition.dm new file mode 100644 index 00000000000..46cfc164820 --- /dev/null +++ b/code/_onclick/hud/hud_elements/nutrition.dm @@ -0,0 +1,26 @@ +/decl/hud_element/condition/nutrition + screen_name = "nutrition" + screen_object_type = /obj/screen/food + screen_icon_state = "nutrition1" + screen_loc = ui_nutrition_small + hud_element_category = /decl/hud_element/condition/nutrition + var/hud_states = 4 + +/decl/hud_element/condition/nutrition/create_screen_object(datum/hud/hud) + var/obj/screen/elem = ..() + elem.pixel_w = 8 + return elem + +/decl/hud_element/condition/nutrition/refresh_screen_object(datum/hud/hud, obj/screen/elem, datum/gas_mixture/environment) + if(!isliving(hud?.mymob)) + return + var/mob/living/user = hud.mymob + var/max_nut = user.get_max_nutrition() + var/nut = user.get_nutrition() + var/nut_offset = max_nut * 0.2 + if(nut >= max_nut - nut_offset) + elem.icon_state = "nutrition[hud_states]" + else if(nut <= nut_offset * 2) + elem.icon_state = "nutrition0" + else + elem.icon_state = "nutrition[round(((nut-(nut_offset*2))/(max_nut-nut_offset))*(hud_states-2))+1]" diff --git a/code/_onclick/hud/hud_elements/oxygen.dm b/code/_onclick/hud/hud_elements/oxygen.dm new file mode 100644 index 00000000000..26603a2aabf --- /dev/null +++ b/code/_onclick/hud/hud_elements/oxygen.dm @@ -0,0 +1,9 @@ +/decl/hud_element/condition/oxygen + screen_name = "oxygen" + screen_object_type = /obj/screen/oxygen + screen_loc = ui_temp + screen_icon_state = "oxy0" + hud_element_category = /decl/hud_element/condition/oxygen + +/decl/hud_element/condition/oxygen/refresh_screen_object(datum/hud/hud, obj/screen/elem, datum/gas_mixture/environment) + elem.icon_state = "oxy[hud?.alerts ? (LAZYACCESS(hud.alerts, hud_element_category) || 0) : 0]" diff --git a/code/_onclick/hud/hud_elements/pain.dm b/code/_onclick/hud/hud_elements/pain.dm new file mode 100644 index 00000000000..917fe3c8665 --- /dev/null +++ b/code/_onclick/hud/hud_elements/pain.dm @@ -0,0 +1,2 @@ +/decl/hud_element/pain + screen_object_type = /obj/screen/fullscreen/pain diff --git a/code/_onclick/hud/hud_elements/pressure.dm b/code/_onclick/hud/hud_elements/pressure.dm new file mode 100644 index 00000000000..0c6250cd567 --- /dev/null +++ b/code/_onclick/hud/hud_elements/pressure.dm @@ -0,0 +1,9 @@ +/decl/hud_element/condition/pressure + screen_name = "pressure" + screen_object_type = /obj/screen/pressure + screen_icon_state = "pressure0" + screen_loc = ui_temp + hud_element_category = /decl/hud_element/condition/pressure + +/decl/hud_element/condition/pressure/refresh_screen_object(datum/hud/hud, obj/screen/elem, datum/gas_mixture/environment) + elem.icon_state = "pressure[hud?.alerts ? (LAZYACCESS(hud.alerts, hud_element_category) || 0) : 0]" diff --git a/code/_onclick/hud/hud_elements/resist.dm b/code/_onclick/hud/hud_elements/resist.dm new file mode 100644 index 00000000000..35c2e12cc1a --- /dev/null +++ b/code/_onclick/hud/hud_elements/resist.dm @@ -0,0 +1,7 @@ +/decl/hud_element/resist + screen_name = "resist" + screen_icon_state = "act_resist" + screen_loc = ui_pull_resist + +/decl/hud_element/resist/register_screen_object(obj/screen/elem, datum/hud/hud) + hud.hotkey_hud_elements |= elem diff --git a/code/_onclick/hud/hud_elements/stamina.dm b/code/_onclick/hud/hud_elements/stamina.dm new file mode 100644 index 00000000000..e2fd7b442ac --- /dev/null +++ b/code/_onclick/hud/hud_elements/stamina.dm @@ -0,0 +1,12 @@ +/decl/hud_element/stamina_bar + screen_object_type = /obj/screen/stamina + apply_hud_alpha = FALSE + apply_hud_color = FALSE + apply_hud_icon = FALSE + +/obj/screen/stamina + name = "stamina" + icon = 'icons/effects/progressbar.dmi' + icon_state = "prog_bar_100" + invisibility = INVISIBILITY_MAXIMUM + screen_loc = ui_stamina \ No newline at end of file diff --git a/code/_onclick/hud/hud_elements/throwing.dm b/code/_onclick/hud/hud_elements/throwing.dm new file mode 100644 index 00000000000..158dda5b0fe --- /dev/null +++ b/code/_onclick/hud/hud_elements/throwing.dm @@ -0,0 +1,7 @@ +/decl/hud_element/throwing + screen_name = "throw" + screen_icon_state = "act_throw_off" + screen_loc = ui_drop_throw + +/decl/hud_element/throwing/register_screen_object(obj/screen/elem, datum/hud/hud) + hud.hotkey_hud_elements |= elem diff --git a/code/_onclick/hud/hud_elements/toxins.dm b/code/_onclick/hud/hud_elements/toxins.dm new file mode 100644 index 00000000000..5f42892c4b3 --- /dev/null +++ b/code/_onclick/hud/hud_elements/toxins.dm @@ -0,0 +1,9 @@ +/decl/hud_element/condition/toxins + screen_name = "toxin" + screen_object_type = /obj/screen/toxins + screen_icon_state = "tox0" + screen_loc = ui_temp + hud_element_category = /decl/hud_element/condition/toxins + +/decl/hud_element/condition/toxins/refresh_screen_object(datum/hud/hud, obj/screen/elem, datum/gas_mixture/environment) + elem.icon_state = "tox[hud?.alerts ? (LAZYACCESS(hud.alerts, hud_element_category) || 0) : 0]" diff --git a/code/_onclick/hud/hud_elements/up_hint.dm b/code/_onclick/hud/hud_elements/up_hint.dm new file mode 100644 index 00000000000..e845411cb1a --- /dev/null +++ b/code/_onclick/hud/hud_elements/up_hint.dm @@ -0,0 +1,5 @@ +/decl/hud_element/up_hint + screen_name = "up hint" + screen_icon_state = "uphint0" + screen_loc = ui_up_hint + diff --git a/code/_onclick/hud/hud_elements/zone_selector.dm b/code/_onclick/hud/hud_elements/zone_selector.dm new file mode 100644 index 00000000000..4776e0b8355 --- /dev/null +++ b/code/_onclick/hud/hud_elements/zone_selector.dm @@ -0,0 +1,3 @@ +/decl/hud_element/zone_selector + screen_object_type = /obj/screen/zone_selector + hud_element_category = /decl/hud_element/zone_selector diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index f90bd824fde..54f91ae1012 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -1,202 +1,51 @@ /mob/living/carbon/human - hud_type = /datum/hud/human - -/datum/hud/human/FinalizeInstantiation() - - var/ui_style = get_ui_style() - var/ui_color = get_ui_color() - var/ui_alpha = get_ui_alpha() - - var/mob/living/carbon/human/target = mymob - var/datum/hud_data/hud_data = istype(target) ? target.species.hud : new() - if(hud_data.icon) - ui_style = hud_data.icon - - hotkeybuttons = list() //These can be disabled for hotkey usersx - - var/obj/screen/using - - stamina_bar = new - adding += stamina_bar - - // Draw the attack intent dialogue. - if(hud_data.has_a_intent) - using = new /obj/screen/intent() - src.adding += using - action_intent = using - hud_elements |= using - - if(hud_data.has_m_intent) - using = new /obj/screen/movement() - using.SetName("movement method") - using.icon = ui_style - using.icon_state = mymob.move_intent.hud_icon_state - using.screen_loc = ui_movi - using.color = ui_color - using.alpha = ui_alpha - src.adding += using - move_intent = using - - if(hud_data.has_drop) - using = new /obj/screen() - using.SetName("drop") - using.icon = ui_style - using.icon_state = "act_drop" - using.screen_loc = ui_drop_throw - using.color = ui_color - using.alpha = ui_alpha - src.hotkeybuttons += using - - if(hud_data.has_hands) - BuildHandsUI() - - if(hud_data.has_resist) - using = new /obj/screen() - using.SetName("resist") - using.icon = ui_style - using.icon_state = "act_resist" - using.screen_loc = ui_pull_resist - using.color = ui_color - using.alpha = ui_alpha - src.hotkeybuttons += using - - if(hud_data.has_throw) - mymob.throw_icon = new /obj/screen() - mymob.throw_icon.icon = ui_style - mymob.throw_icon.icon_state = "act_throw_off" - mymob.throw_icon.SetName("throw") - mymob.throw_icon.screen_loc = ui_drop_throw - mymob.throw_icon.color = ui_color - mymob.throw_icon.alpha = ui_alpha - src.hotkeybuttons += mymob.throw_icon - hud_elements |= mymob.throw_icon - - if(hud_data.has_internals) - mymob.internals = new /obj/screen() - mymob.internals.icon = ui_style - mymob.internals.icon_state = "internal0" - mymob.internals.SetName("internal") - mymob.internals.screen_loc = ui_internal - hud_elements |= mymob.internals - - if(hud_data.has_warnings) - mymob.healths = new /obj/screen() - mymob.healths.icon = ui_style - mymob.healths.icon_state = "health0" - mymob.healths.SetName("health") - mymob.healths.screen_loc = ui_health - hud_elements |= mymob.healths - - mymob.oxygen = new /obj/screen/oxygen() - mymob.oxygen.icon = 'icons/mob/status_indicators.dmi' - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.SetName("oxygen") - mymob.oxygen.screen_loc = ui_temp - hud_elements |= mymob.oxygen - - mymob.toxin = new /obj/screen/toxins() - mymob.toxin.icon = 'icons/mob/status_indicators.dmi' - mymob.toxin.icon_state = "tox0" - mymob.toxin.SetName("toxin") - mymob.toxin.screen_loc = ui_temp - hud_elements |= mymob.toxin - - mymob.fire = new /obj/screen() - mymob.fire.icon = ui_style - mymob.fire.icon_state = "fire0" - mymob.fire.SetName("fire") - mymob.fire.screen_loc = ui_fire - hud_elements |= mymob.fire - - if(hud_data.has_pressure) - mymob.pressure = new /obj/screen/pressure() - mymob.pressure.icon = 'icons/mob/status_indicators.dmi' - mymob.pressure.icon_state = "pressure0" - mymob.pressure.SetName("pressure") - mymob.pressure.screen_loc = ui_temp - hud_elements |= mymob.pressure - - if(hud_data.has_bodytemp) - mymob.bodytemp = new /obj/screen/bodytemp() - mymob.bodytemp.icon = 'icons/mob/status_indicators.dmi' - mymob.bodytemp.icon_state = "temp1" - mymob.bodytemp.SetName("body temperature") - mymob.bodytemp.screen_loc = ui_temp - hud_elements |= mymob.bodytemp - - if(target.isSynthetic()) - target.cells = new /obj/screen() - target.cells.icon = 'icons/mob/screen1_robot.dmi' - target.cells.icon_state = "charge-empty" - target.cells.SetName("cell") - target.cells.screen_loc = ui_nutrition - hud_elements |= target.cells - - else if(hud_data.has_nutrition) - mymob.nutrition_icon = new /obj/screen/food() - mymob.nutrition_icon.icon = 'icons/mob/status_hunger.dmi' - mymob.nutrition_icon.pixel_w = 8 - mymob.nutrition_icon.icon_state = "nutrition1" - mymob.nutrition_icon.SetName("nutrition") - mymob.nutrition_icon.screen_loc = ui_nutrition_small - hud_elements |= mymob.nutrition_icon - - mymob.hydration_icon = new /obj/screen/drink() - mymob.hydration_icon.icon = 'icons/mob/status_hunger.dmi' - mymob.hydration_icon.icon_state = "hydration1" - mymob.hydration_icon.SetName("hydration") - mymob.hydration_icon.screen_loc = ui_nutrition_small - hud_elements |= mymob.hydration_icon - - if(hud_data.has_up_hint) - mymob.up_hint = new /obj/screen() - mymob.up_hint.icon = ui_style - mymob.up_hint.icon_state = "uphint0" - mymob.up_hint.SetName("up hint") - mymob.up_hint.screen_loc = ui_up_hint - hud_elements |= mymob.up_hint - - mymob.pain = new /obj/screen/fullscreen/pain( null ) - hud_elements |= mymob.pain - - mymob.zone_sel = new - mymob.zone_sel.icon = ui_style - mymob.zone_sel.color = ui_color - mymob.zone_sel.alpha = ui_alpha - mymob.zone_sel.update_icon() - hud_elements |= mymob.zone_sel - - target.attack_selector = new - target.attack_selector.set_owner(target) - target.attack_selector.icon = ui_style - target.attack_selector.color = ui_color - target.attack_selector.alpha = ui_alpha - target.attack_selector.update_icon() - hud_elements |= target.attack_selector - - //Handle the gun settings buttons - mymob.gun_setting_icon = new /obj/screen/gun/mode(null) - mymob.gun_setting_icon.icon = ui_style - mymob.gun_setting_icon.color = ui_color - mymob.gun_setting_icon.alpha = ui_alpha - hud_elements |= mymob.gun_setting_icon - - mymob.item_use_icon = new /obj/screen/gun/item(null) - mymob.item_use_icon.icon = ui_style - mymob.item_use_icon.color = ui_color - mymob.item_use_icon.alpha = ui_alpha - - mymob.gun_move_icon = new /obj/screen/gun/move(null) - mymob.gun_move_icon.icon = ui_style - mymob.gun_move_icon.color = ui_color - mymob.gun_move_icon.alpha = ui_alpha - - mymob.radio_use_icon = new /obj/screen/gun/radio(null) - mymob.radio_use_icon.icon = ui_style - mymob.radio_use_icon.color = ui_color - mymob.radio_use_icon.alpha = ui_alpha - - ..() + hud_used = /datum/hud/human + +/decl/hud_element/attack_selector + screen_object_type = /obj/screen/default_attack_selector + hud_element_category = /decl/hud_element/attack_selector + +/decl/hud_element/attack_selector/register_screen_object(var/obj/screen/elem, var/datum/hud/hud) + var/obj/screen/default_attack_selector/attack_selector = elem + if(istype(attack_selector) && ishuman(hud.mymob)) + attack_selector.set_owner(hud.mymob) + attack_selector.update_icon() + return ..() + +/datum/hud/human + health_hud_type = /decl/hud_element/health/human + hud_elements = list( + /decl/hud_element/health/human, + /decl/hud_element/condition/bodytemp, + /decl/hud_element/attack_selector, + /decl/hud_element/zone_selector, + /decl/hud_element/move_intent, + /decl/hud_element/action_intent, + /decl/hud_element/condition/pressure, + /decl/hud_element/condition/fire, + /decl/hud_element/condition/toxins, + /decl/hud_element/condition/oxygen, + /decl/hud_element/condition/nutrition, + /decl/hud_element/condition/hydration, + /decl/hud_element/stamina_bar, + /decl/hud_element/drop, + /decl/hud_element/resist, + /decl/hud_element/throwing, + /decl/hud_element/up_hint, + /decl/hud_element/pain, + /decl/hud_element/internals, + /decl/hud_element/gun_mode, + /decl/hud_element/gun_flag_item, + /decl/hud_element/gun_flag_move, + /decl/hud_element/gun_flag_radio + ) + +/datum/hud/human/get_ui_style() + var/decl/species/my_species = mymob?.get_species() + var/datum/hud_data/hud_data = my_species?.hud || new + if(hud_data?.icon) + return hud_data.icon + return ..() /mob/living/carbon/human/verb/toggle_hotkey_verbs() set category = "OOC" @@ -204,17 +53,16 @@ set desc = "This disables or enables the user interface buttons which can be used with hotkeys." if(hud_used.hotkey_ui_hidden) - client.screen += hud_used.hotkeybuttons + client.screen |= hud_used.hotkey_hud_elements hud_used.hotkey_ui_hidden = 0 else - client.screen -= hud_used.hotkeybuttons + client.screen -= hud_used.hotkey_hud_elements hud_used.hotkey_ui_hidden = 1 // Yes, these use icon state. Yes, these are terrible. The alternative is duplicating // a bunch of fairly blobby logic for every click override on these objects. - /obj/screen/food/Click(var/location, var/control, var/params) - if(istype(usr) && usr.nutrition_icon == src) + if(usr.get_hud_element(/decl/hud_element/condition/nutrition) == src) switch(icon_state) if("nutrition0") to_chat(usr, SPAN_WARNING("You are completely stuffed.")) @@ -228,7 +76,7 @@ to_chat(usr, SPAN_DANGER("You are starving!")) /obj/screen/drink/Click(var/location, var/control, var/params) - if(istype(usr) && usr.hydration_icon == src) + if(usr.get_hud_element(/decl/hud_element/condition/hydration) == src) switch(icon_state) if("hydration0") to_chat(usr, SPAN_WARNING("You are overhydrated.")) @@ -242,7 +90,7 @@ to_chat(usr, SPAN_DANGER("You are dying of thirst!")) /obj/screen/bodytemp/Click(var/location, var/control, var/params) - if(istype(usr) && usr.bodytemp == src) + if(usr.get_hud_element(/decl/hud_element/condition/bodytemp) == src) switch(icon_state) if("temp4") to_chat(usr, SPAN_DANGER("You are being cooked alive!")) @@ -264,7 +112,7 @@ to_chat(usr, SPAN_NOTICE("Your body is at a comfortable temperature.")) /obj/screen/pressure/Click(var/location, var/control, var/params) - if(istype(usr) && usr.pressure == src) + if(usr.get_hud_element(/decl/hud_element/condition/pressure) == src) switch(icon_state) if("pressure2") to_chat(usr, SPAN_DANGER("The air pressure here is crushing!")) @@ -278,14 +126,14 @@ to_chat(usr, SPAN_NOTICE("The local air pressure is comfortable.")) /obj/screen/toxins/Click(var/location, var/control, var/params) - if(istype(usr) && usr.toxin == src) + if(usr.get_hud_element(/decl/hud_element/condition/toxins) == src) if(icon_state == "tox0") to_chat(usr, SPAN_NOTICE("The air is clear of toxins.")) else to_chat(usr, SPAN_DANGER("The air is eating away at your skin!")) /obj/screen/oxygen/Click(var/location, var/control, var/params) - if(istype(usr) && usr.oxygen == src) + if(usr.get_hud_element(/decl/hud_element/condition/oxygen) == src) if(icon_state == "oxy0") to_chat(usr, SPAN_NOTICE("You are breathing easy.")) else diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm deleted file mode 100644 index d7eb03aac29..00000000000 --- a/code/_onclick/hud/other_mobs.dm +++ /dev/null @@ -1,42 +0,0 @@ -/mob/living/simple_animal/construct - hud_type = /datum/hud/construct - -/mob/living/simple_animal/construct - var/hud_construct_type - -/mob/living/simple_animal/construct/armoured - hud_construct_type = "juggernaut" - -/mob/living/simple_animal/construct/behemoth - hud_construct_type = "juggernaut" - -/mob/living/simple_animal/construct/builder - hud_construct_type = "artificer" - -/mob/living/simple_animal/construct/wraith - hud_construct_type = "wraith" - -/mob/living/simple_animal/construct/harvester - hud_construct_type = "harvester" - -/datum/hud/construct/FinalizeInstantiation() - var/constructtype - if(isconstruct(mymob)) - var/mob/living/simple_animal/construct/construct = mymob - constructtype = construct.hud_construct_type - if(constructtype) - mymob.fire = new /obj/screen() - mymob.fire.icon = 'icons/mob/screen1_construct.dmi' - mymob.fire.icon_state = "fire0" - mymob.fire.SetName("fire") - mymob.fire.screen_loc = ui_construct_fire - mymob.healths = new /obj/screen() - mymob.healths.icon = 'icons/mob/screen1_construct.dmi' - mymob.healths.icon_state = "[constructtype]_health0" - mymob.healths.SetName("health") - mymob.healths.screen_loc = ui_construct_health - mymob.zone_sel = new - mymob.zone_sel.icon = 'icons/mob/screen1_construct.dmi' - mymob.zone_sel.update_icon() - adding += list(mymob.fire, mymob.healths, mymob.zone_sel) - ..() diff --git a/code/_onclick/hud/pai.dm b/code/_onclick/hud/pai.dm index c2926b006ff..67058ed29c3 100644 --- a/code/_onclick/hud/pai.dm +++ b/code/_onclick/hud/pai.dm @@ -2,21 +2,20 @@ var/obj/screen/using using = new /obj/screen/pai/software() using.SetName("Software Interface") - adding += using + misc_hud_elements += using using = new /obj/screen/pai/subsystems() using.SetName("Subsystems") - adding += using + misc_hud_elements += using using = new /obj/screen/pai/shell() using.SetName("Toggle Chassis") - adding += using + misc_hud_elements += using using = new /obj/screen/pai/rest() using.SetName("Rest") - adding += using + misc_hud_elements += using using = new /obj/screen/pai/light() using.SetName("Toggle Light") - adding += using - ..() - hide_inventory() + misc_hud_elements += using + return ..() /obj/screen/pai icon = 'icons/mob/screen/pai.dmi' diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 3a9c97bd923..88af6a84af5 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -1,179 +1,155 @@ -var/global/obj/screen/robot_inventory - -/obj/screen/robot_drop_grab - name = "drop grab" - icon = 'icons/mob/screen1_robot.dmi' - icon_state = "drop_grab" +/mob/living/silicon/robot + var/obj/screen/hands + hud_used = /datum/hud/robot + +/decl/hud_element/condition/fire/robot + screen_icon = 'icons/mob/screen/robot_conditions.dmi' + +/decl/hud_element/condition/oxygen/robot + screen_icon = 'icons/mob/screen/robot_conditions.dmi' + +/decl/hud_element/condition/bodytemp/robot + screen_icon = 'icons/mob/screen/robot_conditions.dmi' + +/decl/hud_element/module + screen_name = "module" + screen_icon = 'icons/mob/screen/robot_modules.dmi' + screen_icon_state = "nomod" + screen_loc = ui_borg_module + +/decl/hud_element/radio + screen_name = "radio" + screen_icon_state = "radio" + screen_loc = ui_movi + +/decl/hud_element/radio/create_screen_object(datum/hud/hud) + var/obj/screen/elem = ..() + elem.set_dir(SOUTHWEST) + return elem + +/decl/hud_element/drop_grab + screen_name = "drop grab" + screen_object_type = /obj/screen/robot_drop_grab + screen_icon = 'icons/mob/screen/robot_drop_grab.dmi' + screen_icon_state = "drop_grab" screen_loc = ui_borg_drop_grab - invisibility = INVISIBILITY_MAXIMUM - alpha = 0 + update_in_life = TRUE + +/decl/hud_element/drop_grab/create_screen_object(datum/hud/hud) + var/obj/screen/elem = ..() + if(length(hud?.mymob?.get_active_grabs())) + elem.invisibility = 0 + elem.alpha = 255 + else + elem.invisibility = INVISIBILITY_MAXIMUM + elem.alpha = 0 + return elem + +/decl/hud_element/drop_grab/refresh_screen_object(datum/hud/hud, obj/screen/elem, datum/gas_mixture/environment) + . = ..() + if(length(hud?.mymob?.get_active_grabs())) + elem.invisibility = 0 + elem.alpha = 255 + else + elem.invisibility = INVISIBILITY_MAXIMUM + elem.alpha = 0 /obj/screen/robot_drop_grab/Click(location, control, params) . = ..() - if(isrobot(usr) && !usr.incapacitated()) - var/mob/living/silicon/robot/R = usr - R.drop_item() - set_invisibility(INVISIBILITY_MAXIMUM) - alpha = 0 + if(!isrobot(usr) || usr.incapacitated()) + return -/mob/living/silicon/robot - hud_type = /datum/hud/robot + var/mob/living/silicon/robot/R = usr + R.drop_item() + invisibility = INVISIBILITY_MAXIMUM + alpha = 0 + +/decl/hud_element/health/robot + screen_icon = 'icons/mob/screen/health_robot.dmi' + screen_loc = ui_borg_health + +/decl/hud_element/module_panel + screen_name = "panel" + screen_icon_state = "panel" + screen_loc = ui_borg_panel + +/decl/hud_element/robot_inventory + screen_name = "inventory" + screen_icon_state = "inventory" + screen_loc = ui_borg_inventory + +/datum/hud/robot + health_hud_type = /decl/hud_element/health/robot + hud_elements = list( + /decl/hud_element/health/robot, + /decl/hud_element/drop_grab, + /decl/hud_element/radio, + /decl/hud_element/module, + /decl/hud_element/module_panel, + /decl/hud_element/robot_inventory, + /decl/hud_element/condition/fire/robot, + /decl/hud_element/condition/oxygen/robot, + /decl/hud_element/condition/bodytemp/robot + ) + +/datum/hud/robot/get_ui_color() + return COLOR_WHITE + +/datum/hud/robot/get_ui_alpha() + return 255 + +/datum/hud/robot/get_ui_style() + return 'icons/mob/screen/robot.dmi' /datum/hud/robot/FinalizeInstantiation() var/mob/living/silicon/robot/R = mymob if(!istype(R)) ..() - return + return ..() + var/mob/living/silicon/robot/R = mymob var/obj/screen/using - - //Radio - using = new /obj/screen() - using.SetName("radio") - using.set_dir(SOUTHWEST) - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = "radio" - using.screen_loc = ui_movi - adding += using + var/ui_style = get_ui_style() //Module select - using = new /obj/screen() using.SetName("module1") using.set_dir(SOUTHWEST) - using.icon = 'icons/mob/screen1_robot.dmi' + using.icon = ui_style using.icon_state = "inv1" using.screen_loc = ui_inv1 - adding += using + misc_hud_elements += using R.inv1 = using using = new /obj/screen() using.SetName("module2") using.set_dir(SOUTHWEST) - using.icon = 'icons/mob/screen1_robot.dmi' + using.icon = ui_style using.icon_state = "inv2" using.screen_loc = ui_inv2 - adding += using + misc_hud_elements += using R.inv2 = using using = new /obj/screen() using.SetName("module3") using.set_dir(SOUTHWEST) - using.icon = 'icons/mob/screen1_robot.dmi' + using.icon = ui_style using.icon_state = "inv3" using.screen_loc = ui_inv3 - adding += using + misc_hud_elements += using R.inv3 = using - //End of module select - // Drop UI - R.ui_drop_grab = new - adding += R.ui_drop_grab - - //Intent - using = new /obj/screen() - using.SetName("act_intent") - using.set_dir(SOUTHWEST) - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = R.a_intent - using.screen_loc = ui_acti - adding += using - action_intent = using - - //Cell - R.cells = new /obj/screen() - R.cells.icon = 'icons/mob/screen1_robot.dmi' - R.cells.icon_state = "charge-empty" - R.cells.SetName("cell") - R.cells.screen_loc = ui_toxin - - //Health - R.healths = new /obj/screen() - R.healths.icon = 'icons/mob/screen1_robot.dmi' - R.healths.icon_state = "health0" - R.healths.SetName("health") - R.healths.screen_loc = ui_borg_health - - //Installed Module - R.hands = new /obj/screen() - R.hands.icon = 'icons/mob/screen1_robot.dmi' - R.hands.icon_state = "nomod" - R.hands.SetName("module") - R.hands.screen_loc = ui_borg_module - - //Module Panel - using = new /obj/screen() - using.SetName("panel") - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = "panel" - using.screen_loc = ui_borg_panel - adding += using - - //Store - R.throw_icon = new /obj/screen() - R.throw_icon.icon = 'icons/mob/screen1_robot.dmi' - R.throw_icon.icon_state = "store" - R.throw_icon.SetName("store") - R.throw_icon.screen_loc = ui_borg_store - - //Inventory - robot_inventory = new /obj/screen() - robot_inventory.SetName("inventory") - robot_inventory.icon = 'icons/mob/screen1_robot.dmi' - robot_inventory.icon_state = "inventory" - robot_inventory.screen_loc = ui_borg_inventory - - //Temp - R.bodytemp = new /obj/screen() - R.bodytemp.icon = 'icons/mob/status_indicators.dmi' - R.bodytemp.icon_state = "temp0" - R.bodytemp.SetName("body temperature") - R.bodytemp.screen_loc = ui_temp - - - R.oxygen = new /obj/screen() - R.oxygen.icon = 'icons/mob/screen1_robot.dmi' - R.oxygen.icon_state = "oxy0" - R.oxygen.SetName("oxygen") - R.oxygen.screen_loc = ui_oxygen - - R.fire = new /obj/screen() - R.fire.icon = 'icons/mob/screen1_robot.dmi' - R.fire.icon_state = "fire0" - R.fire.SetName("fire") - R.fire.screen_loc = ui_fire - - R.up_hint = new /obj/screen() - R.up_hint.icon = 'icons/mob/screen1_robot.dmi' - R.up_hint.icon_state = "uphint0" - R.up_hint.SetName("up hint") - R.up_hint.screen_loc = ui_up_hint - - R.zone_sel = new - R.zone_sel.icon = 'icons/mob/screen1_robot.dmi' - R.zone_sel.update_icon() - - //Handle the gun settings buttons - R.gun_setting_icon = new /obj/screen/gun/mode(null) - R.item_use_icon = new /obj/screen/gun/item(null) - R.gun_move_icon = new /obj/screen/gun/move(null) - R.radio_use_icon = new /obj/screen/gun/radio(null) - - hud_elements = list(R.throw_icon, R.zone_sel, R.oxygen, R.fire, R.up_hint, R.hands, R.healths, R.cells, robot_inventory, R.gun_setting_icon) - ..() + return ..() /datum/hud/proc/toggle_show_robot_modules() if(!isrobot(mymob)) return - var/mob/living/silicon/robot/r = mymob - r.shown_robot_modules = !r.shown_robot_modules update_robot_modules_display() - /datum/hud/proc/update_robot_modules_display() if(!isrobot(mymob) || !mymob.client) return @@ -183,8 +159,6 @@ var/global/obj/screen/robot_inventory if(R.shown_robot_modules) if(R.active_storage) R.active_storage.close(R) //Closes the inventory ui. - //Modules display is shown - //R.client.screen += robot_inventory //"store" icon if(!R.module) to_chat(usr, "No module selected") @@ -231,7 +205,6 @@ var/global/obj/screen/robot_inventory else //Modules display is hidden - //R.client.screen -= robot_inventory //"store" icon for(var/atom/A in R.module.equipment) if( (A != R.module_state_1) && (A != R.module_state_2) && (A != R.module_state_3) ) //Module is not currently active diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 4662c1fdc8d..a5f2f6dea72 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -8,7 +8,7 @@ */ /obj/screen name = "" - icon = 'icons/mob/screen1.dmi' + icon = 'icons/mob/screen/midnight.dmi' plane = HUD_PLANE layer = HUD_BASE_LAYER appearance_flags = NO_CLIENT_COLOR @@ -138,10 +138,7 @@ return TRUE /obj/screen/default_attack_selector/Destroy() - if(owner) - if(owner.attack_selector == src) - owner.attack_selector = null - owner = null + owner = null . = ..() /obj/screen/default_attack_selector/proc/set_owner(var/mob/living/carbon/human/_owner) @@ -203,6 +200,10 @@ screen_loc = ui_zonesel var/selecting = BP_CHEST +/obj/screen/zone_selector/Initialize(mapload) + . = ..() + update_icon() + /obj/screen/zone_selector/Click(location, control,params) var/list/PL = params2list(params) var/icon_x = text2num(PL["icon-x"]) @@ -278,42 +279,20 @@ /obj/screen/zone_selector/on_update_icon() set_overlays(image('icons/mob/zone_sel.dmi', "[selecting]")) - -/obj/screen/intent - name = "intent" - icon = 'icons/mob/screen/white.dmi' - icon_state = "intent_help" - screen_loc = ui_acti - var/intent = I_HELP - -/obj/screen/intent/Click(var/location, var/control, var/params) - var/list/P = params2list(params) - var/icon_x = text2num(P["icon-x"]) - var/icon_y = text2num(P["icon-y"]) - intent = I_DISARM - if(icon_x <= world.icon_size/2) - if(icon_y <= world.icon_size/2) - intent = I_HURT - else - intent = I_HELP - else if(icon_y <= world.icon_size/2) - intent = I_GRAB - update_icon() - usr.a_intent = intent - -/obj/screen/intent/on_update_icon() - icon_state = "intent_[intent]" + compile_overlays() /obj/screen/Click(location, control, params) - if(!usr) return 1 + if(!usr?.client) + return 1 switch(name) if("toggle") if(usr.hud_used.inventory_shown) - usr.client.screen -= usr.hud_used.other + usr.client.screen -= usr.hud_used.hidable_hud_elements usr.hud_used.hide_inventory() else - usr.client.screen += usr.hud_used.other + if(length(usr.hud_used.hidable_hud_elements)) + usr.client.screen |= usr.hud_used.hidable_hud_elements usr.hud_used.show_inventory() if("equip") @@ -339,9 +318,6 @@ var/mob/living/M = usr M.ui_toggle_internals() - if("act_intent") - usr.a_intent_change("right") - if("throw") if(!usr.stat && isturf(usr.loc) && !usr.restrained()) usr.toggle_throw_mode() diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index ccd515bcfe8..45f66bcab2b 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -89,8 +89,9 @@ visible_message(SPAN_NOTICE("\The [user] detaches \the [contained] and it rapidly retracts back into \the [src]!")) else visible_message(SPAN_NOTICE("\The [contained] rapidly retracts back into \the [src]!")) - if(breather.internals) - breather.internals.icon_state = "internal0" + var/obj/screen/internals = breather?.get_hud_element(/decl/hud_element/internals) + if(internals) + internals.icon_state = "internal0" breather = null update_use_power(POWER_USE_IDLE) diff --git a/code/game/objects/effects/bump_teleporter.dm b/code/game/objects/effects/bump_teleporter.dm index 715a720efe3..1da47e8147e 100644 --- a/code/game/objects/effects/bump_teleporter.dm +++ b/code/game/objects/effects/bump_teleporter.dm @@ -2,7 +2,7 @@ var/global/list/BUMP_TELEPORTERS = list() /obj/effect/bump_teleporter name = "bump-teleporter" - icon = 'icons/mob/screen1.dmi' + icon = 'icons/mob/screen/crosses.dmi' icon_state = "x2" var/id = null //id of this bump_teleporter. var/id_target = null //id of bump_teleporter which this moves you to. diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm index 0af5221fd2d..e56b075206b 100644 --- a/code/game/objects/effects/decals/misc.dm +++ b/code/game/objects/effects/decals/misc.dm @@ -1,7 +1,7 @@ /obj/effect/decal/point name = "arrow" desc = "It's an arrow hanging in mid-air. There may be a wizard about." - icon = 'icons/mob/screen1.dmi' + icon = 'icons/mob/screen/arrow.dmi' icon_state = "arrow" layer = POINTER_LAYER anchored = TRUE diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 542dd7c36d4..c8b639bc815 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -18,7 +18,7 @@ /obj/abstract/landmark/start name = "start" - icon = 'icons/mob/screen1.dmi' + icon = 'icons/mob/screen/crosses.dmi' icon_state = "x" anchored = TRUE invisibility = INVISIBILITY_ABSTRACT diff --git a/code/game/objects/effects/manifest.dm b/code/game/objects/effects/manifest.dm index 4215dd086c5..dd5c7fc999f 100644 --- a/code/game/objects/effects/manifest.dm +++ b/code/game/objects/effects/manifest.dm @@ -1,6 +1,6 @@ /obj/effect/manifest name = "manifest" - icon = 'icons/mob/screen1.dmi' + icon = 'icons/mob/screen/crosses.dmi' icon_state = "x" /obj/effect/manifest/Initialize() diff --git a/code/game/objects/effects/spawners/bombspawner.dm b/code/game/objects/effects/spawners/bombspawner.dm index e3e71c4accf..84f31a33862 100644 --- a/code/game/objects/effects/spawners/bombspawner.dm +++ b/code/game/objects/effects/spawners/bombspawner.dm @@ -20,7 +20,7 @@ /obj/effect/spawner/newbomb name = "TTV bomb" - icon = 'icons/mob/screen1.dmi' + icon = 'icons/mob/screen/crosses.dmi' icon_state = "x" var/filler_type = /decl/material/gas/carbon_dioxide @@ -102,7 +102,7 @@ /obj/effect/spawner/onetankbomb name = "Single-tank bomb" - icon = 'icons/mob/screen1.dmi' + icon = 'icons/mob/screen/crosses.dmi' icon_state = "x" /obj/effect/spawner/onetankbomb/Initialize() diff --git a/code/game/objects/item.dm b/code/game/objects/item.dm index 53c1208e531..49e09bf947d 100644 --- a/code/game/objects/item.dm +++ b/code/game/objects/item.dm @@ -647,7 +647,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. return if(user.hud_used.hud_shown) - user.toggle_zoom_hud() // If the user has already limited their HUD this avoids them having a HUD when they zoom in + user.minimize_hud(zoom = TRUE) // If the user has already limited their HUD this avoids them having a HUD when they zoom in user.client.view = viewsize zoom = 1 @@ -695,7 +695,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. user.client.view = world.view if(!user.hud_used.hud_shown) - user.toggle_zoom_hud() + user.minimize_hud(zoom = TRUE) user.client.pixel_x = 0 user.client.pixel_y = 0 user.client.OnResize() diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index ee950f3b5c7..14483d7ac6c 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -17,7 +17,7 @@ icon = 'icons/obj/decals.dmi' icon_state = "securearea" var/sight_mode = null - var/hud_type + var/borg_hud_type /obj/item/borg/sight/xray @@ -51,7 +51,7 @@ name = "medical hud" icon_state = ICON_STATE_WORLD icon = 'icons/clothing/eyes/hud_medical.dmi' - hud_type = HUD_MEDICAL + borg_hud_type = HUD_MEDICAL /obj/item/borg/sight/hud/med/Initialize() . = ..() @@ -61,7 +61,7 @@ name = "security hud" icon_state = ICON_STATE_WORLD icon = 'icons/clothing/eyes/hud_security.dmi' - hud_type = HUD_SECURITY + borg_hud_type = HUD_SECURITY /obj/item/borg/sight/hud/Initialize() . = ..() @@ -72,7 +72,7 @@ name = "janitor hud" icon_state = ICON_STATE_WORLD icon = 'icons/clothing/eyes/hud_janitor.dmi' - hud_type = HUD_JANITOR + borg_hud_type = HUD_JANITOR /obj/item/borg/sight/hud/jani/Initialize() . = ..() diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 131131db971..035d0b22238 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -194,18 +194,18 @@ origin_tech = "{'materials':2,'engineering':3,'programming':3,'magnets':3}" /obj/item/borg/upgrade/jetpack/action(var/mob/living/silicon/robot/R) - if(..()) return 0 + if(..()) + return FALSE if(!R.module || !(type in R.module.supported_upgrades)) to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") to_chat(usr, "There's no mounting point for the module!") - return 0 - else - R.module.equipment += new/obj/item/tank/jetpack/carbondioxide - for(var/obj/item/tank/jetpack/carbondioxide in R.module.equipment) - R.internals = src - //R.icon_state="Miner+j" - return 1 + return FALSE + + var/jetpack = new /obj/item/tank/jetpack/carbondioxide(R.module) + R.module.equipment += jetpack + R.set_internals(jetpack) + return TRUE /obj/item/borg/upgrade/rcd name = "engineering robot RCD" diff --git a/code/modules/admin/admin_attack_log.dm b/code/modules/admin/admin_attack_log.dm index 6367b996d3c..a55de2390de 100644 --- a/code/modules/admin/admin_attack_log.dm +++ b/code/modules/admin/admin_attack_log.dm @@ -51,8 +51,7 @@ var/target_zone = "(ZONE_SEL: N/A)" if(attacker) intent = "(INTENT: [uppertext(attacker.a_intent)])" - if (attacker.get_target_zone()) - target_zone = "(ZONE_SEL: [uppertext(attacker.get_target_zone())])" + target_zone = "(ZONE_SEL: [uppertext(attacker.get_target_zone())])" if(victim) attacker.attack_logs_ += text("\[[time_stamp()]\] [key_name(victim)] - [attacker_message] [intent] [target_zone]") else diff --git a/code/modules/awaymissions/loot.dm b/code/modules/awaymissions/loot.dm index d2ebad954c9..bc91c3c46ac 100644 --- a/code/modules/awaymissions/loot.dm +++ b/code/modules/awaymissions/loot.dm @@ -1,5 +1,5 @@ /obj/effect/spawner/lootdrop - icon = 'icons/mob/screen1.dmi' + icon = 'icons/mob/screen/crosses.dmi' icon_state = "x2" var/lootcount = 1 //how many items will be spawned var/lootdoubles = 0 //if the same item can be spawned twice diff --git a/code/modules/blob/blob.dm b/code/modules/blob/blob.dm index 6ad15e5dbd2..f5c8ded119e 100644 --- a/code/modules/blob/blob.dm +++ b/code/modules/blob/blob.dm @@ -36,6 +36,9 @@ STOP_PROCESSING(SSblob, src) . = ..() +/obj/effect/blob/proc/get_max_health() + return blob_max_health + /obj/effect/blob/CanPass(var/atom/movable/mover, var/turf/target, var/height = 0, var/air_group = 0) if(air_group || height == 0) return 1 @@ -210,7 +213,7 @@ var/times_to_pulse = 0 /obj/effect/blob/core/proc/get_health_percent() - return ((health / blob_max_health) * 100) + return ((health / get_max_health()) * 100) /* the master core becomes more vulnereable to damage as it weakens, @@ -294,7 +297,7 @@ regen() will cover update_icon() for this proc return /obj/effect/blob/core/secondary/on_update_icon() - icon_state = (health / blob_max_health >= 0.5) ? "blob_node" : "blob_factory" + icon_state = (health / get_max_health() >= 0.5) ? "blob_node" : "blob_factory" /obj/effect/blob/shield name = "shielding mass" @@ -318,9 +321,10 @@ regen() will cover update_icon() for this proc return ..() /obj/effect/blob/shield/on_update_icon() - if(health > blob_max_health * 2 / 3) + var/max_health = get_max_health() + if(health > max_health * 2 / 3) icon_state = "blob_idle" - else if(health > blob_max_health / 3) + else if(health > max_health / 3) icon_state = "blob" else icon_state = "blob_damaged" diff --git a/code/modules/client/ui_style.dm b/code/modules/client/ui_style.dm index f20646370b6..6b0c4c5f47e 100644 --- a/code/modules/client/ui_style.dm +++ b/code/modules/client/ui_style.dm @@ -29,6 +29,9 @@ var/global/all_tooltip_styles = list( set desc = "Configure your user interface" set category = "OOC" + if(!mob.hud_used) + return + if(!ishuman(mob)) to_chat(src, SPAN_WARNING("You must be human to use this verb.")) return @@ -47,18 +50,15 @@ var/global/all_tooltip_styles = list( UI_style_alpha_new = clamp(UI_style_alpha_new, 50, 255) - var/list/icons = mob.hud_used.adding + mob.hud_used.other + mob.hud_used.hotkeybuttons - - icons.Add( - mob.zone_sel, - mob.gun_setting_icon, - mob.item_use_icon, - mob.gun_move_icon, - mob.radio_use_icon - ) + var/list/icons = list() + if(length(mob.hud_used.misc_hud_elements)) + icons |= mob.hud_used.misc_hud_elements + if(length(mob.hud_used.hidable_hud_elements)) + icons |= mob.hud_used.hidable_hud_elements + if(length(mob.hud_used.hotkey_hud_elements)) + icons |= mob.hud_used.hotkey_hud_elements var/icon/UI_style_icon_new = all_ui_styles[UI_style_new] - apply_ui_style(icons, UI_style_icon_new, UI_style_color_new, UI_style_alpha_new) if(alert("Like it? Save changes?",,"Yes", "No") == "Yes") diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index f18c7d9eeb1..c994979f26f 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -17,7 +17,7 @@ var/active = TRUE var/electric = FALSE //if the glasses should be disrupted by EMP - var/hud_type + var/glasses_hud_type var/obj/screen/overlay var/obj/item/clothing/glasses/hud/hud // Hud glasses, if any var/activation_sound = 'sound/items/goggles_charge.ogg' diff --git a/code/modules/clothing/glasses/eyepatch.dm b/code/modules/clothing/glasses/eyepatch.dm index e660806e603..52c63948ada 100644 --- a/code/modules/clothing/glasses/eyepatch.dm +++ b/code/modules/clothing/glasses/eyepatch.dm @@ -90,7 +90,7 @@ /obj/item/clothing/glasses/eyepatch/hud/science name = "SCIpatch" desc = "A Science-type heads-up display that connects directly to the ocular nerve of the user, replacing the need for that useless eyeball." - hud_type = HUD_SCIENCE + glasses_hud_type = HUD_SCIENCE eye_color = COLOR_PINK /obj/item/clothing/glasses/eyepatch/hud/meson/Initialize() diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 2766c94ee05..35b023ef2b1 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -24,7 +24,7 @@ name = "science goggles" desc = "Goggles fitted with a portable analyzer capable of determining the fabricator training potential of an item or components of a machine. Sensitive to EMP." icon = 'icons/clothing/eyes/goggles_science.dmi' - hud_type = HUD_SCIENCE + glasses_hud_type = HUD_SCIENCE toggleable = TRUE electric = TRUE anomaly_shielding = 0.1 diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 4a4b6dc75a4..cc5acc5c08e 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -33,7 +33,7 @@ name = "health scanner HUD" desc = "A heads-up display that scans the humans in view and provides accurate data about their health status." icon = 'icons/clothing/eyes/hud_medical.dmi' - hud_type = HUD_MEDICAL + glasses_hud_type = HUD_MEDICAL body_parts_covered = 0 /obj/item/clothing/glasses/hud/health/process_hud(var/mob/M) @@ -55,7 +55,7 @@ name = "security HUD" desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status and security records." icon = 'icons/clothing/eyes/hud_security.dmi' - hud_type = HUD_SECURITY + glasses_hud_type = HUD_SECURITY body_parts_covered = 0 /obj/item/clothing/glasses/hud/security/prescription @@ -82,7 +82,7 @@ desc = "A heads-up display that scans for messes and alerts the user. Good for finding puddles hiding under catwalks." icon = 'icons/clothing/eyes/hud_janitor.dmi' body_parts_covered = 0 - hud_type = HUD_JANITOR + glasses_hud_type = HUD_JANITOR /obj/item/clothing/glasses/hud/janitor/prescription name = "prescription janiHUD" diff --git a/code/modules/materials/definitions/gasses/material_gas_mundane.dm b/code/modules/materials/definitions/gasses/material_gas_mundane.dm index a4bc989ec7c..4d55d71770c 100644 --- a/code/modules/materials/definitions/gasses/material_gas_mundane.dm +++ b/code/modules/materials/definitions/gasses/material_gas_mundane.dm @@ -68,20 +68,12 @@ warning_message = pick("extremely dizzy","short of breath","faint","confused") warning_prob = 15 M.adjustOxyLoss(10,20) - if(istype(H)) - H.co2_alert = 1 else if(dosage >= 1.5) warning_message = pick("dizzy","short of breath","faint","momentarily confused") M.adjustOxyLoss(3,5) - if(istype(H)) - H.co2_alert = 1 else if(dosage >= 0.25) warning_message = pick("a little dizzy","short of breath") warning_prob = 10 - if(istype(H)) - H.co2_alert = 0 - else if(istype(H)) - H.co2_alert = 0 if(istype(H) && dosage > 1 && H.ticks_since_last_successful_breath < 15) H.ticks_since_last_successful_breath++ if(warning_message && prob(warning_prob)) diff --git a/code/modules/mechs/interface/_interface.dm b/code/modules/mechs/interface/_interface.dm index d2ac63b4439..45945a7b49a 100644 --- a/code/modules/mechs/interface/_interface.dm +++ b/code/modules/mechs/interface/_interface.dm @@ -23,7 +23,7 @@ client.screen |= hud_elements /mob/living/exosuit/InitializeHud() - zone_sel = new + if(!LAZYLEN(hud_elements)) var/i = 1 for(var/hardpoint in hardpoints) diff --git a/code/modules/mechs/mech.dm b/code/modules/mechs/mech.dm index b37409881c8..72b1d5f5d50 100644 --- a/code/modules/mechs/mech.dm +++ b/code/modules/mechs/mech.dm @@ -21,6 +21,7 @@ bone_material = null bone_amount = 0 + var/zone_tracker var/emp_damage = 0 var/obj/item/radio/exosuit/radio @@ -67,6 +68,7 @@ // Interface stuff. var/list/hud_elements = list() var/list/hardpoint_hud_elements = list() + // TODO: /datum/hud/exosuit var/obj/screen/exosuit/health/hud_health var/obj/screen/exosuit/toggle/hatch_open/hud_open var/obj/screen/exosuit/power/hud_power diff --git a/code/modules/mechs/mech_interaction.dm b/code/modules/mechs/mech_interaction.dm index 85e19c45302..9361de6fcaa 100644 --- a/code/modules/mechs/mech_interaction.dm +++ b/code/modules/mechs/mech_interaction.dm @@ -89,6 +89,15 @@ /mob/living/exosuit/get_dexterity(var/silent = FALSE) return DEXTERITY_FULL +// Override as mechs will usually not have clients and therefore not have HUDs. +/mob/living/exosuit/get_target_zone() + if(!istype(hud_used)) + return + var/obj/screen/zone_selector/zone_selector = get_hud_element(/decl/hud_element/zone_selector) + if(istype(zone_selector)) + return zone_selector.selecting + return zone_tracker + /mob/living/exosuit/ClickOn(var/atom/A, var/params, var/mob/user) if(!user || incapacitated() || user.incapacitated()) @@ -134,10 +143,13 @@ // User is not necessarily the exosuit, or the same person, so update intent. if(user != src) a_intent = user.a_intent - if(user.zone_sel) - zone_sel.set_selected_zone(user.get_target_zone()) + var/obj/screen/zone_selector/zone_selector = get_hud_element(/decl/hud_element/zone_selector) + var/set_zone = user.get_target_zone() || BP_CHEST + if(istype(zone_selector)) + zone_selector.set_selected_zone(set_zone) else - zone_sel.set_selected_zone(BP_CHEST) + zone_tracker = set_zone + // You may attack the target with your exosuit FIST if you're malfunctioning. var/atom/movable/AM = A var/fail_prob = (user != src && istype(AM) && AM.loc != src) ? (user.skill_check(SKILL_MECH, HAS_PERK) ? 0: 15 ) : 0 diff --git a/code/modules/mechs/mech_movement.dm b/code/modules/mechs/mech_movement.dm index 6f926046cfa..b7847041cbc 100644 --- a/code/modules/mechs/mech_movement.dm +++ b/code/modules/mechs/mech_movement.dm @@ -14,10 +14,10 @@ var/turf/B = GetAbove(src) - for(var/thing in pilots) - var/mob/pilot = thing - if(pilot.up_hint) - pilot.up_hint.icon_state = "uphint[!!(B && TURF_IS_MIMICKING(B))]" + for(var/mob/pilot in pilots) + var/obj/screen/up_hint = pilot.get_hud_element(/decl/hud_element/up_hint) + if(up_hint) + up_hint.icon_state = "uphint[!!(B && TURF_IS_MIMICKING(B))]" /mob/living/exosuit/can_ztravel() if(Process_Spacemove(1)) //Handle here diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index e3d6ca61dcb..c6fd39d4bbc 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -74,14 +74,8 @@ SSstatistics.report_death(src) - //TODO: Change death state to health_dead for all these icon files. This is a stop gap. - if(healths) - healths.overlays.Cut() // This is specific to humans but the relevant code is here; shouldn't mess with other mobs. - if("health7" in icon_states(healths.icon)) - healths.icon_state = "health7" - else - healths.icon_state = "health6" - log_debug("[src] ([src.type]) died but does not have a valid health7 icon_state (using health6 instead). report this error to Ccomp5950 or your nearest Developer") + if(hud_used) + hud_used.update_icons() timeofdeath = world.time if(mind) diff --git a/code/modules/mob/examine.dm b/code/modules/mob/examine.dm index 1026da99b4d..2b8f7db8b9f 100644 --- a/code/modules/mob/examine.dm +++ b/code/modules/mob/examine.dm @@ -62,8 +62,9 @@ /mob/living/examine(mob/user, distance, infix, suffix) . = ..() // Update our target dolly. - if(user.zone_sel) + var/obj/screen/zone_selector = user.get_hud_element(/decl/hud_element/zone_selector) + if(zone_selector) if(should_have_limb(BP_TAIL)) - user.zone_sel.icon_state = "zone_sel_tail" + zone_selector.icon_state = "zone_sel_tail" else - user.zone_sel.icon_state = "zone_sel" + zone_selector.icon_state = "zone_sel" diff --git a/code/modules/mob/grab/grab_object.dm b/code/modules/mob/grab/grab_object.dm index 4f8977cca2b..b8ff4e72e92 100644 --- a/code/modules/mob/grab/grab_object.dm +++ b/code/modules/mob/grab/grab_object.dm @@ -54,8 +54,9 @@ update_icon() events_repository.register(/decl/observ/moved, affecting, src, .proc/on_affecting_move) - if(assailant.zone_sel) - events_repository.register(/decl/observ/zone_selected, assailant.zone_sel, src, .proc/on_target_change) + var/obj/screen/zone_selector = assailant.get_hud_element(/decl/hud_element/zone_selector) + if(zone_selector) + events_repository.register(/decl/observ/zone_selected, zone_selector, src, .proc/on_target_change) var/obj/item/organ/O = get_targeted_organ() var/decl/pronouns/G = assailant.get_pronouns() @@ -129,8 +130,9 @@ affecting.reset_plane_and_layer() affecting = null if(assailant) - if(assailant.zone_sel) - events_repository.unregister(/decl/observ/zone_selected, assailant.zone_sel, src) + var/obj/screen/zone_selector = assailant.get_hud_element(/decl/hud_element/zone_selector) + if(zone_selector) + events_repository.unregister(/decl/observ/zone_selected, zone_selector, src) assailant = null . = ..() if(old_affecting) diff --git a/code/modules/mob/grab/normal/grab_normal.dm b/code/modules/mob/grab/normal/grab_normal.dm index 0bcdc241be9..03ac58d1bbe 100644 --- a/code/modules/mob/grab/normal/grab_normal.dm +++ b/code/modules/mob/grab/normal/grab_normal.dm @@ -1,6 +1,6 @@ /decl/grab/normal name = "grab" - icon = 'icons/mob/screen1.dmi' + icon = 'icons/mob/screen/grabs.dmi' help_action = "inspect" disarm_action = "pin" grab_action = "jointlock" diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 3f936bb5468..8761be38674 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -54,6 +54,7 @@ access_scanner = new /obj(src) access_scanner.req_access = req_access?.Copy() + if(on) turn_on() // Update lights and other stuff else diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 04a3e322368..8224dafcaed 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -46,54 +46,14 @@ update_icon() return TRUE -/mob/living/carbon/alien/handle_regular_hud_updates() - . = ..() - if(!.) - return - update_sight() - if (healths) - if(stat != DEAD) - switch(current_health) - if(100 to INFINITY) - healths.icon_state = "health0" - if(80 to 100) - healths.icon_state = "health1" - if(60 to 80) - healths.icon_state = "health2" - if(40 to 60) - healths.icon_state = "health3" - if(20 to 40) - healths.icon_state = "health4" - if(0 to 20) - healths.icon_state = "health5" - else - healths.icon_state = "health6" - else - healths.icon_state = "health7" - - if(stat != DEAD) - if(is_blind()) - overlay_fullscreen("blind", /obj/screen/fullscreen/blind) - else - clear_fullscreen("blind") - set_fullscreen(disabilities & NEARSIGHTED, "impaired", /obj/screen/fullscreen/impaired, 1) - set_fullscreen(GET_STATUS(src, STAT_BLURRY), "blurry", /obj/screen/fullscreen/blurry) - set_fullscreen(GET_STATUS(src, STAT_DRUGGY), "high", /obj/screen/fullscreen/high) - if(machine) - if(machine.check_eye(src) < 0) - reset_view(null) - /mob/living/carbon/alien/handle_environment(var/datum/gas_mixture/environment) ..() // Both alien subtypes survive in vaccum and suffer in high temperatures, // so I'll just define this once, for both (see radiation comment above) if(environment && environment.temperature > (T0C+66)) adjustFireLoss((environment.temperature - (T0C+66))/5) // Might be too high, check in testing. - if (fire) fire.icon_state = "fire2" if(prob(20)) to_chat(src, "You feel a searing heat!") - else - if (fire) fire.icon_state = "fire0" /mob/living/carbon/alien/handle_fire() if(..()) diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index c38a51ff930..e69d66c6b22 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -75,91 +75,5 @@ if(!. || stat == DEAD || !emp_damage || !container) return - //Handling EMP effect in the Life(), it's made VERY simply, and has some additional effects handled elsewhere - //This is pretty much a damage type only used by MMIs, dished out by the emp_act - emp_damage = round(emp_damage,1)//Let's have some nice numbers to work with - switch(emp_damage) - if(31 to INFINITY) - emp_damage = 30//Let's not overdo it - if(21 to 30)//High level of EMP damage, unable to see, hear, or speak - SET_STATUS_MAX(src, STAT_BLIND, 2) - SET_STATUS_MAX(src, STAT_DEAF, 1) - set_status(STAT_SILENCE, 1) - if(!alert)//Sounds an alarm, but only once per 'level' - emote("alarm") - to_chat(src, SPAN_WARNING("Major electrical distruption detected: System rebooting.")) - alert = 1 - if(prob(75)) - emp_damage -= 1 - if(20) - alert = 0 - set_status(STAT_BLIND, 0) - set_status(STAT_DEAF, 0) - set_status(STAT_SILENCE, 0) - emp_damage -= 1 - if(11 to 19)//Moderate level of EMP damage, resulting in nearsightedness and ear damage - set_status(STAT_BLURRY, 1) - set_status(STAT_TINNITUS, 1) - if(!alert) - emote("alert") - to_chat(src, SPAN_WARNING("Primary systems are now online.")) - alert = 1 - if(prob(50)) - emp_damage -= 1 - if(10) - alert = 0 - set_status(STAT_BLURRY, 0) - set_status(STAT_TINNITUS, 0) - emp_damage -= 1 - if(2 to 9)//Low level of EMP damage, has few effects(handled elsewhere) - if(!alert) - emote("notice") - to_chat(src, SPAN_WARNING("System reboot nearly complete.")) - alert = 1 - if(prob(25)) - emp_damage -= 1 - if(1) - alert = 0 - to_chat(src, SPAN_WARNING("All systems restored.")) - emp_damage -= 1 - -/mob/living/carbon/brain/handle_regular_hud_updates() - . = ..() - if(!.) - return - update_sight() - if (healths) - if (stat != DEAD) - switch(current_health) - if(100 to INFINITY) - healths.icon_state = "health0" - if(80 to 100) - healths.icon_state = "health1" - if(60 to 80) - healths.icon_state = "health2" - if(40 to 60) - healths.icon_state = "health3" - if(20 to 40) - healths.icon_state = "health4" - if(0 to 20) - healths.icon_state = "health5" - else - healths.icon_state = "health6" - else - healths.icon_state = "health7" - - if(stat != DEAD) - if(is_blind()) - overlay_fullscreen("blind", /obj/screen/fullscreen/blind) - else - clear_fullscreen("blind") - set_fullscreen(disabilities & NEARSIGHTED, "impaired", /obj/screen/fullscreen/impaired, 1) - set_fullscreen(GET_STATUS(src, STAT_BLURRY), "blurry", /obj/screen/fullscreen/blurry) - set_fullscreen(GET_STATUS(src, STAT_DRUGGY), "high", /obj/screen/fullscreen/high) - if (machine) - if (!( machine.check_eye(src) )) - reset_view(null) - return 1 - /mob/living/carbon/brain/can_change_intent() return TRUE diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index b68d1e52ac0..bdb626d7779 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -243,14 +243,14 @@ var/obj/item/clothing/glasses/G = get_equipped_item(slot_glasses_str) if(!istype(G)) return - if(G.hud_type & hudtype) + if(G.glasses_hud_type & hudtype) return G - if(G.hud && (G.hud.hud_type & hudtype)) + if(G.hud && (G.hud.glasses_hud_type & hudtype)) return G.hud /mob/living/silicon/robot/getHUDsource(hudtype) for(var/obj/item/borg/sight/sight in list(module_state_1, module_state_2, module_state_3)) - if(istype(sight) && (sight.hud_type & hudtype)) + if(istype(sight) && (sight.borg_hud_type & hudtype)) return sight //Gets the computer network M's source of hudtype is using diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 1fc56dbdf90..7da6742bd45 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -38,7 +38,6 @@ global.human_mob_list -= src regenerate_body_icon = FALSE // don't bother regenerating if we happen to be queued to update icon worn_underwear = null - QDEL_NULL(attack_selector) QDEL_NULL(vessel) LAZYCLEARLIST(smell_cooldown) . = ..() @@ -599,6 +598,7 @@ else if(has_extension(src, /datum/extension/scannable)) remove_extension(src, /datum/extension/scannable) + update_health() return TRUE //Syncs cultural tokens to the currently set species, and may trigger a language update diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 50172253223..ce39adf3b83 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -354,4 +354,7 @@ var/summary = default_attack.summarize() if(summary) to_chat(src, SPAN_NOTICE(summary)) - attack_selector?.update_icon() \ No newline at end of file + + var/obj/screen/default_attack_selector/attack_selector = get_hud_element(/decl/hud_element/attack_selector) + if(istype(attack_selector)) + attack_selector.update_icon() diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 7f9ce538e1c..91d11aa891c 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -22,8 +22,6 @@ var/list/cultural_info = list() - var/obj/screen/default_attack_selector/attack_selector - var/icon/stand_icon = null var/voice = "" //Instead of new say code calling GetVoice() over and over and over, we're just going to ask this variable, which gets updated in Life() diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 097ad4fd817..f5baf81a4d5 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -118,9 +118,6 @@ handle_leg_damage() species.handle_post_move(src) - if(client) - var/turf/B = GetAbove(src) - up_hint.icon_state = "uphint[!!(B && TURF_IS_MIMICKING(B))]" /mob/living/carbon/human/proc/handle_leg_damage() if(!can_feel_pain()) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 4371599630c..c1f044061a8 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -29,11 +29,6 @@ #define COLD_GAS_DAMAGE_LEVEL_3 3 //Amount of damage applied when the current breath's temperature passes the 120K point /mob/living/carbon/human - var/oxygen_alert = 0 - var/toxins_alert = 0 - var/co2_alert = 0 - var/fire_alert = 0 - var/pressure_alert = 0 var/stamina = 100 /mob/living/carbon/human/handle_living_non_stasis_processes() @@ -200,7 +195,7 @@ var/loc_temp = environment.temperature if(adjusted_pressure < species.warning_high_pressure && adjusted_pressure > species.warning_low_pressure && abs(loc_temp - bodytemperature) < 20 && bodytemperature < get_temperature_threshold(HEAT_LEVEL_1) && bodytemperature > get_temperature_threshold(COLD_LEVEL_1) && species.body_temperature) - pressure_alert = 0 + SET_HUD_ALERT(src, /decl/hud_element/condition/pressure, 0) return // Temperatures are within normal ranges, fuck all this processing. ~Ccomp //Body temperature adjusts depending on surrounding atmosphere based on your thermal protection (convection) @@ -220,8 +215,8 @@ // +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt. if(bodytemperature >= get_temperature_threshold(HEAT_LEVEL_1)) //Body temperature is too hot. - fire_alert = max(fire_alert, 1) - if(status_flags & GODMODE) return 1 //godmode + if(status_flags & GODMODE) + return 1 //godmode var/burn_dam = 0 if(bodytemperature < get_temperature_threshold(HEAT_LEVEL_2)) burn_dam = HEAT_DAMAGE_LEVEL_1 @@ -230,12 +225,11 @@ else burn_dam = HEAT_DAMAGE_LEVEL_3 take_overall_damage(burn=burn_dam, used_weapon = "High Body Temperature") - fire_alert = max(fire_alert, 2) + SET_HUD_ALERT_MAX(src, /decl/hud_element/condition/fire, 2) else if(bodytemperature <= get_temperature_threshold(COLD_LEVEL_1)) - fire_alert = max(fire_alert, 1) - if(status_flags & GODMODE) return 1 //godmode - + if(status_flags & GODMODE) + return 1 //godmode var/burn_dam = 0 if(bodytemperature > get_temperature_threshold(COLD_LEVEL_2)) @@ -247,7 +241,7 @@ set_stasis(get_cryogenic_factor(bodytemperature), STASIS_COLD) if(!has_chemical_effect(CE_CRYO, 1)) take_overall_damage(burn=burn_dam, used_weapon = "Low Body Temperature") - fire_alert = max(fire_alert, 1) + SET_HUD_ALERT_MAX(src, /decl/hud_element/condition/fire, 1) // Account for massive pressure differences. Done by Polymorph // Made it possible to actually have something that can protect against high pressure... Done by Errorage. Polymorph now has an axe sticking from his head for his previous hardcoded nonsense! @@ -256,13 +250,13 @@ if(adjusted_pressure >= species.hazard_high_pressure) var/pressure_damage = min( ( (adjusted_pressure / species.hazard_high_pressure) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) take_overall_damage(brute=pressure_damage, used_weapon = "High Pressure") - pressure_alert = 2 + SET_HUD_ALERT(src, /decl/hud_element/condition/pressure, 2) else if(adjusted_pressure >= species.warning_high_pressure) - pressure_alert = 1 + SET_HUD_ALERT(src, /decl/hud_element/condition/pressure, 1) else if(adjusted_pressure >= species.warning_low_pressure) - pressure_alert = 0 + SET_HUD_ALERT(src, /decl/hud_element/condition/pressure, 0) else if(adjusted_pressure >= species.hazard_low_pressure) - pressure_alert = -1 + SET_HUD_ALERT(src, /decl/hud_element/condition/pressure, -1) else var/list/obj/item/organ/external/parts = get_damageable_organs() for(var/obj/item/organ/external/O in parts) @@ -272,7 +266,7 @@ O.take_external_damage(brute = LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure") if(getOxyLossPercent() < 55) // 11 OxyLoss per 4 ticks when wearing internals; unconsciousness in 16 ticks, roughly half a minute adjustOxyLoss(4) // 16 OxyLoss per 4 ticks when no internals present; unconsciousness in 13 ticks, roughly twenty seconds - pressure_alert = -2 + SET_HUD_ALERT(src, /decl/hud_element/condition/pressure, -2) return @@ -430,7 +424,6 @@ /mob/living/carbon/human/handle_regular_hud_updates() - fire_alert = 0 //Reset this here, because both breathe() and handle_environment() have a chance to set it. if(life_tick%30==15) hud_updateflag = 1022 if(hud_updateflag) // update our mob's hud overlays, AKA what others see flaoting above our head @@ -471,7 +464,6 @@ overlay_fullscreen("oxy", /obj/screen/fullscreen/oxy, severity) else clear_fullscreen("oxy") - //Fire and Brute damage overlay (BSSR) var/hurtdamage = src.getBruteLoss() + src.getFireLoss() + damageoverlaytemp damageoverlaytemp = 0 // We do this so we can detect if someone hits us or not. @@ -487,128 +479,7 @@ overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) else clear_fullscreen("brute") - - if(healths) - - var/mutable_appearance/healths_ma = new(healths) - healths_ma.icon_state = "blank" - healths_ma.overlays = null - - if(has_chemical_effect(CE_PAINKILLER, 100)) - healths_ma.icon_state = "health_numb" - else - // Generate a by-limb health display. - var/no_damage = 1 - var/trauma_val = 0 // Used in calculating softcrit/hardcrit indicators. - if(can_feel_pain()) - trauma_val = max(shock_stage,get_shock())/(species.total_health-100) - // Collect and apply the images all at once to avoid appearance churn. - var/list/health_images = list() - for(var/obj/item/organ/external/E in get_external_organs()) - if(no_damage && (E.brute_dam || E.burn_dam)) - no_damage = 0 - health_images += E.get_damage_hud_image() - - // Apply a fire overlay if we're burning. - if(on_fire) - health_images += image('icons/mob/screen1_health.dmi',"burning") - - // Show a general pain/crit indicator if needed. - if(is_asystole()) - health_images += image('icons/mob/screen1_health.dmi',"hardcrit") - else if(trauma_val) - if(can_feel_pain()) - if(trauma_val > 0.7) - health_images += image('icons/mob/screen1_health.dmi',"softcrit") - if(trauma_val >= 1) - health_images += image('icons/mob/screen1_health.dmi',"hardcrit") - else if(no_damage) - health_images += image('icons/mob/screen1_health.dmi',"fullhealth") - healths_ma.overlays += health_images - healths.appearance = healths_ma - - if(nutrition_icon) - switch(nutrition) - if(450 to INFINITY) nutrition_icon.icon_state = "nutrition0" - if(350 to 450) nutrition_icon.icon_state = "nutrition1" - if(250 to 350) nutrition_icon.icon_state = "nutrition2" - if(150 to 250) nutrition_icon.icon_state = "nutrition3" - else nutrition_icon.icon_state = "nutrition4" - - if(hydration_icon) - switch(hydration) - if(450 to INFINITY) hydration_icon.icon_state = "hydration0" - if(350 to 450) hydration_icon.icon_state = "hydration1" - if(250 to 350) hydration_icon.icon_state = "hydration2" - if(150 to 250) hydration_icon.icon_state = "hydration3" - else hydration_icon.icon_state = "hydration4" - - if(isSynthetic()) - var/obj/item/organ/internal/cell/C = get_organ(BP_CELL, /obj/item/organ/internal/cell) - if(C) - var/chargeNum = clamp(CEILING(C.percent()/25), 0, 4) //0-100 maps to 0-4, but give it a paranoid clamp just in case. - cells.icon_state = "charge[chargeNum]" - else - cells.icon_state = "charge-empty" - - if(pressure) - pressure.icon_state = "pressure[pressure_alert]" - if(toxin) - toxin.icon_state = "tox[toxins_alert ? "1" : "0"]" - if(oxygen) - oxygen.icon_state = "oxy[oxygen_alert ? "1" : "0"]" - if(fire) - fire.icon_state = "fire[fire_alert ? fire_alert : 0]" - - if(bodytemp) - if (!species) - switch(bodytemperature) //310.055 optimal body temp - if(370 to INFINITY) bodytemp.icon_state = "temp4" - if(350 to 370) bodytemp.icon_state = "temp3" - if(335 to 350) bodytemp.icon_state = "temp2" - if(320 to 335) bodytemp.icon_state = "temp1" - if(300 to 320) bodytemp.icon_state = "temp0" - if(295 to 300) bodytemp.icon_state = "temp-1" - if(280 to 295) bodytemp.icon_state = "temp-2" - if(260 to 280) bodytemp.icon_state = "temp-3" - else bodytemp.icon_state = "temp-4" - else - var/heat_1 = get_temperature_threshold(HEAT_LEVEL_1) - var/cold_1 = get_temperature_threshold(COLD_LEVEL_1) - //TODO: precalculate all of this stuff when the species datum is created - var/base_temperature = species.body_temperature - if(base_temperature == null) //some species don't have a set metabolic temperature - base_temperature = (heat_1 + cold_1)/2 - - var/temp_step - if (bodytemperature >= base_temperature) - temp_step = (heat_1 - base_temperature)/4 - - if (bodytemperature >= heat_1) - bodytemp.icon_state = "temp4" - else if (bodytemperature >= base_temperature + temp_step*3) - bodytemp.icon_state = "temp3" - else if (bodytemperature >= base_temperature + temp_step*2) - bodytemp.icon_state = "temp2" - else if (bodytemperature >= base_temperature + temp_step*1) - bodytemp.icon_state = "temp1" - else - bodytemp.icon_state = "temp0" - - else if (bodytemperature < base_temperature) - temp_step = (base_temperature - cold_1)/4 - - if (bodytemperature <= cold_1) - bodytemp.icon_state = "temp-4" - else if (bodytemperature <= base_temperature - temp_step*3) - bodytemp.icon_state = "temp-3" - else if (bodytemperature <= base_temperature - temp_step*2) - bodytemp.icon_state = "temp-2" - else if (bodytemperature <= base_temperature - temp_step*1) - bodytemp.icon_state = "temp-1" - else - bodytemp.icon_state = "temp0" - return 1 + return TRUE /mob/living/carbon/human/handle_random_events() // Puke if toxloss is too high diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 499ce886ca1..75804962e5f 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -562,6 +562,8 @@ var/global/list/damage_icon_parts = list() hud_used.hidden_inventory_update() hud_used.persistant_inventory_update() update_action_buttons() - if(internals && internal) - internals.icon_state = "internal1" + if(internal) + var/obj/screen/internals = get_hud_element(/decl/hud_element/internals) + if(internals) + internals.icon_state = "internal1" queue_hand_rebuild() diff --git a/code/modules/mob/living/carbon/internals.dm b/code/modules/mob/living/carbon/internals.dm index c21f82f68b0..53912f7fbfe 100644 --- a/code/modules/mob/living/carbon/internals.dm +++ b/code/modules/mob/living/carbon/internals.dm @@ -4,5 +4,6 @@ /mob/living/carbon/set_internals(obj/item/tank/source, source_string) ..() internal = source + var/obj/screen/internals = get_hud_element(/decl/hud_element/internals) if(internals) internals.icon_state = "internal[!!internal]" diff --git a/code/modules/mob/living/carbon/resist.dm b/code/modules/mob/living/carbon/resist.dm index 0e7af051b09..5014bbb010d 100644 --- a/code/modules/mob/living/carbon/resist.dm +++ b/code/modules/mob/living/carbon/resist.dm @@ -33,6 +33,7 @@ return 1 /mob/living/carbon/proc/escape_handcuffs() + //This line represent a significant buff to grabs... // We don't have to check the click cooldown because /mob/living/verb/resist() has done it for us, we can simply set the delay setClickCooldown(100) diff --git a/code/modules/mob/living/deity/deity_phenomena.dm b/code/modules/mob/living/deity/deity_phenomena.dm index b4c93bea647..b339a27cbc8 100644 --- a/code/modules/mob/living/deity/deity_phenomena.dm +++ b/code/modules/mob/living/deity/deity_phenomena.dm @@ -18,7 +18,7 @@ /mob/living/deity/proc/silence(var/amount) if(!silenced) to_chat(src, "You've been silenced! Your phenomenas are disabled!") - var/obj/screen/intent/deity/SD = hud_used?.action_intent + var/obj/screen/intent/deity/SD = get_hud_element(/decl/hud_element/action_intent) if(istype(SD)) SD.color = "#ff0000" silenced += amount @@ -34,11 +34,11 @@ silenced-- if(!silenced) to_chat(src, "You are no longer silenced.") - var/obj/screen/intent/deity/SD = hud_used?.action_intent + var/obj/screen/intent/deity/SD = get_hud_element(/decl/hud_element/action_intent) if(istype(SD)) SD.color = null - if(power_per_regen < 0 || power < power_min) - adjust_power(power_per_regen) + if(power_per_regen < 0 || power < power_min) + adjust_power(power_per_regen) /mob/living/deity/Destroy() for(var/phenom in phenomenas) @@ -69,7 +69,7 @@ for(var/mod in intent_list) if(intent_list[mod] == P) intent_list[mod] = null - var/obj/screen/intent/deity/SD = hud_used?.action_intent + var/obj/screen/intent/deity/SD = get_hud_element(/decl/hud_element/action_intent) if(istype(SD)) SD.update_text() update_phenomenas() diff --git a/code/modules/mob/living/deity/menu/deity_nano.dm b/code/modules/mob/living/deity/menu/deity_nano.dm index 046276fcffe..c4d617d7e01 100644 --- a/code/modules/mob/living/deity/menu/deity_nano.dm +++ b/code/modules/mob/living/deity/menu/deity_nano.dm @@ -76,6 +76,6 @@ phenomena_bindings[++phenomena_bindings.len] = list("intent" = intent, "intent_data" = intent_data) nano_data["bindings"] = phenomena_bindings //Update the hud as well. - var/obj/screen/intent/deity/SD = hud_used?.action_intent + var/obj/screen/intent/deity/SD = get_hud_element(/decl/hud_element/action_intent) if(istype(SD)) SD.update_text() \ No newline at end of file diff --git a/code/modules/mob/living/deity/phenomena/communication.dm b/code/modules/mob/living/deity/phenomena/communication.dm index 72876f3f9e9..e06bea85bc0 100644 --- a/code/modules/mob/living/deity/phenomena/communication.dm +++ b/code/modules/mob/living/deity/phenomena/communication.dm @@ -26,7 +26,7 @@ /datum/phenomena/point/activate(var/atom/a) ..() if(!arrow) - arrow = image('icons/mob/screen1.dmi', icon_state = "arrow", layer = POINTER_LAYER) + arrow = image('icons/mob/screen/arrow.dmi', icon_state = "arrow", layer = POINTER_LAYER) var/turf/T = get_turf(a) arrow.loc = T var/list/view = view(7,T) diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm index 2a8cac458bc..d71b59c3232 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -57,14 +57,15 @@ var/last_slot = get_active_held_item_slot() if(slot != last_slot && (slot in get_held_item_slots())) _held_item_slot_selected = slot - for(var/obj/screen/inventory/hand in hud_used?.hand_hud_objects) - hand.cut_overlay("hand_selected") - if(hand.slot_id == slot) - hand.add_overlay("hand_selected") - hand.compile_overlays() - var/obj/item/I = get_active_hand() - if(istype(I)) - I.on_active_hand() + if(istype(hud_used)) + for(var/obj/screen/inventory/hand in hud_used.hand_hud_objects) + hand.cut_overlay("hand_selected") + if(hand.slot_id == slot) + hand.add_overlay("hand_selected") + hand.compile_overlays() + var/obj/item/I = get_active_hand() + if(istype(I)) + I.on_active_hand() // Defer proc for the sake of delimbing root limbs with multiple graspers (serpentid) /mob/living/proc/queue_hand_rebuild() diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index af99d264ffe..054e78d4dd6 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -2,7 +2,9 @@ set invisibility = FALSE set background = BACKGROUND_ENABLED - ..() + . = ..() + if(. == PROCESS_KILL) + return if (HasMovementHandler(/datum/movement_handler/mob/transformation)) return @@ -324,11 +326,23 @@ //this handles hud updates. Calls update_vision() and handle_hud_icons() /mob/living/proc/handle_regular_hud_updates() SHOULD_CALL_PARENT(TRUE) + if(machine && machine.check_eye(src) < 0) + reset_view(null) if(!should_do_hud_updates()) return FALSE handle_hud_icons() handle_vision() handle_low_light_vision() + if(hud_used) + hud_used.update_icons() + if(stat != DEAD) + if(is_blind()) + overlay_fullscreen("blind", /obj/screen/fullscreen/blind) + else + clear_fullscreen("blind") + set_fullscreen(disabilities & NEARSIGHTED, "impaired", /obj/screen/fullscreen/impaired, 1) + set_fullscreen(GET_STATUS(src, STAT_BLURRY), "blurry", /obj/screen/fullscreen/blurry) + set_fullscreen(GET_STATUS(src, STAT_DRUGGY), "high", /obj/screen/fullscreen/high) return TRUE /mob/living/proc/handle_low_light_vision() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 21da555e7fd..e8fc51c240a 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -195,6 +195,11 @@ default behaviour is: if(update_icons) queue_icon_update() +/mob/living/proc/update_health_hud() + if(!client || !hud_used) + return + hud_used.update_health_hud() + /mob/living/proc/should_be_dead() return current_health <= 0 @@ -391,7 +396,8 @@ default behaviour is: // damage MANY external organs, in random order /mob/living/proc/take_overall_damage(var/brute, var/burn, var/used_weapon = null) - if(status_flags & GODMODE) return 0 //godmode + if(status_flags & GODMODE) + return 0 adjustBruteLoss(brute) adjustFireLoss(burn, do_update_health = TRUE) @@ -1146,11 +1152,16 @@ default behaviour is: /mob/living/get_speech_bubble_state_modifier() return isSynthetic() ? "synth" : ..() -/mob/living/proc/is_on_special_ability_cooldown() +/mob/proc/is_on_special_ability_cooldown() + return FALSE + +/mob/living/is_on_special_ability_cooldown() return world.time < next_special_ability /mob/living/proc/set_special_ability_cooldown(var/amt) next_special_ability = max(next_special_ability, world.time+amt) + if(hud_used) + hud_used.set_hud_cooldown((world.time - next_special_ability)-1) // -1 so it visually resets one tick after cooldown. /mob/living/proc/get_seconds_until_next_special_ability_string() return ticks2readable(next_special_ability - world.time) diff --git a/code/modules/mob/living/living_bodytemp.dm b/code/modules/mob/living/living_bodytemp.dm index 58a184891ab..6c052810303 100644 --- a/code/modules/mob/living/living_bodytemp.dm +++ b/code/modules/mob/living/living_bodytemp.dm @@ -7,9 +7,9 @@ return TRUE /mob/living/proc/get_bodytemperature_difference() - var/decl/species/my_species = get_species() - if(my_species) - return (my_species.body_temperature - bodytemperature) + var/ideal_bodytemp = get_ideal_bodytemp() + if(!isnull(ideal_bodytemp)) + return (ideal_bodytemp - bodytemperature) return 0 /mob/living/proc/stabilize_body_temperature() diff --git a/code/modules/mob/living/living_breath.dm b/code/modules/mob/living/living_breath.dm index 06a3150811d..904800aefc7 100644 --- a/code/modules/mob/living/living_breath.dm +++ b/code/modules/mob/living/living_breath.dm @@ -106,6 +106,7 @@ else check_for_airtight_internals() var/obj/item/tank/new_internals = get_internals() + var/obj/screen/internals = get_hud_element(/decl/hud_element/internals) if(internals && old_internals != new_internals) internals.icon_state = "internal[!!new_internals]" if(istype(new_internals)) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index d2a97866b4a..77f6d443339 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -218,7 +218,6 @@ // End BS12 momentum-transfer code. /mob/living/attack_generic(var/mob/user, var/damage, var/attack_message) - if(!damage || !istype(user)) return diff --git a/code/modules/mob/living/living_grabs.dm b/code/modules/mob/living/living_grabs.dm index e8eda8cec1d..fc85822943c 100644 --- a/code/modules/mob/living/living_grabs.dm +++ b/code/modules/mob/living/living_grabs.dm @@ -41,7 +41,8 @@ face_atom(target) var/obj/item/grab/grab - if(ispath(grab_tag, /decl/grab) && can_grab(target, get_target_zone(), defer_hand = defer_hand) && target.can_be_grabbed(src, get_target_zone(), defer_hand)) + var/target_zone = get_target_zone() + if(ispath(grab_tag, /decl/grab) && can_grab(target, target_zone, defer_hand = defer_hand) && target.can_be_grabbed(src, target_zone, defer_hand)) grab = new /obj/item/grab(src, target, grab_tag, defer_hand) if(QDELETED(grab)) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 484ae76783b..9a8385fe707 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -24,10 +24,11 @@ var/global/list/possible_say_verbs = list( icon = 'icons/mob/robots/pai/pai_drone.dmi' icon_state = ICON_STATE_WORLD mob_sort_value = 3 - hud_type = /datum/hud/pai + hud_used = /datum/hud/pai emote_type = 2 // pAIs emotes are heard, not seen, so they can be seen through a container (eg. person) pass_flags = PASS_FLAG_TABLE mob_size = MOB_SIZE_SMALL + mob_default_max_health = 100 can_pull_size = ITEM_SIZE_SMALL can_pull_mobs = MOB_PULL_SMALLER diff --git a/code/modules/mob/living/silicon/robot/flying/flying.dm b/code/modules/mob/living/silicon/robot/flying/flying.dm index dbd40ea19a0..6e7d5676935 100644 --- a/code/modules/mob/living/silicon/robot/flying/flying.dm +++ b/code/modules/mob/living/silicon/robot/flying/flying.dm @@ -22,7 +22,11 @@ components["armour"] = new/datum/robot_component/armour/light(src) /mob/living/silicon/robot/flying/handle_regular_status_updates() + . = ..() + if(. == PROCESS_KILL) + return + if(incapacitated() || !is_component_functioning("actuator")) stop_flying() else diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index a428261a854..f4512af3a7e 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -103,51 +103,6 @@ if (MED_HUD) process_med_hud(src,0,network = get_computer_network()) - if(length(get_active_grabs())) - ui_drop_grab.set_invisibility(INVISIBILITY_NONE) - ui_drop_grab.alpha = 255 - else - ui_drop_grab.set_invisibility(INVISIBILITY_ABSTRACT) - ui_drop_grab.alpha = 0 - - if (src.healths) - if (src.stat != DEAD) - if(isdrone(src)) - switch(current_health) - if(35 to INFINITY) - src.healths.icon_state = "health0" - if(25 to 34) - src.healths.icon_state = "health1" - if(15 to 24) - src.healths.icon_state = "health2" - if(5 to 14) - src.healths.icon_state = "health3" - if(0 to 4) - src.healths.icon_state = "health4" - if(-35 to 0) - src.healths.icon_state = "health5" - else - src.healths.icon_state = "health6" - else - switch(current_health) - if(200 to INFINITY) - src.healths.icon_state = "health0" - if(150 to 200) - src.healths.icon_state = "health1" - if(100 to 150) - src.healths.icon_state = "health2" - if(50 to 100) - src.healths.icon_state = "health3" - if(0 to 50) - src.healths.icon_state = "health4" - else - if(current_health > config.health_threshold_dead) - src.healths.icon_state = "health5" - else - src.healths.icon_state = "health6" - else - src.healths.icon_state = "health7" - if (src.syndicate && src.client) var/decl/special_role/traitors = GET_DECL(/decl/special_role/traitor) for(var/datum/mind/tra in traitors.current_antagonists) @@ -158,56 +113,7 @@ src.disconnect_from_ai() if(src.mind) traitors.add_antagonist_mind(mind) - - if (src.cells) - if (src.cell) - var/chargeNum = clamp(CEILING(cell.percent()/25), 0, 4) //0-100 maps to 0-4, but give it a paranoid clamp just in case. - src.cells.icon_state = "charge[chargeNum]" - else - src.cells.icon_state = "charge-empty" - - if(bodytemp) - switch(src.bodytemperature) //310.055 optimal body temp - if(335 to INFINITY) - src.bodytemp.icon_state = "temp2" - if(320 to 335) - src.bodytemp.icon_state = "temp1" - if(300 to 320) - src.bodytemp.icon_state = "temp0" - if(260 to 300) - src.bodytemp.icon_state = "temp-1" - else - src.bodytemp.icon_state = "temp-2" - - var/datum/gas_mixture/environment = loc?.return_air() - if(fire && environment) - switch(environment.temperature) - if(-INFINITY to T100C) - src.fire.icon_state = "fire0" - else - src.fire.icon_state = "fire1" - if(oxygen && environment) - var/decl/species/species = all_species[global.using_map.default_species] - if(!species.breath_type || environment.gas[species.breath_type] >= species.breath_pressure) - src.oxygen.icon_state = "oxy0" - for(var/gas in species.poison_types) - if(environment.gas[gas]) - src.oxygen.icon_state = "oxy1" - break - else - src.oxygen.icon_state = "oxy1" - - if(stat != DEAD) - if(is_blind()) - overlay_fullscreen("blind", /obj/screen/fullscreen/blind) - else - clear_fullscreen("blind") - set_fullscreen(disabilities & NEARSIGHTED, "impaired", /obj/screen/fullscreen/impaired, 1) - set_fullscreen(GET_STATUS(src, STAT_BLURRY), "blurry", /obj/screen/fullscreen/blurry) - set_fullscreen(GET_STATUS(src, STAT_DRUGGY), "high", /obj/screen/fullscreen/high) - - update_items() - return 1 + return TRUE /mob/living/silicon/robot/handle_vision() ..() diff --git a/code/modules/mob/living/silicon/robot/modules/module_illegal.dm b/code/modules/mob/living/silicon/robot/modules/module_illegal.dm index d85ef086763..8ff7ce3a7b5 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_illegal.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_illegal.dm @@ -27,8 +27,8 @@ equipment += id /obj/item/robot_module/syndicate/finalize_equipment(var/mob/living/silicon/robot/R) - R.internals = locate(/obj/item/tank/jetpack/carbondioxide) in equipment . = ..() + R.set_internals(locate(/obj/item/tank/jetpack/carbondioxide) in equipment) /obj/item/robot_module/syndicate/Destroy() equipment -= id diff --git a/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm b/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm index 012206fe5ee..7e5407c89f3 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm @@ -60,8 +60,7 @@ /obj/item/robot_module/drone/finalize_equipment(var/mob/living/silicon/robot/R) . = ..() - if(istype(R)) - R.internals = locate(/obj/item/tank/jetpack/carbondioxide) in equipment + R.set_internals(locate(/obj/item/tank/jetpack/carbondioxide) in equipment) /obj/item/robot_module/drone/finalize_emag() . = ..() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index fa159234fb4..7a9deb2026c 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -37,7 +37,6 @@ var/obj/screen/inv1 = null var/obj/screen/inv2 = null var/obj/screen/inv3 = null - var/obj/screen/robot_drop_grab/ui_drop_grab var/shown_robot_modules = 0 //Used to determine whether they have the module menu shown or not var/obj/screen/robot_modules_background @@ -199,6 +198,7 @@ //If there's an MMI in the robot, have it ejected when the mob goes away. --NEO //Improved /N /mob/living/silicon/robot/Destroy() + QDEL_NULL(hands) if(mmi)//Safety for when a cyborg gets dust()ed. Or there is no MMI inside. if(mind) mmi.dropInto(loc) diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm index d437c93a981..9d17227a4a5 100644 --- a/code/modules/mob/living/silicon/robot/robot_damage.dm +++ b/code/modules/mob/living/silicon/robot/robot_damage.dm @@ -54,6 +54,7 @@ if(!parts.len) return var/datum/robot_component/picked = pick(parts) picked.heal_damage(brute,burn) + update_health() /mob/living/silicon/robot/take_organ_damage(var/brute = 0, var/burn = 0, var/bypass_armour = FALSE, var/override_droplimb) var/list/components = get_damageable_components() @@ -81,31 +82,29 @@ var/datum/robot_component/armour/A = get_armour() if(A) A.take_damage(brute, burn) + update_health() return var/datum/robot_component/C = pick(components) C.take_damage(brute, burn) + update_health() /mob/living/silicon/robot/heal_overall_damage(var/brute, var/burn) var/list/datum/robot_component/parts = get_damaged_components(brute,burn) - while(parts.len && (brute>0 || burn>0) ) var/datum/robot_component/picked = pick(parts) - var/brute_was = picked.brute_damage var/burn_was = picked.electronics_damage - picked.heal_damage(brute,burn) - brute -= (brute_was-picked.brute_damage) burn -= (burn_was-picked.electronics_damage) - parts -= picked + update_health() /mob/living/silicon/robot/take_overall_damage(var/brute = 0, var/burn = 0, var/sharp = 0, var/used_weapon = null) - if(status_flags & GODMODE) return //godmode + if(status_flags & GODMODE) + return var/list/datum/robot_component/parts = get_damageable_components() - //Combat shielding absorbs a percentage of damage directly into the cell. if(module_active && istype(module_active,/obj/item/borg/combat/shield)) var/obj/item/borg/combat/shield/shield = module_active diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm index ff5553a8004..338ffed8b12 100644 --- a/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -11,14 +11,7 @@ /mob/living/silicon/robot/get_jetpack() return locate(/obj/item/tank/jetpack) in module?.equipment -/mob/living/silicon/robot/Move() - . = ..() - if(. && client) - - var/turf/B = GetAbove(src) - up_hint.icon_state = "uphint[!!(B && TURF_IS_MIMICKING(B))]" - - //No longer needed, but I'll leave it here incase we plan to re-use it. +//No longer needed, but I'll leave it here incase we plan to re-use it. /mob/living/silicon/robot/get_movement_delay(var/travel_dir) var/tally = ..() //Incase I need to add stuff other than "speed" later diff --git a/code/modules/mob/living/simple_animal/constructs/constructs.dm b/code/modules/mob/living/simple_animal/constructs/constructs.dm index 74e15dd0143..b8326a0f1f4 100644 --- a/code/modules/mob/living/simple_animal/constructs/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs/constructs.dm @@ -120,9 +120,10 @@ force = 30 /mob/living/simple_animal/construct/armoured/handle_regular_status_updates() - set_status(STAT_WEAK, 0) - if ((. = ..())) + . = ..() + if(. == PROCESS_KILL) return + set_status(STAT_WEAK, 0) /mob/living/simple_animal/construct/armoured/bullet_act(var/obj/item/projectile/P) if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) @@ -246,85 +247,3 @@ hitsound = 'sound/weapons/pierce.ogg' sharp = TRUE force = 25 - -////////////////HUD////////////////////// -/mob/living/simple_animal/construct/handle_regular_status_updates() - . = ..() - if(.) - silence_spells(purge) - -/mob/living/simple_animal/construct/handle_regular_hud_updates() - . = ..() - if(.) - if(fire) - fire.icon_state = "fire[!!fire_alert]" - silence_spells(purge) - -/mob/living/simple_animal/construct/armoured/handle_regular_hud_updates() - . = ..() - if(. && healths) - switch(current_health) - if(250 to INFINITY) healths.icon_state = "juggernaut_health0" - if(208 to 249) healths.icon_state = "juggernaut_health1" - if(167 to 207) healths.icon_state = "juggernaut_health2" - if(125 to 166) healths.icon_state = "juggernaut_health3" - if(84 to 124) healths.icon_state = "juggernaut_health4" - if(42 to 83) healths.icon_state = "juggernaut_health5" - if(1 to 41) healths.icon_state = "juggernaut_health6" - else healths.icon_state = "juggernaut_health7" - - -/mob/living/simple_animal/construct/behemoth/handle_regular_hud_updates() - . = ..() - if(. && healths) - switch(current_health) - if(750 to INFINITY) healths.icon_state = "juggernaut_health0" - if(625 to 749) healths.icon_state = "juggernaut_health1" - if(500 to 624) healths.icon_state = "juggernaut_health2" - if(375 to 499) healths.icon_state = "juggernaut_health3" - if(250 to 374) healths.icon_state = "juggernaut_health4" - if(125 to 249) healths.icon_state = "juggernaut_health5" - if(1 to 124) healths.icon_state = "juggernaut_health6" - else healths.icon_state = "juggernaut_health7" - -/mob/living/simple_animal/construct/builder/handle_regular_hud_updates() - . = ..() - if(. && healths) - switch(current_health) - if(50 to INFINITY) healths.icon_state = "artificer_health0" - if(42 to 49) healths.icon_state = "artificer_health1" - if(34 to 41) healths.icon_state = "artificer_health2" - if(26 to 33) healths.icon_state = "artificer_health3" - if(18 to 25) healths.icon_state = "artificer_health4" - if(10 to 17) healths.icon_state = "artificer_health5" - if(1 to 9) healths.icon_state = "artificer_health6" - else healths.icon_state = "artificer_health7" - - - -/mob/living/simple_animal/construct/wraith/handle_regular_hud_updates() - . = ..() - if(. && healths) - switch(current_health) - if(75 to INFINITY) healths.icon_state = "wraith_health0" - if(62 to 74) healths.icon_state = "wraith_health1" - if(50 to 61) healths.icon_state = "wraith_health2" - if(37 to 49) healths.icon_state = "wraith_health3" - if(25 to 36) healths.icon_state = "wraith_health4" - if(12 to 24) healths.icon_state = "wraith_health5" - if(1 to 11) healths.icon_state = "wraith_health6" - else healths.icon_state = "wraith_health7" - - -/mob/living/simple_animal/construct/harvester/handle_regular_hud_updates() - . = ..() - if(. && healths) - switch(current_health) - if(150 to INFINITY) healths.icon_state = "harvester_health0" - if(125 to 149) healths.icon_state = "harvester_health1" - if(100 to 124) healths.icon_state = "harvester_health2" - if(75 to 99) healths.icon_state = "harvester_health3" - if(50 to 74) healths.icon_state = "harvester_health4" - if(25 to 49) healths.icon_state = "harvester_health5" - if(1 to 24) healths.icon_state = "harvester_health6" - else healths.icon_state = "harvester_health7" diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 3568d883147..fd2c614dc0e 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -70,6 +70,13 @@ if(. && stat == CONSCIOUS && udder && prob(5)) udder.add_reagent(/decl/material/liquid/drink/milk, rand(5, 10)) + if(!LAZYLEN(grabbed_by)) + var/obj/effect/vine/food + food = locate(/obj/effect/vine) in oview(5,loc) + if(food) + var/step = get_step_to(src, food, 0) + Move(step) + /mob/living/simple_animal/hostile/retaliate/goat/Retaliate() ..() if(stat == CONSCIOUS && prob(50)) diff --git a/code/modules/mob/living/simple_animal/friendly/possum.dm b/code/modules/mob/living/simple_animal/friendly/possum.dm index 8ecba81bd37..063aef0889e 100644 --- a/code/modules/mob/living/simple_animal/friendly/possum.dm +++ b/code/modules/mob/living/simple_animal/friendly/possum.dm @@ -30,6 +30,7 @@ /datum/ai/opossum expected_type = /mob/living/simple_animal/opossum /datum/ai/opossum/do_process(time_elapsed) + . = ..() if(!prob(1)) return diff --git a/code/modules/mob/living/simple_animal/hostile/antlion.dm b/code/modules/mob/living/simple_animal/hostile/antlion.dm index cd297e85789..2a812c6dfa8 100644 --- a/code/modules/mob/living/simple_animal/hostile/antlion.dm +++ b/code/modules/mob/living/simple_animal/hostile/antlion.dm @@ -27,6 +27,7 @@ var/heal_amount = 6 /mob/living/simple_animal/hostile/antlion/handle_regular_status_updates() + . = ..() process_healing() //this needs to occur before if(!.) because of stop_automation if(. && !is_on_special_ability_cooldown() && can_act() && target_mob) diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index dd9a38bf127..34bbaa12507 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -206,6 +206,7 @@ Guard caste procs expected_type = /mob/living/simple_animal/hostile/giant_spider/guard /datum/ai/giant_spider/guard/do_process(time_elapsed) + . = ..() var/mob/living/simple_animal/hostile/giant_spider/guard/spooder = body if(spooder.berserking) @@ -309,6 +310,7 @@ Nurse caste procs expected_type = /mob/living/simple_animal/hostile/giant_spider/nurse /datum/ai/giant_spider/nurse/do_process(time_elapsed) + . = ..() var/mob/living/simple_animal/hostile/giant_spider/nurse/spooder = body if(spooder.stance != HOSTILE_STANCE_IDLE) @@ -447,9 +449,11 @@ Hunter caste procs Spitter caste procs ******************/ /mob/living/simple_animal/hostile/giant_spider/spitter/handle_regular_status_updates() + . = ..() - if(!.) - return FALSE + if(. == PROCESS_KILL) + return + if(venom_charge <= 0) ranged = FALSE if(prob(25)) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 9ffb1a2d606..a1dcf731f89 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -184,8 +184,9 @@ /mob/living/simple_animal/hostile/handle_regular_status_updates() . = ..() - if(!.) - walk(src, 0) + if(. == PROCESS_KILL) + return + walk(src, 0) /mob/living/simple_animal/hostile/do_delayed_life_action() ..() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index e0d30571c1c..d80d5bc85d0 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -89,7 +89,9 @@ . = ..() if(!.) return - + . = ..() + if(. == PROCESS_KILL) + return //emps and lots of damage can temporarily shut us down if(disabled > 0) set_stat(UNCONSCIOUS) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm index 017b5fe527f..202f1507273 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm @@ -192,8 +192,8 @@ /mob/living/simple_animal/hostile/retaliate/goat/king/phase2/handle_living_non_stasis_processes() . = ..() - if(!.) - return FALSE + if(. == PROCESS_KILL) + return if(special_attacks >= 6 && current_damtype != BRUTE) visible_message(SPAN_MFAUNA("The energy surrounding \the [src]'s horns dissipates.")) current_damtype = BRUTE diff --git a/code/modules/mob/living/simple_animal/hostile/slug.dm b/code/modules/mob/living/simple_animal/hostile/slug.dm index 6be1362d635..76485431e6f 100644 --- a/code/modules/mob/living/simple_animal/hostile/slug.dm +++ b/code/modules/mob/living/simple_animal/hostile/slug.dm @@ -52,7 +52,9 @@ /mob/living/simple_animal/hostile/slug/handle_regular_status_updates() . = ..() - if(. && istype(src.loc, /obj/item/holder) && isliving(src.loc.loc)) //We in somebody + if(. == PROCESS_KILL) + return + if(istype(src.loc, /obj/item/holder) && isliving(src.loc.loc)) //We in somebody var/mob/living/L = src.loc.loc if(src.loc in L.get_visible_implants(0)) if(prob(1)) diff --git a/code/modules/mob/living/simple_animal/hostile/vagrant.dm b/code/modules/mob/living/simple_animal/hostile/vagrant.dm index 36ad1d84c93..3b7a685d0d0 100644 --- a/code/modules/mob/living/simple_animal/hostile/vagrant.dm +++ b/code/modules/mob/living/simple_animal/hostile/vagrant.dm @@ -44,8 +44,8 @@ /mob/living/simple_animal/hostile/vagrant/handle_living_non_stasis_processes() . = ..() - if(!.) - return FALSE + if(. == PROCESS_KILL) + return if(gripping) if(!(get_turf(src) == get_turf(gripping))) gripping = null diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 4979d1244e4..bc4b1a16f23 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -44,7 +44,6 @@ var/maxbodytemp = 350 var/heat_damage_per_tick = 3 //amount of damage applied if animal's body temperature is higher than maxbodytemp var/cold_damage_per_tick = 2 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp - var/fire_alert = 0 //Atmos effect - Yes, you can make creatures that require arbitrary gasses to survive. N2O is a trace gas and handled separately, hence why it isn't here. It'd be hard to add it. Hard and me don't mix (Yes, yes make all the dick jokes you want with that.) - Errorage var/list/min_gas = list(/decl/material/gas/oxygen = 5) @@ -68,7 +67,7 @@ //Null rod stuff var/supernatural = 0 - var/purge = 0 + var/purged_time = 0 // TODO: make this a status condition var/bleed_ticks = 0 var/bleed_colour = COLOR_BLOOD_HUMAN @@ -171,8 +170,6 @@ var/global/list/simplemob_icon_bitflag_cache = list() . = ..() /mob/living/simple_animal/handle_regular_status_updates() - if(purge) - purge -= 1 . = ..() if(.) if(can_bleed && bleed_ticks > 0) @@ -264,14 +261,9 @@ var/global/list/simplemob_icon_bitflag_cache = list() bodytemperature += ((environment.temperature - bodytemperature) / 5) if(bodytemperature < minbodytemp) - fire_alert = 2 adjustBruteLoss(cold_damage_per_tick) else if(bodytemperature > maxbodytemp) - fire_alert = 1 adjustBruteLoss(heat_damage_per_tick) - else - fire_alert = 0 - if(!atmos_suitable) adjustBruteLoss(unsuitable_atmos_damage) @@ -404,7 +396,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() damage = (O.force / 8) if(supernatural && istype(O,/obj/item/nullrod)) damage *= 2 - purge = 3 + purged_time = 3 adjustBruteLoss(damage) if(O.edge || O.sharp) adjustBleedTicks(damage) @@ -413,12 +405,11 @@ var/global/list/simplemob_icon_bitflag_cache = list() /mob/living/simple_animal/get_movement_delay(var/travel_dir) var/tally = ..() //Incase I need to add stuff other than "speed" later - tally += speed - if(purge)//Purged creatures will move more slowly. The more time before their purge stops, the slower they'll move. + if(purged_time)//Purged creatures will move more slowly. The more time before their purge stops, the slower they'll move. if(tally <= 0) tally = 1 - tally *= purge + tally *= purged_time return tally+config.animal_delay diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 790b2ee8eb7..fba611a84f2 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -107,15 +107,10 @@ refresh_client_images() reload_fullscreen() // Reload any fullscreen overlays this mob has. - add_click_catcher() + reset_click_catchers() update_action_buttons() update_mouse_pointer() - if(ability_master) - ability_master.update_abilities(TRUE, src) - ability_master.toggle_open(1) - ability_master.synch_spells_to_mind(mind) - if(get_preference_value(/datum/client_preference/show_status_markers) == PREF_SHOW) if(status_markers?.mob_image_personal) client.images |= status_markers.mob_image_personal diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 3e6cb98c0f7..9dbca7489eb 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -13,8 +13,6 @@ QDEL_NULL(hud_used) if(active_storage) active_storage.close(src) - if(istype(ability_master)) - QDEL_NULL(ability_master) if(istype(skillset)) QDEL_NULL(skillset) QDEL_NULL_LIST(grabbed_by) @@ -22,7 +20,6 @@ if(istype(ai)) QDEL_NULL(ai) QDEL_NULL(lighting_master) - remove_screen_obj_references() if(client) for(var/atom/movable/AM in client.screen) var/obj/screen/screenobj = AM @@ -35,27 +32,6 @@ ghostize() return ..() -/mob/proc/remove_screen_obj_references() - QDEL_NULL_SCREEN(hands) - QDEL_NULL_SCREEN(internals) - QDEL_NULL_SCREEN(oxygen) - QDEL_NULL_SCREEN(toxin) - QDEL_NULL_SCREEN(fire) - QDEL_NULL_SCREEN(bodytemp) - QDEL_NULL_SCREEN(healths) - QDEL_NULL_SCREEN(throw_icon) - QDEL_NULL_SCREEN(nutrition_icon) - QDEL_NULL_SCREEN(hydration_icon) - QDEL_NULL_SCREEN(pressure) - QDEL_NULL_SCREEN(pain) - QDEL_NULL_SCREEN(up_hint) - QDEL_NULL_SCREEN(item_use_icon) - QDEL_NULL_SCREEN(radio_use_icon) - QDEL_NULL_SCREEN(gun_move_icon) - QDEL_NULL_SCREEN(gun_setting_icon) - QDEL_NULL_SCREEN(ability_master) - QDEL_NULL_SCREEN(zone_sel) - /mob/Initialize() if(ispath(skillset)) skillset = new skillset(src) @@ -235,10 +211,11 @@ /mob/proc/Life() SHOULD_NOT_SLEEP(TRUE) + SHOULD_CALL_PARENT(TRUE) if(QDELETED(src)) return PROCESS_KILL - if(ability_master) - ability_master.update_spells(0) + // Alerts will be set by logic higher in the call chain. + CLEAR_HUD_ALERTS(src) #define UNBUCKLED 0 #define PARTIALLY_BUCKLED 1 @@ -965,13 +942,15 @@ /mob/proc/throw_mode_off() src.in_throw_mode = 0 - if(src.throw_icon) //in case we don't have the HUD and we use the hotkey - src.throw_icon.icon_state = "act_throw_off" + var/obj/screen/throw_icon = get_hud_element(/decl/hud_element/throwing) + if(throw_icon) //in case we don't have the HUD and we use the hotkey + throw_icon.icon_state = "act_throw_off" /mob/proc/throw_mode_on() src.in_throw_mode = 1 - if(src.throw_icon) - src.throw_icon.icon_state = "act_throw_on" + var/obj/screen/throw_icon = get_hud_element(/decl/hud_element/throwing) + if(throw_icon) + throw_icon.icon_state = "act_throw_on" /mob/proc/toggle_antag_pool() set name = "Toggle Add-Antag Candidacy" @@ -993,7 +972,7 @@ return (!alpha || !mouse_opacity || viewer.see_invisible < invisibility) /client/proc/check_has_body_select() - return mob && mob.hud_used && istype(mob.zone_sel, /obj/screen/zone_selector) + return istype(mob?.get_hud_element(/decl/hud_element/zone_selector), /obj/screen/zone_selector) /client/verb/body_toggle_head() set name = "body-toggle-head" @@ -1033,8 +1012,9 @@ /client/proc/toggle_zone_sel(list/zones) if(!check_has_body_select()) return - var/obj/screen/zone_selector/selector = mob.zone_sel - selector.set_selected_zone(next_in_list(mob.get_target_zone(),zones)) + var/obj/screen/zone_selector/selector = mob?.get_hud_element(/decl/hud_element/zone_selector) + if(selector) + selector.set_selected_zone(next_in_list(selector.selecting, zones)) /mob/proc/has_admin_rights() return check_rights(R_ADMIN, 0, src) @@ -1333,8 +1313,18 @@ /mob/proc/toggle_internals(var/mob/living/user) return +/mob/Move() + . = ..() + if(. && client) + var/obj/screen/up_hint = get_hud_element(/decl/hud_element/up_hint) + if(up_hint) + var/turf/above = GetAbove(src) + up_hint.icon_state = "uphint[!!(above && TURF_IS_MIMICKING(above))]" + /mob/proc/get_target_zone() - return zone_sel?.selecting + var/obj/screen/zone_selector/zone_sel = get_hud_element(/decl/hud_element/zone_selector) + if(istype(zone_sel)) + return zone_sel?.selecting /mob/proc/get_temperature_threshold(var/threshold) switch(threshold) @@ -1364,9 +1354,14 @@ RETURN_TYPE(/obj/item/card/id) return LAZYACCESS(GetIdCards(exceptions), 1) +/mob/proc/get_ideal_bodytemp() + var/decl/species/my_species = get_species() + if(my_species) + return (my_species.body_temperature - bodytemperature) + return null + /mob/get_overhead_text_x_offset() return offset_overhead_text_x /mob/get_overhead_text_y_offset() return offset_overhead_text_y - diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 595b81c515b..053c728acd7 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -39,36 +39,6 @@ var/stat = CONSCIOUS //Whether a mob is alive or dead. TODO: Move this to living - Nodrak - var/obj/screen/cells = null - - var/obj/screen/hands = null - var/obj/screen/internals = null - var/obj/screen/oxygen = null - var/obj/screen/toxin = null - var/obj/screen/fire = null - var/obj/screen/bodytemp = null - var/obj/screen/healths = null - var/obj/screen/throw_icon = null - var/obj/screen/nutrition_icon = null - var/obj/screen/hydration_icon = null - var/obj/screen/pressure = null - var/obj/screen/pain = null - var/obj/screen/up_hint = null - var/obj/screen/gun/item/item_use_icon = null - var/obj/screen/gun/radio/radio_use_icon = null - var/obj/screen/gun/move/gun_move_icon = null - var/obj/screen/gun/mode/gun_setting_icon = null - - var/obj/screen/ability_master/ability_master = null - - /*A bunch of this stuff really needs to go under their own defines instead of being globally attached to mob. - A variable should only be globally attached to turfs/objects/whatever, when it is in fact needed as such. - The current method unnecessarily clusters up the variable list, especially for humans (although rearranging won't really clean it up a lot but the difference will be noticable for other mobs). - I'll make some notes on where certain variable defines should probably go. - Changing this around would probably require a good look-over the pre-existing code. - */ - var/obj/screen/zone_selector/zone_sel = null - /// Cursor icon used when holding shift over things. var/examine_cursor_icon = 'icons/effects/mouse_pointers/examine_pointer.dmi' diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index af0fac10217..481b738892a 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -13,7 +13,7 @@ return FALSE //M is too small to wield this return TRUE -/mob/living/proc/isSynthetic() +/mob/proc/isSynthetic() return 0 /mob/living/carbon/human/isSynthetic() @@ -371,6 +371,8 @@ var/global/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) set name = "a-intent" set hidden = 1 + var/obj/screen/action_intent = get_hud_element(/decl/hud_element/action_intent) + if(can_change_intent()) switch(input) if(I_HELP,I_DISARM,I_GRAB,I_HURT) @@ -379,8 +381,8 @@ var/global/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) a_intent = intent_numeric((intent_numeric(a_intent)+1) % 4) if("left") a_intent = intent_numeric((intent_numeric(a_intent)+3) % 4) - if(hud_used && hud_used.action_intent) - hud_used.action_intent.icon_state = "intent_[a_intent]" + if(action_intent) + action_intent.icon_state = "intent_[a_intent]" else if(isrobot(src)) switch(input) @@ -390,11 +392,11 @@ var/global/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) a_intent = I_HURT if("right","left") a_intent = intent_numeric(intent_numeric(a_intent) - 3) - if(hud_used && hud_used.action_intent) + if(action_intent) if(a_intent == I_HURT) - hud_used.action_intent.icon_state = I_HURT + action_intent.icon_state = I_HURT else - hud_used.action_intent.icon_state = I_HELP + action_intent.icon_state = I_HELP /mob/proc/welding_eyecheck() return diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 621d6b5425a..6791d33cd72 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -279,8 +279,9 @@ /mob/proc/set_move_intent(var/decl/move_intent/next_intent) if(next_intent && move_intent != next_intent && next_intent.can_be_used_by(src)) move_intent = next_intent - if(hud_used) - hud_used.move_intent.icon_state = move_intent.hud_icon_state + var/obj/screen/hud_move_intent = get_hud_element(/decl/hud_element/move_intent) + if(hud_move_intent) + hud_move_intent.icon_state = move_intent.hud_icon_state return TRUE return FALSE diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index 3093ebd9253..d97309a3cff 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -418,7 +418,6 @@ /obj/item/organ/external/update_organ_health() damage = min(max_damage, (brute_dam + burn_dam)) - return //If "in_place" is TRUE will make organs skip their install/uninstall effects and the sub-limbs and internal organs /obj/item/organ/external/do_install(mob/living/carbon/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm index a5e4ca1812e..b40d49ca4a1 100644 --- a/code/modules/organs/internal/lungs.dm +++ b/code/modules/organs/internal/lungs.dm @@ -199,12 +199,12 @@ to_chat(owner, SPAN_NOTICE("It gets easier to breathe.")) breath_fail_ratio = clamp(0,breath_fail_ratio-0.05,1) - owner.oxygen_alert = failed_inhale * 2 - + var/alert_val = (failed_inhale * 2) + SET_HUD_ALERT(owner, /decl/hud_element/condition/oxygen, alert_val) var/inhaled_gas_used = inhaling / 4 breath.adjust_gas(breath_type, -inhaled_gas_used, update = 0) //update afterwards - owner.toxins_alert = 0 // Reset our toxins alert for now. + SET_HUD_ALERT(owner, /decl/hud_element/condition/toxins, 0) if(!failed_inhale) // Enough gas to tell we're being poisoned via chemical burns or whatever. var/poison_total = 0 if(poison_types) @@ -212,7 +212,7 @@ if(poison_types[gname]) poison_total += breath.gas[gname] if(((poison_total/breath.total_moles)*breath_pressure) > safe_toxins_max) - owner.toxins_alert = 1 + SET_HUD_ALERT(owner, /decl/hud_element/condition/toxins, 1) // Pass reagents from the gas into our body. // Presumably if you breathe it you have a specialized metabolism for it, so we drop/ignore breath_type. Also avoids @@ -252,7 +252,7 @@ if(failed_breath) handle_failed_breath() else - owner.oxygen_alert = 0 + SET_HUD_ALERT(owner, /decl/hud_element/condition/oxygen, 0) return failed_breath /obj/item/organ/internal/lungs/proc/handle_failed_breath() @@ -266,7 +266,7 @@ if(damage || GET_CHEMICAL_EFFECT(owner, CE_BREATHLOSS) || world.time > last_successful_breath + 2 MINUTES) owner.adjustOxyLoss(HUMAN_MAX_OXYLOSS*breath_fail_ratio) - owner.oxygen_alert = max(owner.oxygen_alert, 2) + SET_HUD_ALERT_MAX(owner, /decl/hud_element/condition/oxygen, 2) last_int_pressure = 0 /obj/item/organ/internal/lungs/proc/handle_temperature_effects(datum/gas_mixture/breath) @@ -289,7 +289,9 @@ owner.apply_damage(damage, BURN, BP_HEAD, used_weapon = "Excessive Cold") else src.damage += damage - owner.fire_alert = 1 + if(owner.hud_used) + SET_HUD_ALERT_MAX(owner, /decl/hud_element/condition/fire, 1) + else if(breath.temperature >= heat_1) if(prob(20)) to_chat(owner, "You feel your face burning and a searing heat in your lungs!") @@ -305,7 +307,7 @@ owner.apply_damage(damage, BURN, BP_HEAD, used_weapon = "Excessive Heat") else src.damage += damage - owner.fire_alert = 2 + SET_HUD_ALERT(owner, /decl/hud_element/condition/fire, 2) //breathing in hot/cold air also heats/cools you a bit var/temp_adj = breath.temperature - owner.bodytemperature diff --git a/code/modules/organs/pain.dm b/code/modules/organs/pain.dm index d9bff64a519..ffedb2e1293 100644 --- a/code/modules/organs/pain.dm +++ b/code/modules/organs/pain.dm @@ -1,12 +1,13 @@ /mob/proc/flash_pain(var/target) - if(pain) + var/obj/screen/pain_overlay = get_hud_element(/decl/hud_element/pain) + if(pain_overlay) var/matrix/M if(client && max(client.last_view_x_dim, client.last_view_y_dim) > 7) M = matrix() M.Scale(CEILING(client.last_view_x_dim/7), CEILING(client.last_view_y_dim/7)) - pain.transform = M - animate(pain, alpha = target, time = 15, easing = ELASTIC_EASING) - animate(pain, alpha = 0, time = 20) + pain_overlay.transform = M + animate(pain_overlay, alpha = target, time = 15, easing = ELASTIC_EASING) + animate(pain_overlay, alpha = 0, time = 20) /mob/living/proc/can_feel_pain(var/check_organ) if(check_organ) diff --git a/code/modules/organs/prosthetics/_prosthetics.dm b/code/modules/organs/prosthetics/_prosthetics.dm index 916eb8ea492..441c3dbdfdf 100644 --- a/code/modules/organs/prosthetics/_prosthetics.dm +++ b/code/modules/organs/prosthetics/_prosthetics.dm @@ -139,12 +139,12 @@ var/obj/item/organ/external/E = get_active_hand() if(!check_can_attach_modular_limb(E)) return FALSE + set_special_ability_cooldown(2 SECONDS) if(!do_after(src, 2 SECONDS, src)) return FALSE if(!check_can_attach_modular_limb(E)) return FALSE - set_special_ability_cooldown(2 SECONDS) drop_from_inventory(E) src.add_organ(E) @@ -173,12 +173,12 @@ var/obj/item/organ/external/E = input(usr, "Which limb do you wish to detach?", "Limb Removal") as null|anything in detachable_limbs if(!check_can_detach_modular_limb(E)) return FALSE + set_special_ability_cooldown(2 SECONDS) if(!do_after(src, 2 SECONDS, src)) return FALSE if(!check_can_detach_modular_limb(E)) return FALSE - set_special_ability_cooldown(2 SECONDS) remove_organ(E, update_icon = TRUE) E.dropInto(loc) put_in_hands(E) diff --git a/code/modules/projectiles/targeting/targeting_client.dm b/code/modules/projectiles/targeting/targeting_client.dm index eeaf61909de..0facc51e601 100644 --- a/code/modules/projectiles/targeting/targeting_client.dm +++ b/code/modules/projectiles/targeting/targeting_client.dm @@ -1,12 +1,16 @@ //These are called by the on-screen buttons, adjusting what the victim can and cannot do. /client/proc/add_gun_icons() - if(!usr || !usr.item_use_icon) return 1 // This can runtime if someone manages to throw a gun out of their hand before the proc is called. - screen |= usr.item_use_icon - screen |= usr.gun_move_icon - screen |= usr.radio_use_icon + if(!usr?.hud_used) + return + for(var/elem_type in global.gun_hud_flag_decl_types) + var/obj/screen/elem = usr.get_hud_element(elem_type) + if(elem) + screen |= elem /client/proc/remove_gun_icons() - if(!usr) return 1 // Runtime prevention on N00k agents spawning with SMG - screen -= usr.item_use_icon - screen -= usr.gun_move_icon - screen -= usr.radio_use_icon + if(!usr?.hud_used) + return + for(var/elem_type in global.gun_hud_flag_decl_types) + var/obj/screen/elem = usr.get_hud_element(elem_type) + if(elem) + screen -= elem diff --git a/code/modules/projectiles/targeting/targeting_overlay.dm b/code/modules/projectiles/targeting/targeting_overlay.dm index c9cc33f2a3a..8255cf7298b 100644 --- a/code/modules/projectiles/targeting/targeting_overlay.dm +++ b/code/modules/projectiles/targeting/targeting_overlay.dm @@ -32,29 +32,13 @@ target_permissions |= perm // Update HUD icons. - if(owner.gun_move_icon) - if(!(target_permissions & TARGET_CAN_MOVE)) - owner.gun_move_icon.icon_state = "no_walk0" - owner.gun_move_icon.SetName("Allow Movement") - else - owner.gun_move_icon.icon_state = "no_walk1" - owner.gun_move_icon.SetName("Disallow Movement") - - if(owner.item_use_icon) - if(!(target_permissions & TARGET_CAN_CLICK)) - owner.item_use_icon.icon_state = "no_item0" - owner.item_use_icon.SetName("Allow Item Use") - else - owner.item_use_icon.icon_state = "no_item1" - owner.item_use_icon.SetName("Disallow Item Use") + if(!owner?.hud_used) + return - if(owner.radio_use_icon) - if(!(target_permissions & TARGET_CAN_RADIO)) - owner.radio_use_icon.icon_state = "no_radio0" - owner.radio_use_icon.SetName("Allow Radio Use") - else - owner.radio_use_icon.icon_state = "no_radio1" - owner.radio_use_icon.SetName("Disallow Radio Use") + for(var/gun_flag_elem in global.gun_hud_flag_decl_types) + var/obj/screen/gun_flag/gun_elem = owner.get_hud_element(gun_flag_elem) + if(istype(gun_elem)) + gun_elem.update_from_aiming_overlay(src) var/message = "no longer permitted to " var/use_span = "warning" @@ -206,7 +190,11 @@ if(!no_message) to_chat(owner, "You will no longer aim rather than fire.") owner.client.remove_gun_icons() - owner.gun_setting_icon.icon_state = "gun[active]" + + if(istype(owner.hud_used)) + var/obj/screen/gun_mode/gun_mode = owner.get_hud_element(/decl/hud_element/gun_mode) + if(gun_mode) + gun_mode.icon_state = "gun[!!active]" /obj/aiming_overlay/proc/cancel_aiming(var/no_message = 0) if(!aiming_with || !aiming_at) diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm index b0aba0256c9..95a27586885 100644 --- a/code/modules/species/species.dm +++ b/code/modules/species/species.dm @@ -141,7 +141,7 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 // HUD data vars. var/datum/hud_data/hud - var/hud_type + var/species_hud_type var/grab_type = /decl/grab/normal/passive // The species' default grab type. @@ -342,8 +342,8 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 if(!default_cultural_info[token]) default_cultural_info[token] = global.using_map.default_cultural_info[token] - if(hud_type) - hud = new hud_type() + if(species_hud_type) + hud = new species_hud_type() else hud = new() diff --git a/code/modules/species/species_hud.dm b/code/modules/species/species_hud.dm index 412aff74fdd..b94a53efc23 100644 --- a/code/modules/species/species_hud.dm +++ b/code/modules/species/species_hud.dm @@ -1,17 +1,5 @@ /datum/hud_data var/icon // If set, overrides ui_style. - var/has_a_intent = 1 // Set to draw intent box. - var/has_m_intent = 1 // Set to draw move intent box. - var/has_warnings = 1 // Set to draw environment warnings. - var/has_pressure = 1 // Draw the pressure indicator. - var/has_nutrition = 1 // Draw the nutrition indicator. - var/has_bodytemp = 1 // Draw the bodytemp indicator. - var/has_hands = 1 // Set to draw hands. - var/has_drop = 1 // Set to draw drop button. - var/has_throw = 1 // Set to draw throw button. - var/has_resist = 1 // Set to draw resist button. - var/has_internals = 1 // Set to draw the internals toggle button. - var/has_up_hint = 1 // Set to draw the "look-up" hint icon var/list/equip_slots = list() // Checked by mob_can_equip(). var/list/persistent_slots = list() // Built in New(), used for unhidable inv updates var/list/hidden_slots = list() // Built in New(), used for hidable inv updates @@ -50,8 +38,7 @@ else persistent_slots |= slot_id - if(has_hands) - equip_slots |= slot_handcuffed_str + equip_slots |= slot_handcuffed_str if(slot_back_str in equip_slots) equip_slots |= slot_in_backpack_str diff --git a/code/modules/species/species_shapeshifter.dm b/code/modules/species/species_shapeshifter.dm index 3a8bff664eb..81e4aa58d1d 100644 --- a/code/modules/species/species_shapeshifter.dm +++ b/code/modules/species/species_shapeshifter.dm @@ -86,7 +86,7 @@ var/global/list/wrapped_species_by_ref = list() set name = "Select Body Shape" set category = "Abilities" - if(stat ||is_on_special_ability_cooldown()) + if(stat || is_on_special_ability_cooldown()) return set_special_ability_cooldown(5 SECONDS) diff --git a/code/modules/species/station/monkey.dm b/code/modules/species/station/monkey.dm index 9d72c6ef81f..9b97a2ad3b0 100644 --- a/code/modules/species/station/monkey.dm +++ b/code/modules/species/station/monkey.dm @@ -17,7 +17,7 @@ unarmed_attacks = list(/decl/natural_attack/bite, /decl/natural_attack/claws, /decl/natural_attack/punch) inherent_verbs = list(/mob/living/proc/ventcrawl) - hud_type = /datum/hud_data/monkey + species_hud_type = /datum/hud_data/monkey meat_type = /obj/item/chems/food/meat/monkey rarity_value = 0.1 diff --git a/code/modules/spells/contracts.dm b/code/modules/spells/contracts.dm index 60c6bba8bf9..3326ddefef0 100644 --- a/code/modules/spells/contracts.dm +++ b/code/modules/spells/contracts.dm @@ -1,7 +1,7 @@ /obj/item/contract name = "contract" desc = "written in the blood of some unfortunate fellow." - icon = 'icons/mob/screen_spells.dmi' + icon = 'icons/mob/screen/spells.dmi' icon_state = "master_open" material = /decl/material/solid/organic/paper var/contract_master = null diff --git a/code/modules/spells/hand/hand_item.dm b/code/modules/spells/hand/hand_item.dm index 855cfdcfa92..dd5f6ee6d90 100644 --- a/code/modules/spells/hand/hand_item.dm +++ b/code/modules/spells/hand/hand_item.dm @@ -4,12 +4,12 @@ Basically: I can use it to target things where I click. I can then pass these ta /obj/item/magic_hand name = "Magic Hand" - icon = 'icons/mob/screen1.dmi' + icon = 'icons/mob/screen/spells.dmi' + icon_state = "spell" atom_flags = 0 item_flags = 0 obj_flags = 0 simulated = 0 - icon_state = "spell" max_health = ITEM_HEALTH_NO_DAMAGE is_spawnable_type = FALSE var/next_spell_time = 0 diff --git a/code/modules/spells/spell_code.dm b/code/modules/spells/spell_code.dm index 981e56a5f0c..c3d7f0fd5b0 100644 --- a/code/modules/spells/spell_code.dm +++ b/code/modules/spells/spell_code.dm @@ -240,7 +240,7 @@ var/global/list/spells = typesof(/spell) //needed for the badmin verb for now if(holder == user) if(isanimal(user)) var/mob/living/simple_animal/SA = user - if(SA.purge) + if(SA.purged_time) to_chat(SA, "The null sceptre's power interferes with your own!") return 0 diff --git a/code/modules/spells/spells.dm b/code/modules/spells/spells.dm index d2dc6a0201e..474f745cfba 100644 --- a/code/modules/spells/spells.dm +++ b/code/modules/spells/spells.dm @@ -3,18 +3,8 @@ /mob/Stat() . = ..() - if(. && ability_master && ability_master.spell_objects) - for(var/obj/screen/ability/spell/screen in ability_master.spell_objects) - var/spell/S = screen.spell - if((!S.connected_button) || !statpanel(S.panel)) - continue //Not showing the noclothes spell - switch(S.charge_type) - if(Sp_RECHARGE) - statpanel(S.panel,"[S.charge_counter/10.0]/[S.charge_max/10]",S.connected_button) - if(Sp_CHARGES) - statpanel(S.panel,"[S.charge_counter]/[S.charge_max]",S.connected_button) - if(Sp_HOLDVAR) - statpanel(S.panel,"[S.holder_var_type] [S.holder_var_amount]",S.connected_button) + if(. && istype(hud_used)) + hud_used.refresh_stat_panel() /proc/restore_spells(var/mob/H) if(H.mind && H.mind.learned_spells) @@ -27,11 +17,14 @@ for(var/spell/spell_to_add in spells) H.add_spell(spell_to_add) - H.ability_master.update_abilities(0,H) + var/obj/screen/ability_master/ability_master = H.get_hud_element(/decl/hud_element/ability_master) + if(ability_master) + ability_master.update_abilities(0,H) /mob/proc/add_spell(var/spell/spell_to_add, var/spell_base = "wiz_spell_ready") + var/obj/screen/ability_master/ability_master = get_hud_element(/decl/hud_element/ability_master) if(!ability_master) - ability_master = new() + return spell_to_add.holder = src if(mind) if(!mind.learned_spells) @@ -46,6 +39,7 @@ if(mind) mind.learned_spells -= spell_to_remove + var/obj/screen/ability_master/ability_master = get_hud_element(/decl/hud_element/ability_master) if (ability_master) ability_master.remove_ability(ability_master.get_ability_by_spell(spell_to_remove)) return 1 @@ -53,8 +47,6 @@ /mob/proc/silence_spells(var/amount = 0) if(amount < 0) return - - if(!ability_master) - return - - ability_master.silence_spells(amount) \ No newline at end of file + var/obj/screen/ability_master/ability_master = get_hud_element(/decl/hud_element/ability_master) + if(ability_master) + ability_master.silence_spells(amount) diff --git a/code/modules/spells/targeted/equip/burning_touch.dm b/code/modules/spells/targeted/equip/burning_touch.dm index b7e9c9dbdb9..c6227d6b246 100644 --- a/code/modules/spells/targeted/equip/burning_touch.dm +++ b/code/modules/spells/targeted/equip/burning_touch.dm @@ -16,7 +16,7 @@ /obj/item/flame/hands name = "Burning Hand" - icon = 'icons/mob/screen1.dmi' + icon = 'icons/mob/screen/grabs.dmi' icon_state = "grabbed+1" force = 10 damtype = BURN diff --git a/code/modules/supermatter/setup_supermatter.dm b/code/modules/supermatter/setup_supermatter.dm index e7dc912abb4..c1038f76a20 100644 --- a/code/modules/supermatter/setup_supermatter.dm +++ b/code/modules/supermatter/setup_supermatter.dm @@ -105,7 +105,7 @@ var/global/list/engine_setup_markers = list() invisibility = INVISIBILITY_ABSTRACT anchored = TRUE density = FALSE - icon = 'icons/mob/screen1.dmi' + icon = 'icons/mob/screen/crosses.dmi' icon_state = "x3" /obj/effect/engine_setup/Initialize() diff --git a/code/unit_tests/mob_tests.dm b/code/unit_tests/mob_tests.dm index 4c34523b3ec..d2503ab7763 100644 --- a/code/unit_tests/mob_tests.dm +++ b/code/unit_tests/mob_tests.dm @@ -252,7 +252,7 @@ var/global/default_mobloc = null /datum/unit_test/robot_module_icons name = "MOB: Robot Modules Shall Have UI Icons" - var/icon_file = 'icons/mob/screen1_robot.dmi' + var/icon_file = 'icons/mob/screen/robot_modules.dmi' /datum/unit_test/robot_module_icons/start_test() var/failed = 0 diff --git a/icons/mob/screen_ai.dmi b/icons/mob/screen/ai.dmi similarity index 100% rename from icons/mob/screen_ai.dmi rename to icons/mob/screen/ai.dmi diff --git a/icons/mob/screen/arrow.dmi b/icons/mob/screen/arrow.dmi new file mode 100644 index 0000000000000000000000000000000000000000..af9ab119939a66b1bbe700f255381ff42c7a28f5 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^2|(Q4C0>+XczhDN3XE)M-oVu!zh!U67;^d;tf|AVqJO+k}Il*BCMWx@r z1Q&e#`b5iHSL@uF^T8WJ4K5l#c%*aQNAn~@QBUs<3*#W;%f?;`a~@4PGATqMSaahF zjr}p5-Nve$S4f;NfAYvj+v|)k>qg(kMJp{krz#}Ma> zl;M4n;z`q{sz{(q3OrpLLp(Z@6B-!Y*n}D471%H_Ffii6L=kDpsjaSo zCIVXmZ&y&zi@-Au4n;o1VZg;Rg*gla%!7Is2!FFwLQ=kEt v+rb6w$_vF@*;`(llxVxX-U1YBV`pHn^yNLqS9drLXg7nWtDnm{r-UW|rFMeV literal 0 HcmV?d00001 diff --git a/icons/mob/screen/condition.dmi b/icons/mob/screen/condition.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b602ea27580c89dcfc3720f4d8407ffeda731306 GIT binary patch literal 8769 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 bfGD}Uku$ea%uZdj)c|!BZRJ`;tFZq8!PVpT literal 0 HcmV?d00001 diff --git a/icons/mob/screen/construct.dmi b/icons/mob/screen/construct.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5c7193ccd1b5ec3c8d78e0588516e790683f697f GIT binary patch literal 2562 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 Y0iaL359CEs5dZ)H07*qoM6N<$f&(G&ZU6uP literal 0 HcmV?d00001 diff --git a/icons/mob/screen/crosses.dmi b/icons/mob/screen/crosses.dmi new file mode 100644 index 0000000000000000000000000000000000000000..cc711a7a0c0196b4bdd3f736f506bae2127678d6 GIT binary patch literal 533 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 GtN$Nr;EB@! literal 0 HcmV?d00001 diff --git a/icons/mob/screen_full.dmi b/icons/mob/screen/full.dmi similarity index 100% rename from icons/mob/screen_full.dmi rename to icons/mob/screen/full.dmi diff --git a/icons/mob/screen/grabs.dmi b/icons/mob/screen/grabs.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4058c78bef385604a5dd4b4eaf09b00d3658de0b GIT binary patch literal 9167 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 literal 0 HcmV?d00001 diff --git a/icons/mob/screen/health_construct_artificer.dmi b/icons/mob/screen/health_construct_artificer.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ea86c13574d079ddc92331c27265936b3d8ccf63 GIT binary patch literal 2107 zcmYL~dpy(oAIHBUa%q}Q#hOb+C%U*yF=U(jQs%fjNkc`tY(v>%7t{|K$>pTZ5Q!Dx z*9AG#Tt{*!iV7R%F1C@M%Vzt{`RDxcdA&aG$K&((y#9DUKkrYfr-$oyHHaDj0Nc@S zPF`}S$rpB;qFl#H?#9Ut=Xu)4xv{ZPz7?X5jX0S1I9fJ3TSZ1jA`l1+24i7i0R#gk z!GKpV5R3!>Cg9ElvY7yr000euZv#-;05nj5Di_;ASNq`oK(Nwg2Gb5;ssP{RM;w3# zWk3c1@(3stYObq$QcH`k+G8ZoQ;6~M@CJ~RUoXjvf?GZTF-{kw!=f(ZV=m*a0|1fX z?T3%LvGUU!FIpZqaX)I(-PPk=?Q8Z4HZpdk=d|&AAc~$|XASd$^}$XVFvhZ4vwRG^ zjSn0*FEeaGrl!G+UNN-~g?6+(^vlWnQ!V7lGnk=QKKTADJ=G`Np~S}f$1JS?gZ>*` zp>*eNhHCvmSmGmkjG03h!);I7RPN-#QLplfk=dy&87F|=TCzn^YHkn!D1Ssdp?o3| zhVxRR7&becKUJ%?ck5N>zhOvZR;96Tlw9cH4FBbNFP#?DkbC*lqO!|DO7w$iLen*l zQTbd|k2+=_W9VV^BGlpR=(#&9@bl-CK%ci1AYPCLZMc=B0XX*siD%0lbR2XZ1Hx#C z+v z{S~K?CqIUy5JvjC2K((k776_{9xE;*lbdbLX`s)Fx@v;Bf<)t5vt|TEvJ=ykbJo+N zEXP*8b0#M$90kuG)5<&OA{<916ErTRoH569~j;(@N!u{%Dv(O`G~u2C`=5|9$v=kW=UK^vmLW=MknBgYaXF#VPNhM zYr<1Ab3ZGy7_|`#oh=%vtrfsOJ2nXx?D5Rx#3xc$jU^fK@rYScXm?@gXLd6EPs(DZ==6Cz+ScwK>oX7E5dn1$j4T3n)5F)t z6pm=SD(a^Z)j1qD^9<~WH&|e&qF9(l6u`Aty;@az29&K8?}s1atT7|N5 zV2z{wRzF3~l5sV}tN@eng(eCG3r+H3aNT#!UbLcDCM&k}onri3B6%L;$X0?rtv8dL zR}*^EU<{X2tA+ZbD1~PtFibq+2xfb8-IWGY0vP^N5$iv%x$Om~9mXAvIS@*i$iH*l z=}0B3HsY(oGfYj$QZgiB{F8g7GKBOqt31I)uVMTuz*cWm==#uFOw?V-_EK3r2Y_-M zdv)94(;W#>ZuNX?m6LE!5IUBjp|svv_9AsIW5=~GlG4wRsrqO}hAlrRHlvS#W6X6E z$okfoJ4G_Md2^d@f!1#emDO^6g(XL#Yd%={X_xsk_d8belVd1^)~OBOaMKl z7PbLglmM07ya!yDgL%7ko+n2-R(&F777|}0CI4^3_H41S&pTpwEo;kw!&H5ylbeS5Gm%PN;#Bo`0!hZMwUydr{xP9LqO>EQp%2n2o;`I=_&1zIg zv=lx`scKpl;FAiSdZUF9oRr9Vhd zX?sI0ltVV!)VW7}I3*xHdw{d#2kqbZ3lh;1g);&jjAuxJyf*KxN?{*vlW(F##; z!@mh#`=+pk0(u$Fah~^fAxP%Yo<^wL+di{uvA|PUgU#`#zBROn!Z|al$N0HYa;0!0 z>K%{Wv+G?@!mpZpH^f1sA8ruUp5Gpp>Rwv(U9*dOH7BJ62H#K4F}4+%uK7vW6n*O* z6GtmI#EmrvB`sq0Xa#~q?~OpHJszq^rNc>czrIdR{nZN zA>UGNu7Xv>8x3~9zd!Ss6Z_;lZwY3STw;>}uN2lNL{jzBqtC%T+QqB_*)3|7DMa#6 zq+KpaNfItf?fchIDyBaKd6no@&DE~6Py45 literal 0 HcmV?d00001 diff --git a/icons/mob/screen/health_construct_harvester.dmi b/icons/mob/screen/health_construct_harvester.dmi new file mode 100644 index 0000000000000000000000000000000000000000..0e6796a431c823f345463fd7682c5c195f02bfab GIT binary patch literal 1845 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 literal 0 HcmV?d00001 diff --git a/icons/mob/screen/health_robot.dmi b/icons/mob/screen/health_robot.dmi new file mode 100644 index 0000000000000000000000000000000000000000..95e64ec6b2de3a845f1d0395925501030b75a0bd GIT binary patch literal 4009 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 P00000NkvXXu0mjf8WL_` literal 0 HcmV?d00001 diff --git a/icons/mob/screen/intent.dmi b/icons/mob/screen/intent.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7f38d756a1416552c7545a563846d021f98e46a9 GIT binary patch literal 1305 zcma)6`%}_+6#W3cGE8%=j8L@9sH7;c#33OCO=A^N%gjnE47HL(duYfvU!g=cXpWj1 z+P3WsC9;*WR>mT(n$3zvrDcI;`KU1~T({U@asPt-;hb~tx#!OP?Upbj!<-yZjsO6s z@EtUkRjKoEKv=o1_1p)mh?$I7x=N*TfB=aS8W>6ffsn!?)9Qx$hqSVO3n)gABgmi< z4VrDNaZVN#!U~N_jsjT|qRUcTrRC}kMf6omD2WsrLK@O)hn{N#wr-HtiP%XjHjDLB zSy@Ixf>d+?;&Y%B00Cf`mRV%7ls&*QhEs~H4x-g+`ujh!GLAg)2o^_JGU_Vr2k48OAAh+|&?^5M)DjV4_3dBWv1#3%)w?RH zt~e%Nll|D^7wPwC^{(uk=!33`G{Q`k?51IA9RAlzkguXI9mijK3;;qFPTL+EUv#}v ze6kVmQgo=hEx0Iux{66jm+wEhI98D!g|^ za`59k_buhTj>9ugnyENs3@B_^;X?OR^$x&ykjlot&@MvHb#Uxm;W80}Ke_$any$(tsXd1JUr_(#iA}R3sA#&AA1gpjJg2C0{5OdM(Xvre3{f zkpqk_53q>znjWQNVpxRjK^S$JiwSaxwQX8;9j*YF|Bz>C5-kPKE)0FG~TsUs-DB##LzaHr$DP z^MgK~$68mXWg-s=5l#*~MjRL!HFI%47)NiN-RN%UhYfy)(sJEFIO1TvO01&wXPft&ai;JkJtH;R715?WaOS!14smIF4 z6Uze;xdH$H0LRD5sHv;R%E+jzsBv<1G&D4Eba7KuR#R3}1539Ow*!7&3IkHe6UYNI zGcy88wh^`hNJvOWM@LCXNfC!22mk;80d!JMQvg8b*k%9#0CIX%Sad{Xb7OL8aCB*J zZU6vyoKseCa&`CgQ*iP1W(9H!!S%;)p1xi4a>6X4$NyvC%oDQhGpBfWmFB= zaa{+ib>jKHM_PJd2LV522j|1nQSH#xIUmJw!$C7OEeMhz(D<$7!*Jwcg${fa#eOS- zt|j9HUI?9?^Z8+#x)YVo=SNxQPa6iNo{TRp6P*vh&J`8>>{_Z5?}iC}e%o4O&L@CB z?4Qy$-_&9MjP-b4d6EmBQXJkbI=pbm1Qc25a zQGAs*`1ipNu>BLPbwuHzJ(uma;^EQCi%j1cAX$vspqHRgM;Y`JG#x4nm4k*382qLB Y2Hn^v5REe+iU0rr07*qoM6N<$g2?w+N&o-= literal 0 HcmV?d00001 diff --git a/icons/mob/screen/midnight.dmi b/icons/mob/screen/midnight.dmi index 01dbd6c64791c84be343032eee1a1b7a51934e20..5f0926e552859c1129cb95c0c2e5739520bbee5d 100644 GIT binary patch literal 21293 zcma%?RahKN6sBF2NHB1PKfl2o~H45ZocS5AGJ6;4T4zYnb5f?rtI23^p(f z%fGwN?q2RiUvzg>_37@aQ|CSPRg|iV904vBE(!_?!6$hcbrcj-`sV`$fc1QZgtw~s z`J~rJQ`b$#!qx1XjkBALlOqa>S9WTeq+%Z*Fl=(wSnZ0Z#^;(b8t_;0f@a2}nKFy@ zU1s}MtI|9822gn`=`HJ- zhuslMw^4L5?m?z|LD9GmN%HCYN>b1J+-2>_g~Ua7-hPXysH@*`ry!p{X~C+&?VsuR zPfk4r-R_mR=Ta49UBJy7gP%uyP7E>1H&(MzUlvV<#ZaDT*C$6u#la)DFCJ+NNM|bMxo{A^fdEa`}0AuFWU#Ta1}-dg<=_WDj+>WVm^sv&jV%bvCBJthZ75PcMmHa z9d|8vou+Q{#E{CGk;(rDId7M?`wRN0%TAp9zc>7c$#P}1@#2nZJP4KgMFs@A7872AZhj24v zd8wngrLQ9%arV^qm-%t1?2PeFshYjO_ApQAOW8HAr(9NBrzpmNfWe?cA{Wnu~rdwLu$HNAwBd&%|`%=a3%p zf_BL6$(u@m#!)vbGc(9dy@BTQKpOEkxU@fb=snnncri5b9|e9IjzZ}~15~-$l+_GU62RmQ(fiS(KSC*Z zEN8#@z*A*sk$&3^#Hej``75Q@KMhkoZ>pZp>_Cw|mYa|MHEV^wnh>H;c8S8=t&Xq z9oA+NDKM6;HYx=|NfN_MmgY~gU!jr31ro~1z>k^HzS&AP1(EGNdIn_WNRS|KKIMs( zDq!sWL}h@2=1k}F5jUtV$h3Xa9^+YoL8Af%#{7frxMC-B0`_it0gNn$_e5`$7dJX^ zvqbdir^vyjx!UhtK@4~ix677uVO3lo0Nzf|P6i|-mHkD@Lyjy%5<*2+g9eV4=^HSIzt7;VJ)BcmdQmh2!J584TT2wEOd{X7q0WS84fh)Zh0TGrU7ld>

Sr@3|%H>uYqVnN__JwF_jp(LF#tr1uZy%N2F$-T+ z@}ud#*5g%2&3Z+3>>Brlfj;cDFy_Q6;P3fuSSE2+PL2f?VH4eyl8bRtQl<>(jGMiX z?u&}BrSO$5k+6FFn3hfp@y+5WLNRQ|L2Qs;9NupJ#;sIYrz2B zydE=)mCyotpR)Wc*7Y4o`XxQ6(mjG#6S8}O_C{KYj1JRmKy~`5am?n`+^*4^N4k>8 zr@=R9QjmmzH-SE_r`MenlaEb)2u?wY*`z%7)V8 zsASjZVYtnXd)7Jb*5<*54Id(&sKmWs5kuI<0k1@MalVZ=(S40P8@RftIfjW@|m1u1^4VPDFWnimftj+PrK*9;&j zJdFlzWNNAVQSXYs)v?G~(e$`C$=jNvAG=r$vly=Xi3P2mwK1(T>Fs{9N?mk}wrJ3T zwfP5cL{i?{utwYYw5$=)8Vji_tYbeJu=mq=GU0c5X0!qm03$c8x9b;#HK-imEkr)5 zjzcn)mX`kzJdUq?_knOIT7uCq+|vFITV3&2Yha!aN6mNFiH`8s47S;TcrJKmAV0?3 ziferQP6kA0)T8Ob-uf{dpN6>0%F_Ckf3I3gkx6xRHPVxx8Lgh#KI6_4Ub6Uyv-S); z)kDLjt~kVfGLySFf7yqzT)(d#xv0C*tJ$5O>`md|T&E=axOE7T$-V1DM1phMkWK7Kr}hjljy45B}rsbis$s5?Ga6 z2J+dFi=8x=!~A3FPQFKj%=U(KsS2|XW}2wguo6^EX@-S3<&c`OceXk6Z8%fx-({|r z-oKkjDKG|Yc)MI;NQZ#r-aP|a09Rp6zK{GOu(`eJ7r>?=USU4df+fI5GjuY*cn=EHWbtFi zN7cKK3)G!zoR`$TEPjg)y6b#j_3+#L``G!W4jG*)$IB6q>Uw}Y2@rUTx{m<-0~SxV zeFSMJS-W7lZd394n~yr4rZ0=Ug=J2E{}x)#FfAlMV|L%@=O$+S)SXbra95^&dx8w1 z(vrT+N1J@Sm$a-?Lk&~5#560(F5IL$1i;t9HA~;PHP9jlh)MOLZ#nAd5|aX_ELk54 zLVQilPx}u>Oui~r%OJ;rs*1PKv6DPPg!1Pe4&XKG)U+}%pMMte*`W5scIV&g@I(EN z{JZw@0lzz{(7!is(!Ib`%H!u?ivs`Swr*#u)>-l-tSsPcPPC$XqWmFDZDS2)ks(Wx zSGJ^uWiCCWWf@8+wQ_lX;qdQ88^D9 z#)pUWu!FOHSr3Z~&nH%oe(yXzhx<&&-u8U|T;N>rzpbF7QgMva+_ba%V`PnVO_> z+-7PdnhYa8SDm^@ZoYpzm3d)7Qvb+FoBzlua?td$Ux#KqaxQ{QgBT{Vih1LPM0T2eTv90f}B)H0r# z?@aafU60s9i^}G|TS>tb3wh-<84D!_eNJ_@6@32ZSIds*H+?|-Wte#@TD@aPZ`c>r zmHO=UO%^ANoR3-37c>`|lG(J5<|O#z=OQB~?pAp*Lf199IyRB4Lc1B~3c5HLnz4}N zb$qErJ}szX+I#IEplURlpcCG~y&z@yt5+?FHu zjAbg`suP;aBRj}Xof$<8O&Zj9vJ^|$0K9a#wfcKlSyRJ%$6|8WdDnus^zR?MtV_!M zXB>H#v2!!C#zYv*Pzp~TP+qP9MyL^=jE3JHj|>4YPZ_yKLU?EO^zSCLbjWhYBnu)j~ji_RP}UN6Edu)=dqg(M4LssamJ|KMO2xLz_$x`X;Qe$>K=pRNs7mK-D8I zl&vG;QlE<~FL3dq-IlkXutI(nX68rKQD?~plOtR%Orx4l3fw7Ro=F#d8PTI}i5b?< zgAcVNL1@JF?OF;IS@iT5@3;uR%Yd39=>L9r+O0j;%FE7U)AgKwN_n4^86rcC&q23P zGH!T_j!Fr4eWGC0KR_S7uv+Ba8}tV|_b^N(_bgA9cOERq9+lr~VqG$Fh}acX%=@ z=F3}$3@YX#8?BY0IMxb@;c5*(*_am~PM z#vqTJ-#7lGXm9CVf|yT*umXV-sLoWAWtubI8HCrLp6{Nwurya)sUuesA%N z{e&bNm8PTwH;bE+xP0h{XTD@R5-@XuU+Sq>%|6=bWqIx`}MiB!9 zQO=l;84bT$_8Gw!BQTszPa&5z|HeokX;54*MRHmf4}fEPhqshAF(nOUe};N^X8X4l zCYn4HlvW|2C51{(U2E3M!knX0f1Yqn4+PY$!%12G%rIca^s&|IV9fopEedmQnXCZKr znKylcd%++M6g4z+x5Jo9A+q8d;MAWIgHK{zC_yGdTF~L0Hx0*ZI2dGqt_XU63?Egk zp1eX8Xu1LMy$lC(80!z-FIJa%oB`Q`5`hG|ri+&W%ySr@Dnng(588Qpzu;)TKiZRPrl2Q1+Y&Mn-INTQVG2ZoLR~ti0SoY zn`0NlZ^m?h8G8cCAJ-Iz{#@uc!#?1~k~f!Gz2_b8>oYA4{l$efxsFkUEp2}Adr{Mq zuDo^s*qGKlE5PTT)UByDwBmSoYQ7mwRn5z^=}z=s&{$FbzT?RExNKg**ldW=Z06}; z+wa@KHO0L8o>L(K7mW>A^DXLZQPGshlwEgh^L+9y*W`V;R?zp+;sqc`agaXJr2-9C z2tShvIbmxNE1$)qh_&0$ySP3PJ3V(qbYS*l{VDvo#oi#02sZ0Z@Y6K>@B(jDtl}v$ zKtHRaEz9&NSNzWL2067tu!g19KZjYdeJ?2)4+M&!Oy7Xhf}1`36V}6)5j}s8=gDUN zjlDdH!48pJBwxzhSNkT{crQ8LG+)1)kV;S;Eyd~ae#&HJ30B`@MnYM`*7$P3()64J zcK9(s#`n?-|9hQmqySL{H7&2cz@;pi6oK;CORqSvy;=e04rhAp8Me9!bPmV4$M|(H zQehbTA%K(rh=f|1S&DD3J`Lwn>?VLLP-l~B-K6%YME=UH+gBkqZ(eStlyA)y#Vv1X zsy%LQ2!e-hCuBZ~j*7ORXXan!i!t|s)O@|BxjCTHt5j+B;v~b;!!eeuCqo}W@Ids+Colc^s@a`! z${rP0P>}h{4UsuOWQ%hvR+Xmz!rLNnn1Gbb15~%p)lfHuPLWi%m@jCM8S6T|z?+8B8uKVv9l#m`r)kF=9x#c$)8nc5-YA_tsC{@;o z;J4zD;4{~$1XX9AQkPwwH>EZcZbJGI?WTW+7&XK+$e>y*eFWo_WyOB9b%EG#k0|V&Ixc_%+5SW8#pq?L_`xJ=g82gy6l0h z@wBF{fxo6G-Wt7e7Z|Bw*pZZ#!4g@1w7gHcMBYs^O?7<(zJS0)CxJj2W6jh*1jS~* z=tM-Y^enQ(KVVsH4AGg|N_g^1Dn@qC9K7hPXy12|0a>O)4@l6JaXv}_ZtSMiUJBRV9l8%1F7zJZB~%t9tjVtE zV~jA6ZG9Y|YT7T&r zHNj+$%23OXlfO0x4jb_`36*o%lOae`q8lnsFD^lB)J{+Itn8SQz(!Wq*YrK%9!7p@1a0!y#G!nh=V~fp}YO_onXZq>o#FA z&k*pvHfMhP_>uGkR*D7AhyX0SAUD%=;>d+U+r^O!cMXSIBv_4n9rs6q%yE(G>u|9{ zxiVU&c(E=lw#G69zsiyNi7B>6FIpxl){0x-ZNr%k=sW=a<_TA{;Dgzv3Eynv z$$Ep2yS89e9l8xM{>OZ)Q`-!&Z#4Jea`c(;4X_$5 zX-#Ung><}FT5ZM49?_fK*jMVwoI*rm8l-%I&fj$z zAJ9DVVX5%X+VLkj70*2F_rrnrO1{XQnzjs`wj zdG_&U&rC{9dBu*6o4Fa8;F`{IETKf-k9qVD@5 zxJ?%1vy(n|hF3$M?DRW(f7u zjn^|I_#r8FY)FyxdP;A6mU0O$l&7^E56G;bb)7ZSbIY**%rC2XrULMzD;^bxvn|_o z1VSbJ)@AD&=PyXNt=qm$Qhh0#^lhU0;1B&!8rrw1vauZ+NW}T2C*sttpN^AQ+SGoI zm%pdb+NZZckFtj<{QF7#FP2+`OjO-(lBTpOa8H5x=tu4?wWCF@24L8jBR4-v*DqUYZFeF@vkva2lg( ziM^+Z8SF>D2Z43?zg2~UF_;Bh_{Q5AcFbj)(b2W$j$p5`QRg}lWIqEV!E5;k`!V1N z4n+2`P}9 zea|Yd55{=fpT?b7V*jJcdBY}^;|&T#)?pP3`-2ySG?HDDf>I7nCwii+P_ymk2t@P)j?;AwpS zjH4tot2O7o(wpbZe}iODke7o;zg|96TjX<6H&dGhVWJt}IL`kyr>pQuq*F`O3)m39 zdzB5jF?=cf^!9g4qVUf3*SGQ*duzCR1$o_yPN8XCH9h6!9}7R1=vo_+r;DC1KoC%g zKZHo61fM{PH-rfzwEIyN9vTvNj})5Q61>f4>`W;>oZWIqI7NZ&cV-;A;u~LFzwIw_ zk}o}10x1(V-gxrM3dlhwmQHxf14cHRj{TW|u}8kruIP~u43EhDdQWEBiMs$9NL(W5 zL!YhB!fh`pkRwmp=^TqwA~CWu_B;i*9Dru~azkn75)**od(@(`>KH-wEZvwTG;AmP z8sX0Dc72*hpWuIZ-u8|`g$P*4V+21k^+MAfx9J~j)hsypGL=;^{~Kvp8kzRu+`Vl( zLk8psXM%2zM94vmbmw}LgoM-tii?-yV>3R6*ggMX%}T_`mQQ$>k4_C1%WM1b;MHFk zdh)j6J&m&u^XmJDLxZ@e1$o%1s*_Vxe;~_8@9FCYPqg8Ko>5}YOSX~V@C7Vgul=K_ z*(qUxd>yfILwGT|P2?+y{uwh*f=$;AhuiL52?RNkb?HN|D=p_U6BH2rG(;sQ2suX~ z1%5RtIhLp%|DZ(ldi=+51w~69nRulBzQixqVx~N>RFY$`thtS?tq^;m%8H^&ozISq zxu(MUp|PaMBxPviM{92RH(}_R?6jG>VN*f^_%0Sih0#*1n*qzPa)BfC9wv_5=826? zUlK}lO?v^Qd+^#lI0Xeqj!G8{Ii7xFO?%YjjDk9rLt~Z7-zRm4vE-|Ae&3`Osx&B0 zUzKyD_uI?`f}(G5Z`$uJ^gXQQMq~}~g^^weLG;L%mjHZGUQn0X>`O~l#HeqWZMunj zf>J8W)aVoHOy2C=S$aDsK4-NI*EG|XDAU%;mXgDjHYtgQ3he@4mY8X+xOjfro z^SCX>m~{}9F1tzWQ>am`q0w&2gthnw9x;$2UKo-oJyF9q_q7B^qznk|;N-6A`QEH! z^3Di|YE$_=ZYf#;kOVBG4=dEBVQ}S4(7MkhL$x-TjxZM8M9Z9$ z)L4jPDtu&A?tMSySRJn0O$>+0Xve?oQD_4q(Um@a!v6Rm=d{U(hdwP?$U zWgk48cOJ86X+0?_?D=wB{kw=A3=J{v@ei6f)35^%Kr?26%_({CkC_fymWF!pZwjNL z!J--Ho28`lbR>-xtHQm1}Ut2qzmPE6s zTt6N~v*G+jFt6rAs+;JjeD$~b4EAB?|0Lwj^*?w>R2%!eXXa-K9XXua_FS@lsiUj1 zmySDxhPoYzCfK@A;3!X{7s~UTK8VjYq02FN884IZmFmmzS<4HL-hab5uM&*N9>qWI z@AjdY3MhrQt1=86nnVc-#>ytt9U5f$HXLE6P7*s{c+D|V+5LJS>m(?3uz*(dgu0K5 zd$~h$EDKO?oS##K5nGQipv(UPl+mNbw^oQ|Bm326{Z8M-v}y_jiPWGyKC#n za94l$x6y+j)#y1r4dLR&yR>lvs$xA}2#YJ?!IXx#HXoee)`H7Uc|HQZd7MRG+2tAO zsWIj{;8gM@#NH}{6}@cr6X_tnjF3Mzv;=hz3N`9G^19aZ-sXsF+O}pr8Mv-qtfjIQ zm<*r$JnHmw1!oN;6UD~LLMy@N1}S(8T`S^e<9lb?hz@}Cp`agpulkar)Ct*r}23Tj5C8XtM` z2O_JYFI05NeVJ2b1By4YZ;+X-R;ScF4E*O^rOkOAnPZ*Rqj5%mGt=sR1|PUW!fV#E zu2U(khFYp2k#Gj9TS!5Bbs!Duw!M`LmYZ7Px?q=BuMmdj>3HvNM$O`nETLqIv_FOu zq_Xs2X2K*{qQwNa^Zfi{lt%V94LMCfe=0-(43mN+`yu%-kUdQTMNW;!o9bo*<=#6D z+Fp?Dd}Vc&xyQeZhVumb4V=qrc;wm4(E8xDTsfp$=kN+MD0O zrTLtayPrI?5Yq1z7;t_LwK{nAM2eCqUxkamzmaF%wcm^3q|;O?_XD1$Ql)dB3y;)> zaL~y}A=;<&25Wh{9@}lx0O+SL;uA>SLsfGH>a{C_eToNP#e!7@t!^+}t1TovXG;d4}?OU_}p- zYxMb`3wouvFiZh<_LSJ`e$NTIfR6+>wakMzXX709WOTX2L zB5_<~hUC^-q1$~algFRf-3c;;(PAr89VsjUk%ZN|>={Y1BM}cVi5HXyqR`R*%vZgUs}@YJ-wd*!WvnJu9akXxOK>S|u9ac}&Qs3euN$}68V z(38rll0$fOGAURG0C)sexZ!`T^A@}h8?kyF9$n5>lb??dL3R<}j$o>raC%R0&J1)?eKF6&GZVhflEHZ)JIX ziY9;Jjh;ci*7)nTSY7^kHUHDT69mc>tH?J}TIx(^jdLHKnhZICEQx*BTe-HI>9Bnt z@jO4C-%;zdq-SmV@C2?sVQ;MkU)^7efIx+WfV>3#yTCD^Dhn5eNQH~>QD=;At~(6( ztNPaK&!hZVnTIaJ+5?a z%a}7U((Jygogy?&a{MT!8Lttx9iH7s~f+DVL)=x}wPX*cGQuFckNN-6W@F7W?!1t%f(;@ zV7IU3s6aNDbkCRslRj0|eN^)Kfr>sCih10pxshO1xF+6xRMj+RHAY+*&vV`Hf&1`? zwH{W9`z*sdh1XIkvr6z!$nTInV?8885!6MjR?d*pjs#ntxoZCCuA?axWFdch_gwF} zgb~sk060XsaMzdDKBPzGT88L9?4w*AxFuIK z01~b;1U7sV7_kx~e{j5}f9mqwG(X>H-IkhHMDF<7wITZbe1#-ry zV18d?7eOe?g%ErG8kf0Cbs7=;Wk||$KPvHNHQrx8)>4=K&Noh$x2NWrKQw4zEi1bV z|9)%R#4WC02yqf7)m|Q%4}zcRntIIt)#YJaf^k&@bWqILegC?W0^xb)v%wEfQvVS0 z&%ZlrmSdBdG0D4Yw`cSdA8Gh<1^+*h@Twj+ZD>R+m8xO&mtWFZU_a+0ZW7ES+89|G zxAyqajDfps7un9`5ud8f9p7wyl!-ipjBQ2>^K>0vU}DnwukkuV3{3*~w3KVuwlJB z*?49D#k{06!03Bd@hlWK5P-&&!RwY@J-bx;-FHRdp26VQ^VgWD8G2Nrc=i?qqfMZl zmO4?NFfhk!3H<=ara1W_fnavcz z;*3mRIikV#I(b$%ey5cB=ywqh;9u+0TsMJaYJkISQdG)3egg)lPN%dk8jLOTlCI=V zpCEAd(7E{`*eA(Y2CY2w$Vm>-?-*eXKdDCGB_>KEwTEg+;k{Lh$$it0HJ*i_#^Q)1 zt}}G}wmKBQTYgQk0The>Mbu-}ghRYgTT&48HZSl^UL<8ET&x&jF+}%HPCPQYHMuS0 zb9u2EpT^tR05V5~>T^6hA*zD~Z1XCc2koN{vi6J^%^Je|v^$tn@AUC9`+rRgZH^qO zo$osxlI$Qn#qZ57WCQTvj$QDgi>uiLsVR%LXOY=}w}fzshJ63W-p-F8T54W;y7ou$ zXDR)&*0yxRyZ2fw)aM{?w3p3jzu?urkTe?OQ*FS3hry`v69Krj+7U0x94ok?Qu*M5XkCjtM! zmVI?LA0vSNzO`kDHb36;Wyw@Ez=)*y8PWfXMR_mN$joG54~CRv(vn~3^Djo4_R@Zw zn;d?YXdr0RkegRve4g}p*$A(BAdwhry2yqS#P}ZMSR)VpbW1cBN{C;>XwVYCe7=(W zS$ync>&P->q_L`^+~=St>{KF=5;as)5t`CN_Thwb{PjZz)|L$q!Wi}8 zUb>ELjT+3Kf=}OIs^?Iqr*9)Q8>5i5o86SBt&5KU?CTuemh(FTr94Xa4?9|2ghS4g z?-3JG5&OUN6Lwk9q6Gv`7``2QZeGsJPED=h=KQcOq4}Vlq?Z3|w9vEBPw{zAX7Y}yebuKZK7crr9rC^cm~QrR(E}b2c5a3-Bzx(U%5*sR zd56;h0Nj(xq&H_vmjZ_V^U8^(?)0(`($2ng9KbkcCSi1_MX#0{8jb3zy(Ablv-OaIa;ATG#ES4UZ?P;i&eNeR*mB>NM0K*AFwGxdDSKS_e z`|R@X1};aOhpi__Bs%=Mee4&SjD`x;oZ?!oF?>Xdio?n-_HL1i%TQMzhx5_Ixf!3^ zs)Ff;q3SbBDY>G`X|}#b`)+mo93P%GL7fX}yCI}iv+zQe%Co@87A4y!fr(I;Z&-%r z`!MqsIf^Ux#-%x{4156L#$s}7V2^CQ#>h*IvK7CDGlG_I@3@T2Dr4WuuzvAXyT(O*9i#;Q zxFV-KEA?3|Ba)8(eZb1BH@mj)a_j!&!m63 z(x)zLEnBrnW|RAHWSY>KE<||KtA${4g#|Xo(h`l|q`Lfw_;$loS&Fbs+a!4US~YZ1 zfT-4P65ThhM0{y_vk3&AJ)t{0O8PvuHxUyjsa62kX>jHUA8Edbhyv>!*O{?$S{-u5h2lquqX5Y>q&RTlBel zgmxN4^VtRGr;Qq?(B%yEQbxE|AkI7XclFqsa}Xnc6ehds&c*3FuGT(r--mkLs{?_y z76|?u*>v?!g13d<<03PB{Ku+PQ|j>co@C7UE@I$4#e!WN9d5XaP~D#N51@R~}C?(^nn z=YE&^k{m8ti9+a!a@At}NQq$6_qz%+~bytmL= ztiallB^&r51AP_l)c=W)$0Kh;SzdOxp`Tmw``y9WynSZzO=GQN$&4zNuCmMac>jy2 z_vv=VVpvLXBe|>iYA}28cRw^(P^pBzArDTDmFRG{+Zs4somHt#hf3OJ2C{Gzb3Hw8 z4rquAEay5fzPGoz9igvM&{o;6VnfceO6;}pgT3d3FgDw7#Sa&01x0kcFABPKVxA}< zcUCKRcNLX$B^w(Ix;JznXf03Rp55WYWlW;bIjW`zVYX+}2pA@}9}@j6KGbad=h8>u z9nm+UQz7-|Eb|gw9yyv0`Qg|hl(wj^0)d(649ss$rV{QelSz*())Qg`k5P|HY=H@xI3c#`~-MH56>vwh^m#&%QUc7T$Y0Qk<=z>k0ybf@b z%?Ot;h`so&tx%qYXoKoO0?a&O^lEX~_|G;W370$Q>X`fma3v)+(b4Uj*jA;y-vFIa z^5xgYeoowSrEW|RY7W_eU3>jk6rD>>RfpLlPRvN2%k=@+S8uQReto{|kONQJDR13L z*&msib@p2x=gmF~1X?i?9C^990U23Y&?ZFEU|*kZ4bNU+_CzO^S<|3nrB$L9kD>pl zy9Fc6Z!j#KB>SDPsC&54;8b<1;*X(T*iZ`3FixP5FaBy$Yx7_=!txRl$8YCNR39jMY!<%#5P{l7zGSDa58 z-|@ZkXL1rcETR9UkQ~YQ>oV}n^{F8L#7t8>va%B-VTpJ;&I{1}vsvz^o$L9g^Ot8j zcC@fQ5oU@G#TZxOGKczwHP^K&g2YQkoWez7Au$Z} z4W4N|bY#zQpbW_4P&(a6k({v8=*AYIz?5I>e;P=7-O(y3?npG{PGL;h`Pel{p&T=E z*vZ*k51aHq8{I3DczhPwJ!L%ucGH9$nwk|bfsww{FW|<1RCm287W{MHGa~e-wtI&x zy>nSw17_&CS1Y3(AAm6xBLLc{4(r&I8#o3{EJ|u zFi|{|LLQS|0UUegH=RoSt#_0CiQpDV%|5Vc2NxAI{F6d^Ca(8aE|9CZ+;#Y4J@*n| zat5YKglD}{?U57_k0f*6PpdLrZGJc&)R!cGOD>`x0Vvl;$ZBc~BNm@`W9eTeY+#Gh zJ-&IFghHrE=k_c42L%9-BsVw(B>5`hgDWBup5NfkQq0?))+#CG2#=9JYQsj-wZaqw z%|@PWc(($UaO>#m+`^G%SUGaJo>b|Q%SvujAlAGh1HK;jV?D8_$A9wQk8E#g(2(Qi z*%um>uB#`jIzMd*R5({qwa|0|lv8yIN54LN^k6SP0|IZ3CEOm^wyCeqtMZ2XY47hL z_qR&$i#7=ruD~|(UxDsG)gYD6dBHU|seJGJY1&t`e;@=g@O#Ux+0Fcm&s=ZD3pU#idkj^Iu=_A*A&aI|fgre8wHr=n2ml$U_jnFH~vb0TVyz;&Hmt^$iZOyqQ zP{{V~6M62#vP1(+4*8I7dh&EBJCJ7#Q$YUN;`nyraQkPH?jAK;*c;=O{~n+NnabVL z{TM+PI>7wrLl6O<+p_XSf^S!Uz|%09G5A@QG2C?m8B;j~PTj-iMF-02H-{<+BN@0V z4a+97!Go`()do~nKE9g9xaw^;y(__={DfhyTwP6T0b>sj{`&%zAl^RI+z;o=Mneck z5zz0kBVk`QU!V}?x-1f&TBk%YwL+wq+5-uvtRnP+A_ zGi%MBz25AsnRnLJlcK*mxIA;l@F{8C$-L1pe(tdpwzN!V`7*h|NiC|kSCj;qCuSjJ z^Xe9LeLJle%#`=#5bYfou2}nm6MgtxN1G;IWKO71XO2cc*_=*Waq68NH(`hJsG{-y z%#vs2BEr>RI*enrQmX%Dvog2uv{})0ucX3dQ5#*-;WrGdu(P$65^@lCnKIZwW}@QP zoU;!Oe6Q0@d{{wOS+CxdFVYuEjiLDdRq0OqY=Z(g7gbqHk@?w2;-9?SpmeX|Cf7CI zr$enRPujAIW%8p8H;!$rdE~%QOzb^fkiIQP8-`seJKui9VWXv1zxw0DFYdCL;7|F| z15YG82g*ArSI@EN{5X}iR@Ot!rhyzVN^?O-_>n2Qa|p?k z4CNY330E&ra(vB_+*KhPA*?^(0t*N@{;|if_s6=D+P*GLtLUe{>M2ujy0O%q@9*-f za;X@UqUxu^5A=PQ5^bJil%SA{!hK4Kri4BI{>99f-ZCfSck^y)f%F9E3EVzrXk99@ z@p<3j-rShDdI876)i<(F--oHw6_t-8ek~%Fz*V8&5t6%oQxau77fJd;k9*(nRtYj& z){cJgjzEoy6}hM#kDvx9!Y<#=8RNPYCi2kpR<0{(Sr2dOnLS!kAp0Wk!{x1@Zt7{N z#<>qG9L@91rs4_6`ZVNv{he4@(G?Q{iy2K$)zSPCeY3xOaQ?eZQFASSSx^^K{-r}> z#BBB`zV5y8m5a&V+d424gpCNK`*3l~Gh==vx?f}W1y`u}CY_wL*2N? zr$y2C9kUz^Pm&cjl3R**d-a%qrwTRAR3Qyaw=g@kbpm!<$A$KuGb1lpU*CgP;C}?@SUemM>ov2_Y)N|O+4 z;I!Uk_i95J!u_FQB{M&}jvIU$B@UuuiT-4aiO)rf`n zXd_fDU5tqgk*mg;3$h&t51a!oeBlwBk&>gmZ=(=yD#Go~q1wL)_D+p4<4qrmj7noB0Y8B&U8$SY;3evbNGi`r+VI?9{k=X6;2vq z5a8vo3Gasjr=P}Nhm_X?8%8vB_qzpGIzJt zHKn7_`QaTEuHbLwD3+zocjNGAtQ5G4Yhz=h>QAsat99l!>=!a(EH2<@1DjEUDG&jQ zyu7P+5F9Lz@}#TR@M=*;RMa{>rF|-IKX6jKe8rBa>YK!b8;bfyzoRMXfiz;4dKpJ)n^_tEyYkW0X5tlD$9 zhlvGp^GB^s82Md<$!`u!9B$%^O0QB*a7ScY(CR|9-B&<7T=>|iAS_88&V%R^jbi-@ z#X;pTx|QA#4hi(#aqZ)jWlxvume2_8SEisnuZ-V8p3x~rkY`qqITs>a?UjQxt=(6p zu;%Szf`EfQb!soqanh7r8=Bsxogg3a|;$;vXN!U zJXMT9?qjmOi3+4$I+?uILK@n|!%@8=cJu=xV1ity;k+z&I-yn7lrn6mAsDrkSYKRYgLo?0m%~-<68Vbl_|4itw z{lg2M5-2-bCb|}UbVNUVH4Po-YN}cnv}ek!lp^*2!j6C3Ur$tJt|3LBnbHd%v$Obj z*m}vI!EMga#__tQ_h_%FQt}Qg(dgE&A}+oYK~^{?u8BlJ?}tn&_E^I!%+7nCk3#HR zmA^kqdYazS^0PsUawnm>8;-`7xYvgJHkMdwa4c!xxHc}+$@|f8W*&DY5;M((Uznc3 zRFlr|t;RWUo{D5E81|krR7JrD)LAC&nc6qJ_&mTr0-0vZ=i@T zPCnG!r(`4heuzH4OR1oj-rt_v_WahsTrg*C1^ZOz#>vHwPe&B7TB&=^=G+jSfI<(l z%h`!w9^H)sx}O5d0Ott01E+1`f3;1|pDJ1i*LNoknC6SgqL$bFBz?%yxxZ^~7PeB|ZjwU-=}NKEWoo$JWhF;7;BE^~eX+6eBxvkqK4 z!d2(Kw#olJJ9E&w?w={|SySxrwxK7{UNJsiUNOFkJr^Y!yP9~Em7BYJ-l$rq+tKOd zis|{!Wi~Xa1xWGGO&?+4fSC2P_r~2BTaiv(l+_A$9tY0^Qn+xs%!>X>6H?w$fRW8u z;!qJyH*D_>+TqIt{yI-M=kT*m8A$lU?_mm0>K5PT4Lz_3y5v?w(aE_ba#f&X_&-m{ z$#+Uj5)xr9vk-1Fsi6Oahx1rH;Mo>SEu?@;5MDJ9yQDydAx~(-#{)(ByJ&PejA0 zK`#C05cuEg(X9%lEA@>A!h|F9>c8G!Q^3JL5`QvsGa1N=F-qVa0Odh_xFR%Hs2=B8 z$e#c^4`5Q`y7o(6VqUo=l+kr7lEZLNHFH=GXp}+pW!V|YovePV0aoeXYJfR1>VHct zvmpA%-Nwd@I36MnM3C_QSu~)jC^5@SW@t>B(TiUqHL`@5!I(-yIAfdxME}QBc9i4D z7YV>XW%zxb#D!)*yu^nz0NMZBnk3`5;2-7r_%cR|p^ zm#?@U)G!0*wAiy`BNj>1pdeMvy7oO+->tbg$oKutuNhfWh`qske#8JXnr`7^t;Am{ z64KOdw@2mz9+<=8Z7eO=frtvyd1nPyGQo6?gGY|JJKV)m=4rC?q!Z*N0| z`%79oQJ!`C%agtMn4}%@#jR33BnFdTs`pWO6phVT`*K|La^d4(#Y_vDZkMi|HAhY+ zy(O!Yk2d#Iz%P+}8OMd)iKWZtBbFpho?Kj`IOIr6zwb@VwYuut3#V?k)Co^G0MDjh zR9E-sgnz~>Q?p`+(koC;G}7C95{(ru?8iUr5(4`TW3X{>Rgt#R%g(JKU6!<$XFc3q zaxi`*L5e^h(T!?N2t{?^AL9qAM6!qR22Mfdsp0^m-0)Snu93^ZbGsuy?)1|pjap9< z!fP%*pZWl~)<%HkEXhL=*3*5drQ%H0J3Eplx|Ze}hj7ATkP@>Odd83Bkb}*u=^Hi^ z7mEY-Geqv9Y@04oqx|JOJpxC@ugS1i2$^8HP1^)!Ag9%r6ppxSE><}qYlbH{P>l?A z#zb>jaFZOI2V_rZwxsoKgechonU=0m4tI)Kra7~?!ld!{(Bub!%4Llqb+ZG4WX<66 zsVj{XV_8fF)?x1Xpz}$TrusHe$&_^%GjM7 z8GX?7ptsh)&+Y-?l3qF$a2u>&(-!~uF)pf3H$kXPt`b6A^?Af_uwcN!E)+)tRqUCj zz)fqd3sx&mR*Co?zfdzvp*R2Ws6=9Ryb}UjR2h|`F_KT|Jl34l4f%i zkNEzS*M3K#&4gTPt}31J{kq}ZsCX_%jJo^SaM0*qZiR6h!(80VLn!tAIQQCUV!Mm0 ztDam>lfCGCYLz^IuD4_bAC~BAL+$OXp`H~NAe8aaQ0C=$^a3JixV)VR;5Q$uqn+K} z(Xs!vC`q#aFO_~=i-vt^!E-IAOk($);75ff4fs+%)?vi?R;y6oYJC3_qVDTVd?J>F zR5I!7GE(yE!GG^G-iT7d0~>xeG-Gmz40dA2<)@>}0m|+|QDvo!ZH~HtCG%11;nL3Q z@E>Jr00jg(LOZF}FDCh^elUn~O)n zf;iJ<8>>O8p9R5-U6h(j4_Klj+~A)Oof*l{zQ7nJAa*TCiD z2};&WW&W2>sd$lLdJc;K;j1q^dvw_RC?u-HU&*i*1Z z8xt*LQRRLbqc)X9&77IkdN@&YG}jWU0;#~#&#Lg*C4j5?{uuPeDUcNqG+vN9w8yXP zpBBy>banTg37=zXdPjDZ(7wGbrv)d&X>#e)wGO$>;3GOnEeYMjQh)jdkOq^<;HI%o J-F279{{w5-8OZs;rLxn@20e#+X<>~*iQpNZDiR3;*zBf!AGAW~IP(80jK%)S2r z9-xs!(OP2+46N-BdPW`!*6%Id?Oi?WU7Rs6d@{4XXlc<4lJ<@d7DcTs=E~+uU+RQ# z7j);5@21oql>hKK`hg<-TXZ6x!K=tQ@}8JSVrqPRTzD+Td)!v$IPj0mm^1Tn(fAbJ z(cvND@aC;xmZK*H71GF5gF|iKpm$w4idBs+J4=Hj78VkbHa)obNt1Y!Y(iAcCEU1k zi(S2+~brP)-Wj_V{oV)Ye7;?mpv3D=+_QA_V6SlkJ0izxYV6 zp@c=^a<)@BL{OW9Lr-=3o8z~zQ%1E0)6+}X8rI}dGNv8Q9Dc(y% zKjzqfhOhNK17ot-|FPr1GNWm;`?)zib-Imf|Cz_$XVv#Ti=+U2x%mT|Z`Z3G6K=`? zIEOv>R&D-4qc0imYqj@qo08v+wzSt1TzJ}ib>$eYIzCJ~^5-y=Bu^O-&h3Fw#`#oh z&UDChDHXS&+mUpP;~m*pGq*ZcfD1;5=|1->267Pb)U-!oD2{NH#7HmJ`4?5wTE+S) zR=2@9<>!`L$T&mwwtUTBCiLQ_<9bardW$--ljE(bW&EeT_s!@cckq8#?%5;b*+bH4WXy7Fm3C?H5S?gVk&JWRMTFoH2u73B1M77qjPgBkTx zV7?|Uvsq(PS(=g{EA|i!OstxSr%_R~xRe&4p(pul#kr`FN;XM{s7+4EF&SZ2g8e7? zjx`@SYw+36%zfwW)$JQWpJXv*Jt8yyU>}fe7EYm zo0X?l&+M@n_UmeKQLn?v-+T0{cHv@?ivR{zlA)v|Z1!^xCtE9v`*{iiGxNiK39o?1 z_357s_~m&3KyHyl@<=XuJl(p+QV~mT2|dajOCFm3!~*N7h{k0KgXA-knOr{ByrJ-G zjC$vl{RNTT@tl+E9)hXB3HwT%k<&H06EluCT4sSc$gI6!oX~oi><;N7yB78`gSpr1 zcgA#-+PntRGt<-9dmf8vk@UooO+@uZ*pQD80x?$3a1RUht2>JCsIdXnm)bZ$@-DHV zRO3Iof&w*C$!gWsxAYce_^`AYl+yg=pKWG&LD-e2sJ-Z<=;Bs~V1PvCJLYq~hRUTr zYiF4dLk~x0r`1}Q9NTf|+ZFs64ybV*cT4*#ju2W&e7zc^8XOk5W^so|?T5!Fj}vS* zn~)2UYFk=1h5xV7>WN(*paq@TuIG%^zxNw#(D6^8o5*-@@Kn%+=`76mJ#XU*;v}AUHk8!c} z39ATZw5J*AY@PKBydkJ`T(+C9AKdg4O3)Gx1RT1A`=RwoC=aY}eN(u0 zk{{0I2LB?zWc?+c3`ej0+^pU)-C}7ZT^J5?PmrB}g|P$WBxiYxa?fpt6S-pnLZDwv za&-8z2_)}tOUPnrlGtv-BbJv)4q&W;M__TTUJyAs4rm~94U`qqG zR-!i%PEltsRJ!4|3MItVaUhJj*f)s4?vJlW5bIN7>plZPnYMPKi3!yDu1dI1zp$hx z%V_hE4Vv#5h3uNq=#}$l`#HN2sCeCpd4Y2l?o=OZxwWi+OyCj80eJn!QZVFP>trB1>_7#}>;d9VT?L#+w^RPvcroJIx&DVbUj#(0 zI(~~Hn<2Ey8QhlPbRenBs1N!@rLB?bpBujYBAXFMd2>=azuK;c!U{mR+8Yb1Bofnw+mm#yJBFc;p zdPd-eE<;M;PpEquRMqCsMG zulV9e4^_JW`8PyiObU}?;jm{H`&}T?TRc%{Wqk>jN!zO>)E!N|8CU5*Wqt08zn27v zfL`*Ka=0MMkwNC*#uu`IJiziBNv{Jy=g!e-T>H_l{%7ljBqDA?;v4Npi*Dyv3*5{g z=3l?VW}gH>tG-7>G&4xkG{8o;!sdEnxINW?{_J z81epIm{ET{P2=l~x8;<9k%#-sf7DB4bc{&`g z6)Ye%L3pb9THpfWN%HHEgJXY)bA5^Jt3HRjq}*f7vZKwez=TpxWW;U(a|i}!*nC&%<@Ml*)k_kk0Ro4E#fz(SCaHPgaU&p zD1GS>;`a}eH2moHvp)LSO8!h-nWNheN^l_D{F3Bu-Zv0G`;}g$=}VG|?6C=EFRwaN>!>ig zcrQz0;OZp9UGk&YV5Kh#@6U1A>JP_=^Klel=Jy>gzez8^m8GR}6noLF)b88I=7y8p z8>dHZahA66`of4!Y{Kgz5JY7 z$sFEr0rTWveb*WnN4;tB>cXXdjX?swHn-_`3HN6V^q%7P`2cfnJnV|5h06U>T4Y&4 zF}c)weSCZPe*65Abh+w4^m^;KXq|^bU^sz%hUqXf<r9aa^@=CHisFV^FT?z)HDBjrD zxKl4T(FF2I)Q^Cty=r^XUOMkGqd8-+zx34)hP=5@e}40v_W=zA$Yl9j!%hdrcyBfN zdIG>wz|Yve{p8RkBI=PJAKd70IrMP36X#6*G!Voz__^n1HCEAbzEO5!p2dXV_a@lo z2+__Hejg%DWKQzKtuRE+?FY|+cL>%+zLmo6GXT8aA@QiFuZvs}TR*C3y~ zzMOc%Ln%Er`2FlW{x7U7cQO0d2>2zoffMJt?n7lavj?JfT^k8wWdWf{ZtUK zZFRA1@Pnc>XMUL|EwG4r?M^v&cW&2yn*laF_%~&xz5Z%|%%!$q{;*mT9O^n^W$F2v zUC%Rir?lQ5wB^yl{L)ndXOqmGGGPcXFdo(WR#~3Z$TBfqp|fk+Y&uFgf%Gwk>feg@ zUR|@gfmo;&IE&#{*!ALE`*#C3;1Hy zGR*%cbum{=6__+uIO!xmeHnM3OGl ze&a_vvMzNj2Rl2?FcfznuQ(3?Dra4Li0BJAkhx;bgnu$V-D|P!3D5IWV`aWY4r&Fy zRRj&s*TXXGe1RX%m$*~ zJ#bvm!RtpEKJ&voxv@okdDM7P!{s_AF`Rcc)FD4U$~+SobZOzU5nbmxc|wfU+B`hR zEyjT(!r#fTvMa#O%FO}S8;Szhh-?`!(gKP*DoOqiq1PW&wzoV+(<*4&wtDbr z_3Pxoa)eH%SH6mD%;oN%{>CC4K2}=lFE@{0_0(K)9r+yQB=hI7*?p%dsmh61eWO>F zNMg_w9*%r!)?eDVN_30M?-Vx`DEiLdkR^coGHC2WkZ)is-WbQ0zI(C!*PEzkADLnOT0E|IGHtzV zo95Gg3u8s;f*Y-sk4zfL%lz?v-Kyg_MeGD7TR@~Wl#d<0_#Ha&<#6cq2>kyL4+Gn=!?S|agaT&xblzxhmOm50s z@~p`|eDZO#Y@I=-gqyDw4$o>0+uuOVlT^MIrj6^!Q-6Qmm=*saVIpof2tP|w_dIZ15lmlNrmgUZls6sUg0-`uABjJTmpHTns~LWqt!PSVJu09sY$he{uR)rQ}K z@<#NXw@V#{SrQ9aP7+D{e4U^!&JeQn?y3ox*S2rU)8$Oa64CaAWXhe`=c z_~r%UY~^CV=BI`O2ITM>rFI4)DT2XmSj>j8iCRzdiR##92H!8OT@yX4d46`fnNFZ0 z93Cq2BQNZgUgo}#kj9HjQt5)&8lptUQ%tYF0hiK^cGC#s{EdE+cR^fUBzeyzX+H>4 z#PI8uD~v@&Q{rFa z_V2=??b%*`a{J?2oTZ|Z;mzSh7ehJ7vC3NAALAd9%w$6~9n zU@e)gbVVr>!Womd!q#fPMqD%n$kMNWB@vP=*N+Up+@qus?8^QME-67nDDBce|5#`lB}|_{96q@a?NKQ$Fl=y_P``s6G!Vuv$&) zd_6-N<54I(JF=Ug<*C6aW9wsQevw2j=?N|?`NbsOE%Mj0wPXt7A*G|?BCs)JE6et+ zpdz@N|LD2+J7z;S$h(PtAKgOyy~cpHHqH`5-25B0l#1Z0x}q^Xs)pVQ2Vy1EYuR28 zN%m`Xu#J9ld_pFJ?j(*?Txc!bJ(FomEzY~Z*z8;MWi>Q3CKeV3@e~8v18Ak-qmt_V zao--TRZ4x1o99pxNtnw@AiXmULSB|SqC%Qo7PCKXu|+BK63Wx*7ks80k_;qe8U0Xa zkjK@Oh#?Mt_-@Wkm?2ZH34l;_f*knkx}SGgWce#ey_7WoS$QuT$wol<`J{H}yE^v8 zgyEE>HuSTMFGYHjL}M;fh5IsAyvhQmj9lNEH1@x-zgT=%Nre2XEVH3`OTT&@!3Q7s z#g;m%uxUf*!~rAhdZF-59y0`(_ZeKB32u|ONzlo{n40>z+(5@>R!9!Aaok$>2;Sx+?ZW3xe5 zv6np21o5qbK$8;qg-z$%*W_JY;TXFtZQUd+xlolt4_2B%(K|wNS8KD6ytvGe$&IVS_Zz( z5GmWwK6iHLtYh_012-Q^I@5Ob$FV>LOYY9j-g8Dqgu@rflC$%5R(LL7M^xXB=Cd$J z`EO-x77;PA=gP{FyKxkiEuIIzKi-#bc)}rSawTjp@tlIBg8U2yifle+g+8mqf_|dm zRz1Sec##r^4km>?_6pN(rZmHuF-$vjj_|Tzzz|}DpOaIm;T)Y4Y;TG1!DP!x`?tF! zbpsfl1%p%aaODVzMeAavRT3v2eylCx;s{q(RsjbG%c3=Zlx=qV(Yrp0JtZzeasUoi z2p~!pND5Gp4L@Zsv78#O&QbIVbEO$UmnvQ@|uwUgl@ibrQ1&|}yxFQ;r7 z8=T<3Q~snPEg6#FKlaMvwEzb?aV{7C(`c$mE)O-Hbod`6ie_$DRsOHPq1u6WmFGHS z63&n6(?}0^7vzz$Uq``o0!#GYdH9g#H@cS!nA*(0+Tu+DX_D47^2#;FcJRxV!GIl`t00^=b_V@M|#~Lf_-D6fgB?WoQs9*p@4JY+> zbXXog0eOZg2R7V?DA0uAP(t<--JX~u9hj4&0Ftj9e`V1zuEk28H|LI% z>H9Bi8z6oTmWft@m{vy3qYXJq;qRH+wAUmcKF;Xrui?TV0c?!E+5oZ-PSg+}V5ss+ zK)&*yF%qP538abRG(g~cbl&_n$86Gd=dYOXFK|cx`pBeWy{-dtTsNdW!Z+>XA0VT#0K|&v}IjpG?bCb{CPD-RvuloLfxg zeyx--x!3PC_Hfo9{#yx-pu7xw^XY0i*&WRy6(Iu<2#?)IRsR29Bkg1{VWQ=czD{8R zDMya}4S}g*N@~~73bm!}0H3T`r~SqHjgzqC_%U%#yI%}(^2-AU>8ci8jqzr?&D;B5 zMZLKJ(Ob)i<4A$O)TqKhi!#ra0I@0)G?9&DX(n2gtEdpGks?D!*g&L8w3vfiwVM`} z`WaMPmaRaRbpPxR^G35axNsT)6|{jynh6@z8OwqD2+5NMch}qcN=4NXQ-Y=mXj3F9 ziqUsUg%$p5-0>5Ak$-g@VxiGz{gRMq$J^kGk#3Gt{blZ`-WMN4nQk|-W%-Ar(oYUt z?10m>RTfCmPl_L#$1M(eM20l@Yvi_^N%dz1ME)r%kjJB3{Fs;Ih^;#6Z-adQ$4w}i z{v_DTzr4Xv$I8q%$?UTj!$v|HX*@VUd+}0 z=9YJaU&pz&ckWxaeSI5aT)pkf$84!$&OFDNNr&o3;J3b;U1)f)edZqi{_$B6B_dy1 znfF`sg2|SIvyv8dM?N?s_!zI7n2!i6%6*Og#9!r*rlni9!G^{|LD74jx&;QXq z=Au<7(giU%o^V}#ewaVaMNV9Q_1RDD!Q>t#KAQQ4q}jv%dVGY09Z7FzC&_t8Dn_>G zyy8G?V&_lqN$h4)eAtNQ(5u#@;lKgS#1%W6`1`_LUK5YrSz*AoCk}_lA9l7=ehq*h zVjQaHEu=*byO@23!4({3VZ%guUIZnq9l;KfWTdE3v8N;!G32D^_dEA)7wv&%fmp1h zXjj~&i^ct&t<-EHqsP)Sx(S?u(kCa~xm{j~^3!t^B3?N^F{y}u6vNAb5jJg_@*VP~XQf0)W}GuHj)j~qj6mh$thzg+;U?&t)^>G}3+>@2Fxa5+a!+V}d>Z@wcb0Wk zP7(J04|~+nYNG9`0}v62{q4{4;W1)mu)95R>5 z`Fi%A;5a5$%As$Zt5H}KT1+cbwDxGg@T-f-a~QHdM{D$20=GdHEb?5M&)q&o;LPi@bhc32}WdBR^wJIvy+qt1WXm1%hkNO#lTpG4Q8H&PC7W{Snq_^xq zP)?!x(G^?+9Y?6!qJ2&VIy6aD`X8j|;f2xhQYS3d6CIxHNm$okwi9`m1SX?H4Xpz% zQG{smzvPZsq?RxO{12WSi!>8ND9Gb<08|pjrwZZmXP+QA@OiR?RS;-^WA!smU{V4w zhpo&}31x-o6T-)b;xpT?aFzDkl9Qv0{(%K;0nDl@30mSdmL02R|6pG^kmw0z00S?; zgpX*{*H7A)zAWtG;iJo6T^;F%D0NGl9A=Q!;~ZSS7ci1{BZv1cZfm;b$8c3pckAF{ zyP%r94Rmk6t+Of!3c-VeJ5F^ZLUaMO zfYTnY6166QX`HC#;v#TyVW;V1_k@@*?(bPFqlT4v#+oq7)m8oGa59k)>$R)HLd-}PP%q35fQ}?^n%U5^$7$i=uOC)secP%2p zC0_;ut6=z>nZYU{30SPS3NU<#EFg*!zy;KiwaTF+4WT4m;6THwm}DxLiC8SS3IxH2 z6o7)@0WcS^MvEXymf)Y>9cpWG3KmKCQvlK3`?*3jW$x#|K~EEu$(@@!jqdxO=?EbI zh+L#PvYWb?FX<_{fT8g?Rw8)XdE~`uY;R3QG4&?eBmZy0z?~5t*^&csuKeDWyMkkx zL@>ePmFvF*E>Z#IU-e(Hi*p0$$THS&F^x5Pf~PTz0{kP$@}$3}b~(^JP=?(L&U6u> z{}$w7{X;(=8caW-R12b3?=YMeGScW-8)#SlM+k5|tT8Nm zs)mWb#m4-M97+x!=#PU))pZo9Aegj<6XN|3RqS|KnBnt@2}Q8;gm^}LUxy%*M3{7T zs$4?6CE_U`Ho9v04>kTLOZkT`uhnGdzlT|T@82!K>kED%vl!Hf4C3l;Cz*D)%!so@ zfL{#9I!U$>AI10DH&tsC4O`qGzogPHc`z(pS-f&~oOW|ujl93oUmf6pV)2oarD=DUmeNAau<@yK_M_F?!yXCTeUJ+fmsceih=cG~y;L<#)M6oT?o?v;RRrUz zMpakD{GEC$jUxv zAaYHaDw7I-p-UY)s4QO(lLqDZgRI`IKEH2z(Wq}F$3qU+*x_4jEG7u1BrP!d7EW0H z)l>lERN@c3kcY2{z>N~M(Sc5KJQeB*1?Id}86bgjMcj)Fvj{KO@YkCNOtSyeGyNO;Z*PTzMfQ(V{~zpsocjMB`@cH>|LYS@ z`me?Qm7D*2vHv~xFL(Lxe*Z5@4UlR-@4RxI5f8#E(h&vWMAyBWi$Evx6%Xo|wxn^8 z^cQUdC!MW77!C^1S*IIuEgSD{a~1Q9G>(RRiYv*+oWIPr5eM2PRWQRtK_S4C5XyvV zptdtB>pxiHJ*(aC+CL2WUjmxMWYKK*53&7Q;JV+|d*r_aG!0^*iS!>n{I`JC1PALL z`Ckbt_nUHm>AwWD7Nlt2y=US7Q$VvVTIqij{EzTo3jRms|COfy(fz+P{g3YdUscZJ z2A=mMkZ{g@Ffqw!wm~1*A?>i3o6)-(qzp=l}_33aYUAtn=e@c*dUuLOPWdK zmc9ZtF<`MA+*U-Hz7#dF;TXv}aT)$>Q2YXc7snTmESWmzz{NRbmb6d+)nPyOBu}Dz zF{7ZS8sH~i`7v3aQe}wiy!G<^^DQp`v{d+cWYkDtzDAgNj;HrTl8v z5Vh*nW$ospIPk%{4KI+SoP0sB-la_8E~s=kLIVc`P)-3n1~Dcl4V0-#D$QQuC#k8= zsjBxkb$hp;XN|y7HW9Tf-kU91yj-6Ds&^>uTeX`c2)L)?*GG*%9xI(pAV!v6rA{g-dWpc|Dg`O~ zH)Mrs>^X{`9&I~vkaIJ`d2>=)+8EGLrESUUgdA0LWs8JoF0?c#`mJ$-wnS!!qggv% zhbmA7Ap|#)35tcd1MD(+a>vzY?a7eoGhb%nfb31peD?@P zgN)b;lyNuFB8ZuE#hP_CTW;&P3mmKeHhv8XxU}xJ1!uGzF&m^!-lZ-(p&CE``IK@_ z)Q!1YhD9#`%aRJZSA*ROv87O8%cfi(&W=U)i;Xft3QPV)=@^B+BU^$K9{H@lAo6BC z|G;?lP5&K6yH}nYLhus?f5)9ER0?c4ZMm4UeNIhO2^JM@b(KZb2BO+CD(%dJG3(FF zP2v~UEf8S<`BPy6&7YM<`XTGm*Nix%1pyDATqoU?|HwwA?Q;=~sbRh$T8PUFC7nue z+Eop!W{&43Qx&mVihY}eMIMAt5nWht1k{I1bnE9h=>A|BKQQ?zQ%w@zvd8a$cS41jWymMUwg|2u6KvHb1O(gYb9zVFFxnE&0yorqBhwQx0nyhifDcn7;L z;pbWkJK{THr5^$B@pR=R(eDF1A7;y3)|Ch7$YP)#_GuQ{?+I`vMgXbvyc9CD0q%G# z8tMfUn3fZvjo%pxv?)zj-@d_m_HHQ>A-2`#KwsNf>6rbI?f|1O)T@>Up5*xag5K2kI}!00CF?E0k| zm^Rd6@0sgfbUKXAH$(rX=nq_H=i2|5&0}UA*{@hP^#wKxGFin6{9I4G_+!<6kqae8 zIq1BE!m9LsaNvO`e-$nMhD_i)!6|r-1NFG~zh=gDRt6f7@Ekjt?~?iYgyiO+d;(BH z@U3DdIVDN^m6|>EdNfx<$+j#b(sR+V7AKHded@Z-^G4XJAlU#ND6##s@~a<)CHUR6 zi35-E`_?cefO4}}{lI5$!We!5yDPWPHXu-Zb*mjfgG)N`LEIng&dlMOg~+bvEWb78 zieoYHtkQT`&p^)8-SgR&3Opdy7VZ7!oFRv|*eK#&j~a01j|xNG@?HB#;R6l>FT~wN zGW0VNbfGM`1zbQu#xNkI;BGua6vp=>ZW^{l9Eri%_wIG{!EObPO&SAaHZFf7ttp;H z)*dfQyCUe3tzWmNmFLc_ZxK)J#)@3J!Pj@{GLZK-F04DJ067`d8SHL!%TiIaotS%{ z3Lc~L1s&8mq6?=K30OL_^aZ;tJLj~CGoQX-&PtJ%NEO7w}BbSUI1Ra4M@j ztZqPtD`IpkV+}JMjPtIx<1)sz-xcwdZ~3wLqX^R|EPZ0o8{O!KdJL@wankp)@f7GB zEhWY4Kj}6KjrQloA5uCSAQ&XWjD3%LAw0k+s(f)q_8dBZNx-7Y6{|Aqk+18ZS85|n zV&g!3$*=Y(2=U9MCWzU*aEWgj4y-B-f5uS%=VI8z0;ZqV)8Nuf+D;OLVWj$No&A1W zkC3}Wyie-X*Q#xFy8kvNC1}CFEGeEE33E|VFdBvo&>NYn$uPZp%pMcRhO1|UiEJoP z)2qss<;QFybAmF+xKn0Iv1BpW0Z-J^e-mOMJfhlx9d~sK)+6h;bTz}z($AZ`7n#jR z)%LNs?iakcdp|g+L#7({QlTG?B`kptO=PT{{@eIcO*8eQidqNY1rYbM877k6s^6W$ z2@HjJkP$)!d1&<|%}C=I6gg~Oq%1`zX>ZxhcjHT6;5ohVc%fjGpZn!JkGS|QNn3k7 zsI?8{pXlUHW%7MdgJ8D)Q#KDlFL@M0sS~xd*hg*7)>p@`xu*mG{rn%$htVpqZYm0l zl5{*XjPb)?{9XdK7hfNV)YuLflI}9qXj1M))oH-sgA-`uNS}4zk~D zm$;l1AMO;yTSmjN=RMV5M45nv)o8#9c|xPyCTf@$eY*Fhq*TK|(Oo~Apy`|CFwR!G zFe{F_(&l7)rM_d)4@>R`4?%hc=7?Br!Oa9n6;i2~hC|<;os2XVk`PkvjDD?eOcpJt z{2cw1$sRvl;iB)Q5Y=BnhllYh1EqY$!=-IP}5m!4jvr z1T~3H&??CtV;$?HXq9@_1V-vOS>Tu8S!W@9s`m`>AD1rJT~v#|Y$lW^{8SRGTGV)) z_cm_xrJMJo`}AEON&TdLcA#f-U@JLE<#~2{9zhMG`nDHi`h=AZ1py~MapVR%+)CcZ z93bZB9#C`?J`qbMJsvJ^DXFg|$VzS4Cj23KLLWZs#p?0uCmi5j{i>dorKcIYR{`xe zGoZB?mL>_>($LNVn-sPv9zLgJwvFzj8_Xw~3$psIIHA!hP^V$)7;{Cn_PEq14=ku0 zfiC}QhbyTAaSKXUKdZ2_@|8VSWCL(IE;83>KZDM!n3sAb_b02rOywZ0k?lU^-iRG2 z@&Q`-P@U~q6*HmTf>~|xW5RU3I4J?`DFqM<#UzBKfsymABypu6mLd$Bm9&o#-#6U- z1vriRn+K(1Wr7P(=N~HVc)XD?_?#0s`6n62(l0@ZHp>@;BaB~ISSmTmm4c43F}@}{ zv=nMwZZ^jq^<3A>hy?Fyq3^WpF;tty+vD&jZekQz4u630qcZWjXtEZaJKHfj5zFHV zJ(^R14ZEy9VU7hxxL16`+K8ST$UW?Mh|+IaTzSv@x{!)SzNpg6v;F3f`?l$>RpeNW zDgLLu{q;^MbE70GvaF+b9QB)|eQ*Dk+5aH&_O{;Thnwf!SLUC-Z)N^oq&eis(o{Yn zO<*Q(r1?(N4Ne+AFxwUH+ zZgvY5aVTyk33Nl(AhUu-sb_a@WDX^fPG+xvWE-IDRAIC05wg=}rARfFJe1FIdVYHw z%5RaDN-0p0;$f?B2aPJI8W%4vs)A`HCdx62-8k~1pGvAoM}_k*f_ki_$@eB9dGi_i zF9B;3rV?j5)682)6Vu#6dF-HKV#%BPNE^x-+~ zMjutc@j?OB3;w$|&pO|WZ5t9Y&D$0_+BGVbPPt>cxuX&lI!fU*lQ zen}nGLLJgYRA5)eIrQ$EsSGyHZhWVw99CfWj{sAoryghR;di=+Sx167#wl;^ng}Xa zQ;D=?`!n4J!1KzsSJCPQHmN9N-)bk)do^((KJKNsLfL*17oV=suybjinra6%EKDnEli z1jO~sTTAWUM-FEH{-pwRNG)|S2TQ}A1xEa;I68AL?4Uusx2@}rlSWuuD?U z05SDPJC4O(FHz5$kF0;n#n2>H!BW(V#m5_7QmEP=RHe#{goTGaw~f@7(JTvA5c%xd z-Ociig8zZ@^hpZ(kvRDs$j$}09Kc<+4;SsA=fKs=#FC$#M!-xKc7L}C9!G{&smqjR z4=gPSiBhb%{5mg`VIc0w?D^i6szD}h_ic;Y6f>QS09RSI;_%x!9v=bUH?=?Rft%@5 zGVkkGGg=7R{XYCA>#;8LdEQ!1+FCE5w)*#wDMy$d{PT9kQ5A6_uuZh?j=wSlXRX>2 z(32C4YnVZs{6BWzkwgiRbc%rH5z6$W<-{zP6s)c?a^P;gz|4cn&RWbp-twkTsB%F_ z@g9~Xg^kRmia1avyrD9Z7%bvM7$H4p?qYhx5-_Z&qV<;^#-C2nuPSEXp`=$>HwaUL z`(cyS(S0tHJHZ`)F-B!~?QqKjlNc)wA)~W8fdw6u2)UwFLPW}UAgeHIm0Qm%@yi0? z_p`WMxwizxEzeB(aV=8rRIciMs`pmw4+7NL#Y!njmA+UYh8!}ut7glPMDngqIXpxq z`v+a>zJBTvI0`;L8S$SKaW9ICe-Uoqt$EbL;@#@#(Y|c&XT_ZL)y`5jSGe_KN~3iv z^yX36`ST(!AVX#Ghi)$t#}iUbBM8Tmt#uKkMh6~-{0Gpd4B^u4nG4<5KzT~h<&_2j$%w~5|)*RmY(r{Bj5I& z)0+u0uswV3QQuwt(Tjxkum4MyD6o*1TBp-ZTMe_v&B|isQ(Q9ehr}tb-?*)BFv@J0 z=xJXnnfgkD=_pC-O)O^Dzeb)!czUlA6!A+5w%;A4eV!J$d6g#* zg0X~oSbK4w|4pJ_3e3>-qn5NkKQC&a_jLGD3sHg5TT2Q%WBkon;flzBwZ9dwx6mPc zVSeIg-oPS=uqJq#xQ9~h-2f>! z-_@^fSX^rYLq*m%{@!+d&-gd9@mb$KXH^-cmK8z>Nc%(k@9Avfp4bXG0eUhj;8(Mr zfJKAXSX$qw)!eV*d)SAhqqfeYvxBI#~t?ksJnz1wlg zd-e6P;OjRe$@+s^7Vg zq2CWc$?^9&sbOAl=wz;cMcdeR?`0^`Q#s8mM3`B6c6K2?WCuW(UpSg)Vzxoqy89cv z4;>NJIt=nzx8xtcP4z;>H@z>;*DspcHRI}>s&Spl^q=B7ZmgP#tL6Va@+S8de%B(- zGWxadXZ|r`ztHnbn=f10Tv)AF{Y-7jC8edIb|3=%OA4X@(_3v>6-YiEMUFM+_h8AV zIJ$AB-LsHYWbonPx9)9+@4-k{2f%~X74p?*TsF4)IGbr1F1JJ3jw8^9=h7qAAIUJp;p3I8k0{IDje ziqn|HX_@jw#e-WtEgOT43dYz^(`BB}^V`N0205ovxQOV} zZsAHW;p}u&FmRfnL7##och*$q5oz3y3Q;EKWUrzh0Z`}XJ^YShWE zP9C7E;lpeAeuaMXg(BB5$d6QMjc)t%Q7{P!7I2FhGo48f@)6&6c37Uqn zy&-{jN5W#OKJgY!MtBFmCCu)wg8GA8kfSa{!<)VB)Z-nWuTB(ihKYFBSuxwLKYl;b zG^@w@T>)qNRahVXD?9Nc%2}D1X^s6d^0@7Jbb7zCdf~#Imy+yxz)RUgyU&J}`RBWk zYy*}*bNJl4NySX>nkB_)ZwiB#7yAQcUyo`ztRE@Lj}j3PLrYtwU8D(nUMS8oNzz>D zob3Jx9Y!bV4%FS2qXm#jw{P(tKmXR~UoEG&fxF4pE9)z(berL;@gd45{?fJn+jC~# z72LAAxZQ99W!@7WNLjlptyGJ1fDQb+*`4$21#iS{+Xs~MH1ks?zYC^f=dTa)?w+@* z5tq4VGyMLx%1tw0(K8si;w_Xu!+O&kOLXV?iNg)5%AVZ5j9nUG|GqoI;e{UaJkz!z zy;>YrO?CW{MWU1`b2LYartRk{snVWjg9THl<5Xw^CKW4(x*~`y8SsKeL!4IUREh>c z0NAbFFGyZXq&D;LVDt#Q>Uem%J|1GZ8!7I8<1t@1PGb$qJXw9?j$i(!VQkWK0^Zi{ z%VWmh2alyfIOlX2o~%0EgyED%{F>QQYkotYii=G$CUuf5g@cHmIeLYV3!j=$0pYwu zxswP~vtjn~D&a;c(l=nFJ;2{Jg-^RI}Y-`UHJS5R25Rvy`~w zCe{z;f8ecUaL}FYLDCiKb!G|r zpD9fW+2iO)9I@1LGWHVlZBFMWEooeiEYH+JWX|nhzjSWq+Z6RJc;=c>^$85_cX_w+ zy@M5)mbBoGdX}*{6skCM(*Xw9W+L!?+@ep9HU`lsS?L&^0IG<_+5q!|{VEF0dN{!FXRzkj4cUXKGg5|i(Z=_~!I zQ@ZxkA+5!u-$Ssx)6C#T+E^R}Ymnz=A?%OT2OB|^b~yrZ6{43_sXiBbk&j&sNW2${ zqYW8@E9&Z#N`lLwT}fh+GG{zMwJpopcEj=2Bg7RqQjRBgX6vbo2h-Q(@)^e^s`!pm zcLugHp;@EJA%+JmPc0*`T3~(en!S7Rc1QFgI9}-OFGwEuc+${@blIA^&XDx+O}w7p-5Bny*-nqY3%nvK})IK1t2?cl53m1}7SJB|6%oStT%#K;zV^ITlUwD+5`d9>20ysRyE+A*2;auBn3=gtEk z^gFXhtj}b~LfGlL`ooYq*&Y7}PhT0;*7tN>tVnSw?rz0hf_sr-Efjax;t(84DNb>B zcPLJAcZw67;vOUgR?3ulX__8fN?R91kI?xC>y z4V^-=&s}0Cl#vEcbkmWJxXOwhpSL7Qvm%tU7(n>lK`F_7zITJZx)onUI{ z)U-w|OvG7)UGudp@ViMfFxsAF?&?D}*IHUmEyXVm)1#Mq21$!U9iRP%qv7Vjwi!^> z!=)fJwK$j}Yd+*b~Xo_C-Z|jdjS2jzz9F=WXjp4;uhuq*JIo09O`0LxlPwA$?#>NZODB?{$J0DHR3r;~iU(pM$;!5Z<@bbs4a;XC_n*DMy&BVR z&jVeH>7a_4-o*zK`{$9SP?GZpP{Z-kV-XaJp%-EX(Kb)pLapc&i`yTl;=ex+VxegY zoP$Ng{Avq120wXa-R+4>t?Up&ly_{=l#HPPa^V+`1RcBby88}*eC#V{~QZH&GK8B3Itqa->nbJ3Q-EH z=fdd>J%6LU@;va|a~pGp;u87w`Mo;ss{wiA`hl5EeI>doB+L73`}FfOmo;HsP$VxFsY5>hSXsRX%J9xq=zi{Sav$Trusivixg3Y zxtnB7oSNw`>l3n_i5DB)%dfO?r?`et-!2|4sD%J_hPY(LYQ>t!icH+H_*Qy3tbr^_ zjVjNvdWGxY$^ROrstlZc>@CZ|dyYTK)%xK!>4Ux58wuw?(EE)svL_D-Tf_0Mc{tFe zxS0@Pg4PdX(_K<%@$&t^C1FB3o>HoBQY9kT?#byw+y||4)`K6HTWIw zym6HrDhrMoubHaL=ACaYi0OIay&%GsEm=pP)}({BR7aDn&QOi@Oo0MHoOu&gbqWQZ z&>kQcI%D*I^V?u)G)ds%RDvkI0pzWnjKgLOt$Ai|#Tg0Jt&g%zk&2oOuj1i^C zPA0hD4PEJ25ze5U9j|%*DX@IJy9W)D-tGCS_SG+&c_yTJXYnQwX|aO*TR=&klI>T5 zgsxr1y>y~8Uh!3G5O_itzs~B(+KD} zPitau*1ajcL(K}3x!S)CsjB11nj#MJ;%jpl4NqqJNZLpqxz27Yi2Zlvk{+_R)B|F? zmQjzNHz7S{PN5DBNFW(Ed-po~>w7R$Dq{l&(we1uBOv!2@&(`f(|@1qY zO`jP0Z$fM+zr7w_#%|(t03q)xqV?EekKUq~J%%*26UU~4+ z++)kbF!woP8h}SZ#ox{(U&kF%r@O_T?hisWrBQT*Y!Z3DT{xo2(`i!HhAG*k9=QFS zYRdOAmk4JLFKDemz;?u9MG|Wr{4tSUEXB42Yu;O@u<3`^Rez5kKEm~c)eYVe3=>bD z*gT`#NJAILaM6jPf7#fSEHZ@4jIctCgU0JmZybQgZN{%ywUKwHV){~J^@5l}#q($M zme@)t>A$ah7<1Hbd`H}1SFY(sks`U8ER*rF+s(hd7%P)hw>dphaJSO_^-c%SsTZT1 zi|tNRx!Zv)_=wrfx9$i1U50-E$BI-DmL^5i=XlK~rJ2;E{)IQC6j0X1p`&O{znC0j zpsDuXPZ7{=ts>n(hF%KzH9}!XMk0)+pQMWP5p-w16voD4N(s*wKP?CBMQ~G7Sc6ch z0O#R?BwGasVGELA)`NH<6YAyLU!R&0E1hgZl^EV?c}kvzIb`$(KRun}no}E9XHWNu! zE{*9bF>nbc={_l93nXVB8evd^bqyRE}-4a1JRv@ z7uzRCC88&WK4@Urda}^`YD@jBD^Q$-F5KKpNmjb5mICKjf*_PEdQ@X|#N_?1`4s zJN7Y4daQVX1++_0Zkuw9>)xQx)f6jtY8xM)9WuhEtoxzzR{a+|g>S}FU(YWrrW@n0 z`<0eqIbA<%9yXUbKnLL{BR5_hV++=|p(AnMaD02ds}~a|iTeDF^I^a%(G$)$;zL0$q!KSC zuDF*^z8%|_;=nmzg?4Dsth|Y}($LiAF3`%d2+Uu8Y~UAg2wz-Zm_FU5PmI=Z(kwXR z`t?k2KUeZs20XWFTERO=VaV~->G%w*jc)6^oxcpFwYktx9W%&;=NRWWgL{nEEHz9` zxS!WdXC~a3JwLQ^R^d9;UVr~J%>N;n0OEYxyBT=(Af&CI_c*7g%W7|MfP#4)m+;7} zkyAsoV$ILT*uixq>bx*>OAjfX=h!iuT^lqw;xdouYBM8Ciie5Mcj1X9C4-a@eoCU~ z@I44`O;2Ts>ImFAg)L1Ye7^r$c4gu=eOF@hXV%L?j2n#5Z{j-`5sFc6{Wn1Gxnkzm zn{N<1B?n#HE;$zciE_=UxJwN+tw=AI`(k9l5`q4zO(r#4v%v)`-`JJ7kvnk9ZG8U3 zo?!W}fj^q_slaX>DO*$%a}FJp3QxKw05iV)RB!ANvy5!O<`^_1-YkP98GXTzY4DT! zC>=o|U$u1xH>Z`%K7EyR;gc0c1VoBwsci$MHK89 zmsiD(L&0a_&~A{9f`%#ogeeVr}#xHr{DI6b7hYMet-R-A=l?+?wcH z15-N^V7n|Yr%l{GI2vjW77Cg9I!YNH>UI##T_5)kC=E@c3#!B8IKfxkv6l-Ik=Ok-s zLPuT@i*78w$ldV5wXH=KZ-EEzN-T-VL3O#}(M6ykc=mT#QkcaFkq0$+}J}6*$T0%TtURL)@kW#$uAioV0C_bWj z>p?66BTn_QYgkPZUKt>}V3veAaVY-P-l$%4Uo(tiZ=?yprDB>~HiLBTPW$iNX}K_Q zMO1-|^aTGN*KDI!1Z!KDcBq`D48wMQQ172;bJlAmyj1?nxTS8w)?2*4YZT2UqhEf- zyJZSiS)AORFinOViDYmyS@k0WL3$apQyv-OMY;|)bGHVcC?gBPkVwt@z|j;-BXOtH z!lUtjyb>}G{k-Cr&a3<&300T*IE=V`N^mIe{^Y0tCi$^s$)V|T zi7lDteNCh%wa?nycbf+Mdy`F)#SEVYaDV9h*{X5zklF0~_O5x_1P$HGq%t$~!6YDi zEl8mq(caiywD=Qx*xKb<1GDxhx+2}`jkf^=`w^zuIvWX+^8Bl%GE!XYiYCK(RtUvPJofSh_>8%xs`<7PzfYj2pocP3^$+}h>*ES6g ztCY;vH+k+O5}yGf8y86E@U7 z1m8l@i6Cm9t4s`1dCfQ{!ry&nqG+BBmpG14IXWee;UIN*h4MkKG?i=51OA->t}KY!5V285s*qATmCRU28R5HNzGF%IU*|v5w=xKn zeu*Lvb{?s6?$OGx2F8VFD=lG(GZg>)OxP3m8doA8l9jOC(Z3(Toz?IDwR?ju=4LrN zONPa!*Ec3Yd1WWM0&`*hD$R8gs?}g_vEMs8lI2$FPOjysl~v^K*;*W*&J7U0*z|We zcE&p~RWI=ENU1Yuzh1OSj1CxWf5=;jKJ_-rh;(~-e!pUf1p@tH&QXdus>mXzl2l1;+w!` z_I{~>H!X3gY0#V8<#Mi2q6wQ5==-^4I{6w&qL6Z>8?iEvSC*@tRAR;xvllZ%B}5eA z8s{hU-j65(o@CCYAk{KBoC#y`sP=&}#9DgoHU8bsj%4uoi|XBtx@jorhmT_QRG@xp zu^)zY9{B4>%{J3+U4I}EF|$U5ox{$Y!H~ls)x%MZE5b%)?|nO>>P4YnDG3Vyy=#?P z`L7gov6#_!f#;hvp}2#Jw2_kYDm#A@Z4C$wV%TS3&?pLa>@Xv3+|V-cJq>c(lPjIx zK*aqU0`T$p^3jruSlUTVX>gW0bN=zw0H2*KV5#jj-vRP;C|xO6 zW>QOPIiZ}t62+BB61mo)pu`x}MD1OmF-AxdxlBs&FR^H6gEb!y%p-3BuZz<``TIb+ z_FhdW!U>mt3?Zm%eEPPTT75a!2lBTW|GSR#Lf62~_Vk14Np`z922vXHjJ;J!1Lc}4 z4?M^)2Fs5Bft_FPPtp^;Ons+tFv>6Y2XT%`x;XSlWvSSiEqh$@R4>>bXt(OQmXI| z`*!PudouOh5|(B%UN1BZ?19u<&hiY&qzfY4brPJ2{&B(sR|N$mO(JcY>PU|&)P#Wg zlW?oiTCfo=sDaVA8kuF|?Lv(aFU77z&qH_9m#T{&L-`&f&dU~kL{-7fVR=6^M4l}V zw#jE~9Mz3q5K2y`h<6#+FN2t{Rj02US*VzcXhy*foO}fapP0_TbYu+>QWN@Wj02z* z9D8~Jxj%~u7P@4^tY)1gi4;lc5Q z8TkAyMj(|^>HS(wAfwXl^SgjLg(CIdS8Qfl-_0?B?3Eeq81KYmCL$}4C_yEoRlhl* z=Frawz0#LU257nKo9RjLC*qTE=z%uCSlrvU*kRQT)2l~+vC|{zwN27J%gm5bVY+>) zOf2^?@T(-~#Cuula zS`sEhEFI}aOi~Fwqe@{tqo+{6JGcw!!`Y^RJU+Me>UJQaq1B#w1E_Hpd#H~ujR{7y zaJ$CChvFhN6K{7?XkW!X0^257+UD+{Q-DjpuTUM{4RJ0CZncDWl^G(>->QQm=tW}W7b`;Xi3yLL4@1m@)>=|r(g@0of2N)6J`5a8 z`voA|AC}iouUFwG^x|Zk5jS!TyX{)Yv`>bI843;m&@zRuoAH!ac1ft!B(OXuFQjl)L;Ce!pLi$r5eNQJ#LizA&9!S1 z>dwN;Kg*~WVzsOap^6*HB=YSyXiA+XLKveetD_hrT~qA$$(LVtKRXHQs7v;{zVk(P zG(@~9+SgT6h8LZ=K-4KqW=a4mz&FRlgAPYD>^0Py1&|uc&l0K(R1D~1g;$8S1HXb_ zIDAEX-&g_z)<>vT56E^0E14xq04sO;bYnX9(tqM#f_-OVXkMoM=T!Xi|GSL(QnosF zt7ROe|~XgoQ3`-QRmvvVHNmiEwCZ>gqM#4h=BSW?ABc%&8q#R{lkYIVhON?l*W}0#a|e3 z-2Cs_9unqvWp}qks>Ec~FT@jCKb}g? z&L)n=B*0V4Q{L52BBCuW_Y_mde6NT8E=9CZ!>ynk6aTq>i(TWjv^qoOnLGs<8VHdM zwSVA*g;hps)EQh<7KXb~yRS_*G#N$M97uYYm^}4h-O{UR@cg_Rcb?UD&{@0LaCknn z(&k6iXmnebj8~*6`<%$F=Vxh>5Wk|QJOi5h>?({CosQR-@+65N#zgjGinVk%K$_NR zlqnly^*9@lnj7TXY&h?eEtV&Eh|9fyM%!%+0 zQW!4AJj2K4S!WE#xHm;mf>d>-q>HJEVrXK;dS0!*a*atE%f6|b!mcboGSU1WI;E9K z-r}n)vngyS?W~ipC6DB-~Iui!#Dz|B(Z`AUCRYBi) zamIl9l?0Dx!2YjRCMFf1ZMa8G(q~GU=<(&2E&rG~duWXLeZ|}%zzpT0qm(;5g&@Tf zNCxhH(b+H@k;7o2Hu%M%O=gfKa&1eHWJj-El@J;Ei#0p?d1c)W)coPX=9!t=w-7&0 z=X$OV=zk_G1yzUZ1wn=j&+6JVB~u??oQO2<&lp9Y7Ts^q zi?S@@xZc-B+8Xhdf2&>$JVX`2!#ekA8ATsaLLhRWPK~Fb){%-1`SSs0s6Vl&$uecL zKWL#NEIU>fzEKL`4@A&6nc~BV()^T}iBM)1T`p{bt8aGF#DO3JHUGE_PZ5 z+SZHFo{d9#_B@pUSSv>Pw-2Jk+0LJ*)B-8rFG%eYPMzgNb}*^S6?8C;Z`u5f{Vo`- z(gJYu($SXO!7W}y#>Baoc5*8E9?c{znzM_1z{L49ozeJcX*F-QP@tmw`Gb;M|6FPD z+eu7u4K=46B>DpBf7lTzVJ`3MA~81kTK{ZwiNes6GqE6|->j0j$efzjA26I%`z(83 zz*dammV--bRHOSAdXlN>L8w};wDp-kG9Z+Ch{N4j_nh1ot6#?Z$fr|qS@U<#ik^3z zBn!?svX=y~CNImLs-)@2D9&~+G0-vMhiFj5h;*ugNHitPCPkEK^sirr+VNa98#LD4$PQMIXy>6?(pTT;NIvL)a zZCH6v59wn22)n7jNxo7gF5UA zqeNL$oqJi<;b#4@6_2ey8F7C!#*it?KnE*a%U!rU{VYKnmrSR39*O^%Zmn%#P+pOp zU9vTa3vg4`nNmAdC(?MVi!N*nS@r+jT<%Zu^SJGkOe6F%2xftjs=+7;G(_R=^3WEi zkTm|2kL36;m)X(8cxCA)*C|zu@r){(Us{SsRw^hKlLTi-bU<}nFe=Ly?Jw=Q4JlFQ z#Tq+v$su!^M8)&U(cu=EH1Dl-ioR4+4O&Pvak1jyg;=9D^lJ8IYgqws`sYX-ePDLN z_xlI9adMP-m;W1;^QBqyfA5Yu;MvFdb;krMCam?}>vOB{=Nq4Z$LDnsm1b*<;*3ez z`R|2D{RFEnucpk*xz8O;3NnuEwRm&{bedu=6@{hR@`_`tJg&D5W$fv~79UN?)=Z3u zT|}HS%vs`!RFoJC_F8OIKZK}DfH4^f<4De|Ugq(wiK}StVOqv_Lk+60i(go&c82e; z!!thWNPpubFsm=ZF(VondQr$NrTBX zPu&a+NSE}+V^ECrfenc7z|VCmebVdR{y0S<&_;Yea1ZG4ER44l^yA2+9!qKHS*Y5= z5;#B~$UTUut1l$Q@o6f$Or$6%As{lHV9=yRC&9+-*S z$5MYVK03WDei;?!Byz2!R*@%~(RNK@-+i@dsiPDQKww~JkmDkn-FD@o|7G{`H0&=x zSLtHA3wit8>GRgnF?;&b%5*;*_w9YrI}`;p-7d@OE2)A#!ZH;W#SjjWFrlER(*bV&m5HKGb6v7k z(=4<~&XPQ-eqstjUq2;dIg=d#n@GcbL#~quRyv8mNzu9C;RP3T9KkR0?}G z<}oiK;VB6Zsfzp~I0Pxmy>^-Vm4p%0G)n3#^`9lMT89=j9LMc|(!727Zy4T)V-FNZ zsIZpm=-YwMxev-2$D;u5cry{=c|>+)i}xCPJ8r zt^zLJeHL$xfg)4}jXLN&WyDze$0fZ~wc&D5z_0KI9K0l4?1L~Tm7x@Pl`Ulri#D^g zZu1B2d5!Xcu4_vAz7?$F8yP~ z?WL-WwA~LmKELnLP#$P^qQSW8vr6J{A4#5;TX^TZ(dV>lBseK%@ZGE1MCbY4FG(_s zmkir|J}qsDSh(`5@=6V&+D8#J^eECque0e5E_|*Y2<#cVTtnd4@!f3Rzu9QUUs%c) z8eUSBc@OBJ%0JXiF-%c=v5ke?HBZ_1n4so)A}?Rwv{?WtI8kTF1qabI$bUBUYNn32)6M^I?C* z@=%hUE#h3ZJz*w`v75ADsg6RRG~lr?E4a}zNC>cJj3_W7r0)|27SEnfo>F~z|LKU;BlXk>4}!BlH}MRTD+gO zyc%6xczxTzH$%d5wyDq3o*L5_b%1o9)M}taBS&xM5Y~iK;DXCLNEAK5D zDZzV+2~~&g%O1Ur+cZM7I6<0tsRUxqC{}YHiaJ6~P4Kx&t_|=izz4kA+izEvi)Hs~ zS({$=YA60HCJw+eY94Z7*rO1F;spBPPcn6!26=i}uX{y46?`G0db$VRd}D@&vzqxn0MXs25-??Fcp*+n1OOZmF&i8BxH>Z&eIX0uS5Att{dciJRm;|M2QSifYM&%-}o2~%N~61mq%-tcTppc?70G7y=0+GU@#!R^f5SpWy^dE^m?K?{5*RR znDI@B(ez2AIB6h3E$(VmNLo@!O-ZsGjFD9JjjbmDS1j1|VN>b?0nB}jJuPR^XC&syr`DsT0QAsZahw6l8jigB9j zOGr1DUZ!O#JQ?Fl(PVyZXjDW98QKb428XHjZd`=z)1Lv;pV}2)k9s*$HA?`mwhfrk zW`FPRKN|e5AtX$Ym86B@G0uEJV8RgljVj8bEmo|7+iv#tlD z5ZPHWSHFZ2Kf#NKtfAGdNFwWK{YWq5vlNRAo*VP1VsP?IPuR8>rmzFb%K3Wv(GUwR z-de1dt#x`%uWg<5wn*1`sT>Mnao|Lk>u0f=hcj=(*ed-PsLaFFO3_2V^s%V%Iu0B3?ZGVo7)mTec3vm>-hQ?>!o$l4TmBr0j-f$Fqap%DGKhf8Ei0)iYiwV>t z?#c5a2CulqTfj4#x`rcZ-I`M7!OFgfjcTla3j*PEE;mlMpKyt@`i`jmQMBGT7ci1i zuXyEsMp^*2q@%@aac?`a@yqQdX}`hKIXOG*iMS-Vo{}z=DspEhhzib5=i`r+TTJog z6Xrz(THClLv}X3vX`(&-ZGTY+$9*i-D#(TrmL^!8n0 z?M_+X4_d#JY5m;q{#Jkm9Pa6nwqF~=OoFV5AS?1?I1cS|w=*NYcO3x)c z5C2=o6B$8OS~WQYLQMq7=IO5RROoV3eq8Ah7dviH*Ot&o6~B)e2$P}sJ~lj?r9cK;#vy4e0?EFm z9m1g2khsTX)wgvsg(M(k!?LRDRrj2Eh_m&?gzE5(wRl}S-F0B#8A545+X=L)6fT!1)&`Xtw*yt~pB++F ztK7hY<4&!bA1y9IFAh06W%In3d7lR$$on!oEV>l&GEqL&xX}R z%wgsJoz0s4#SQVm@*)e9k3Bep?D?EkPL_FR>#KSG_J)HoYD`~r z;Kf$GOhhSx)sYM5x2IjMAQx8=y5zjnz-Ffwqv5`|nqOFB-ycBiD}9cw0%T{s;66@~ zC3(2dT@p}GeI6OOjeq~lJ%J8Kf@)fYCQZttX`MOZju^Q%n6W|#j@O^Px;~v<`aEm7 zb(L)X{{k|-xIbL^AK||VYo#U{4s#XWWrE{JGu{;RZzQXK`f>=qn7ZaIaf_%+mZ~(k z7*9u)t*!Oj)O<e&1#TWJY7a2>sSnTYyl>-Pko5BXKRiECS3{~59FoAfn|-rtrb zx93!4>(gVYyDy@fND!IhA2Lb4-Dk-BmAr4@wzn9ST*In7A#j?Q zF+1Y=ui4WyY&SDuDKG^>I%v~aoLjL*?L zWpfVz*SYw_^cZw%Z8ZN;qS^sQAE;9TWeLB^h9Mq=ymzzgVf`Oa7T6#O=VzEGBi#!jUSRGznGeHS|e^nQt>e54RTGshSMi#AfWC&u_W{oNnEF{C(P^8~W;T zl0d#vO=i^gaCw$$gH$7vZUcJSF2N*C$-BF|712i-uk&fnx9}!c&rnn|kQW1Tr^v88 z*B7_yr)B#yYF|fsW(l`FM5%w#p)cP@0;K*Jw|5(%K7tE;004DK(06En zM>Vm-YXksF)ujfkU=e^06{bA6T>RvGnE!Q~?fPuK8erUTtT@{J=fGiN6>R*thx9#U zdoetLe+Kb*uUL6ufu8|)w2AY0ubEILxm9@&@vUqhEtbf)Sf@Uw!C_qC5}pQMQo|Jk z34H_QPO+TVxC?tPPn*MO2b&rwAmOO}q4Twy@8Pw#-TPt#WrjKtLKsO2B)R8$rmI*` zqZnrOk!vzT^@UDpN_jPvf8epio-x|3=U3<%DmS?K_?3MqM77f;?%^_sW1-Z=r)v-m z%sWV@mRr}qabcY4AbLwaYMC!_XNR~H5p=9Y#PkinMv}wahl{wHZvT{vqTSQ)zD|1w z35S8s0^a8~VS*_(h@}Q70-#)OiM7|6M658)HM&I9=1lpee?&Ee32t@*RaI$d+^weH z3#lZM+(dDR(1NnZJ~%N4B|?oKe@>6oK@W7K)bB6lpL|+OibW^ay)cwgN{NFKPtuGo zgC2&)S0=cgbAO7kp%ia$`0g&>N7$38mUWOA+UU@jTN|4H35 z2mb0QdGvL5;IGT?ogd@f4_g`61JruZtcBE!9|-`N_fyf7m596wRfkIH{t6dF=Y)w3 z*F4iFCya=4^0e!{VHn71@rUjz&f@P@6fN{PcwhL=FTIC=3xOb4E`%b+4Gd&9)xA|OUIOn2_@T4gwNTh8qg_6uo7z0jSTPefVhd!G3i@kea zhiVYvY|j1nJb!2$z7P!(MYm2Wn2Fs0|H4&0s?UDgaW68o`y_nFo=*XS$gQ6BTHaEJ zPy%PcGh(;mhi6x(MaEo@iuUFiJ6}Jo<|_58J9Q6RA)hee+=>$SMX-MeJzsCLO>L1P z&522XXlSAAzZD*R1M!ucj>M7inTSCAjyUR~BM?NW!^n~!M0^r)OAcJ1E_`;=k(yV@ zzjg9My1xR#+f2>iZR?$H@@ z9(f6v-{DL=Ou=sSW1H*ubjfD6x|qCI%pr#zYU12nk(G_=s`qK&A2+5|U0A2&LdIo) z@wsfR78aU|a5=~(OMbbdBGDdmATtqR1Y**ZEaA(%iCoJk#K%d<&Clijsk|*T^~Aa| zG#|FWzi(dljTxc6Gfi67UDs*num*U7pgZ@Y#etx|Mfsplq;C03qufQPVN3pGzPw>_)^_Rz+^(UdKG`Zy= zbrd4`0baR~<@;WrfARJv`n0Y+#ZwD| zU&^U_1%;P@%TE$2bS1<&qLlzdfS0L_DaO#my%6xp0PIQgH$Tew39seu-KsPTjTj?g zT?MC`q*r2H8XE3`kl-7IqrDQBQJmMIEXlVTju5yQ;KaRt-^{EY{11|5P53lenzr^D z5q=`-cRdaq696K1UO;SGVcUQpJU_|nk=VS;cjK_f7y0qX3Bf8Mpdl<(b_k}cx+V@3&BJ#SVN2A?<^VTrUZQk(+wu)85an(nb8 zUl)R!26+0%o^(PH?H#j^vIf*qe08Pnk3Q&W@29E5-_p=1^Ud_KFWkv}< z%B1>}`f{P8DfQ1ZcG^nHLnh~{VHf{LNl6#kW!CJ}%4 zv-c)eJ`4;jA^h%$9G&Q@F#}NrOMq7d1^cHon*XJ}+8{!#=wADX63o6}qYOT2KBebq zB!F>nzh3Yrz4br`e@kj19Kt{Z@ixWQVJiCd{8l}1CC{TXHO1*QQ zC}H)zqah1R5W;G>q5 zT11IxDP=qc-)+(P4AJnH+?x5@lHgFENEUJgbB3>3vmkl@m$AHoKEn~Ccpr9RU^^k& zU!U79XC<7j;a~O{M7T#d3osp3o4Iz^vH_~H5{*W{UPB_NXYgbXC!Y@qiv!PWO&DL@ zXU=dX_yn~~XZJVspwo2d^tYhib5VoY?*nUnv@Oc7qRJK!Y&!^p7H*Smfld#&)s^;tmn8#F^cA2yC?6@lo2wD zfP-AE0mOPn_jo9Ay}#UQEsxOZy>`}9b6Yx|(Zn2uoB#mtKohRs zx2x`o4mSBkZ?vFlYHGbPH;Osbp%O+9eJ6WwE?+0pwwb+y2w*nq5)|sC>4^3poN!bY zXDUjAEqPp5&B{ADgcZa27!;pGkj1@5C_!jRfa6F|CF~sv#gbNf5UezYI%Xe(z)_+^ zgf>9OdWmaa55WwGQ~E{I!@&4PlOV6iBj)DM%_mb|Yo^lAPf_z*Vz3B}xvW#5DQ<))5L z`sT6+*a541X{zH1l0*wxzf1$%gPY)ic+*1$vkgVBBTLO!ZV~Zs3qxjBv`B$SUr=mB zxJyTD0NgTOOyPf@e#D%1aUIolruDr8JThgMiR5uAqriNwkH6lh6b~r&?^p<5gj;7J z?gmOl8?R`;N7cfX8*};c3XQkv(681eTiewn&(q%Zyz`d=>U>Quk4T(LPH;?r_b~@f zVx?Keu^5SmYNYGY{t7!=p(!R?qe;t~ecEl|E38#MU->sidz|RniZLplTnTR}xCa4* z{NSHw215~@JN?Br0=gyfv6n*LqZ^je5+E?yI|x+h`#D;=zHzmuJPVUXA+)AWAbQna zFD(+c$ctJhC3unRBdC+iBaP+MJ+xQ1y?Qis^dE-s@j!FZGkb)1gN|gHKK1AaU7T{4 zi%{>6JPWP?cQTIr4^0B;YA^w}sAitdQyB&W<*nUopg-VW z_(Y+{+h?c>zcbJg>Ov+!kOK49nKbWB^fVlV4IzvxO>KggdyxqaNS97jvkgQI%{hen z@W;)M-&(g5i?1s?HhkB^L@FN}ohtLJWc2AK@g_qO8we8Ark5z>IuFCurHqWmc|W#c zu++KzjE}ExP86!zRIGUR3PW1F4ISuj+LPs|^J-OMrMab$QaETj%+&bvR_84$SmvV> zer|xD;&%dGwveEK4Yx)-(~(`D>pA^7rKu<6x!1i^(7yn=qVA1Jk{uyL=L@pG+41iq ztfL}&?d%Q9Q(GXqDlwRm=# zJ^J7FemE@UZ`(5;txkFif^#I;v;lhr0|`rHFC85Up z_xYyi*}%7Aes-%^EU&sYlzUR9g-=p)lEVCB;JfuQdtc8bYL1)W06KZes03f~+PKLAdCdDr4_+?A0)K#} zQ>LzFxwDm0q^|N;;1;LGy?z?fWIqkudFNAapXHyQ15=5=?*<$*+|H8 zdGMo-I9x|JE~G>oT7?2W!-AN-Tk|_?hi3GPrLpHvMy!3_Y<{lLushl>c{a6t9&+&vQYT~M~bMm)6qYsX)s$}aCP*g^W(*IX3Dt8tg`CxZK160-~9 zq?TTXYf{`FBc@B8z_f!M$VbkEg&S@dJKJayiHtc4)RDEc^$)F)q$n zAYb0DE^O^~yjb0C7YEDPB_q=LQ~P+)s?;`&|79s>qffI^|?fc-2->R1kd zhESU&X=mNLw~d^H zKDhBXssz5brAa>Z?84sFbzox<5Y#?)uU+;C_=={qUlkv6lpf-=(fQ&4Y1|9+>PLzcBM@(C zs(Q<81+?)b_&#`Bz}4~9*b8e>sHM-egR9=5ui^!||7YcOpeI4JC6En_5OH6NgTU4Z zE81>5Ly|eNfITzxY>xMY+MUFY9eM;W{Nm3BW0yGB$3ur74LLa@#Ash~bdmotLAeQo zVZ+yxqadzcE%cRD6IP7Tx|?eYz+V9N0Z04W$azO=%Y`#uF5d?wBBX$*sd4y5n@;Q zmjEh$W>h@n?32|xf@@I%F9G_K=lGaB5gJJ%`4s{LGTKaxu*dJcWKUL_?g*jaGEDZUGuVv+SV^8p4)drEZW6-bX&#!BoLRnAC5+J6#O^^yeSit z`6;vh!6Z-ag9kmX0Knx%0|2EgxY^TGoQrNMf2x3eJMtJNwP|<=?tjxW==X0{HTGRj zLd5MC(i@3ac6XWZ7#%6*Hb)#N9-4czQ5%olHx88`3M6W9r?9A^iTsVe2ejzc&fzrN zQTn#;?}hml4L`a=B3KL8iZWrM;eCikt zDicbqnMbcw;{b&}e0gmIPb>n{!Rt%F&nF}0p_ABfF?iHLgVH(I&z1`U+1~pw;4*nW z=rz25c_7l{zF{!ot%=Dlozbn!)bZ69R_jSktqZ@Tk70HG<-j?=m1X2#9wHQQ@pzVG zMEBI%9dSp?m^tUqPZ*yOG8VQ^4?V38&GBn)(T(HNd+KypF>Dpc0ybr#KmHE%Fv0!* z|Ea*k#orSUG2SvJR>h+|!Xv}4C7)S|zo0OvjHuA+CL!*AbE^3ImCaO@QT{(kc$9r) z{lrSv`EO82G?8YnRO(%)CR;X$H3#Kmq>|-)Cd8jw@4Qd5s*mgxhMMnKhM1%?w5PMo!w`5 zXJ%)1XZG2hpX#s$+pbEvB7RrJMDC4WG?>Uz^?+FVeO_^8Gz^vYaE*ln5@Z6tLELeW zPsosNd-dXUc#Zc#Z7~pDZgOg()?P(4p>~HXd z*x(EwuUHxq{W^sq^$9g*5)Vo?-Ei@I1A$3ZanSFUXnmO)KD7?nk$m)5LNr=E3!lO9 zAwgs(_EK5O*fZ2m>AEL(RST3;;v;2MYhdoKKsPWjb$q4GQFmbULq=l zYBHc5-dpH8x};hMk+pEK@Hwiigg3r5qvF<;+j!izJCv>Am$Yue5bnWrSO{1x*OJ9h|U;YCiNG>`k0%lY3c04U^~VGqcYs|kC` zug$)X4)nJ}1Bb@E3fsOG&t*Ga7fenri1ciCdC&j4oUrnP1N9B<*4Y)DE+r9@aRL@X zk=Ie;wFy#v4v8Cls$XEF=cMq6*>!eCarE*8;-VX{n8B#aVaSz!3%o&YT8$Il@&H6$ z!UDjvLgtkyhR7$Bh3s4zNLGS$%XFiB`1;JjS4fa3>V?}t+|)YaD>JKX@5VifXK zR{e+lqjsfx8!K43HY;DX{&33|fAUXMgR3L;A5wYorMv_j-$~723=JjM-IKPzI)-Ko zy2tRi_OSN6FLT0$`IZ_v9DOCj>35L8yS^q~q;BP)CV8OfZR>s`i`(&f+;k=CHQW`S zn}I_q#5F6`wD7L3IH%a*;Rf@SK@ZnQHkeDCHLhagh&aQ2N>tVHP5W40iq!*b^ROpc z;((UwWOhA1c0-?bp7>RlrEyivB~S*oY)MRD*L|dK7t%;gN=Mgc;hUZd*)nj_v;S}h zoZp#dn$6`C#4MNf0{q_zm%nCt>ofQXBfE_0TiP^dPw^e9kU5ZWTWT?G`x||5#=_IBuj7rdiLSD!+QIBq zsh?z>cy4q!K67+CDI@14m*Sqb*#}2&%N3)9vL!>T!^8{mPackZWvw>>$aC_EcFe=p~Q%LempaFSj zr;iMJ%jHF&y7Y|Tx3*HNnC*9kpOhvExK}X+x+-g$9f2Bfo-*-@+-ie(l?89~fUu^Y zKegjAj4ZbIGQwK$Ki%OQA5H-i*MQYf_)jCct-Wr;%wAh|F2h|t#yi80*>I9_!-MkK zfBY19*{X1&Qn7~VeB}yjKl3uU(;6@C#wCetpLQLgk6Z(#!5ec@>NjG_9}pBP&BA)Z zn4AT2qCntj<;J^|O9T($9f%G+xEhCp*`lyp6^=~bx4>;}_Bg>7u7H62A}yKk_tOdS zDsOO}z(!L9cGw;btK%2J4>9eJ$-&SuiMMn?-{pAIVvgdIZ~+5L-BW|DCn-}?D>p3i zG&5`c3LkO=+leDafcpczh|sX;ejeN>Rd`W)pWKRmnHl%-cc%#nWfVh!5ZIQ3A7kNT zg64zf?$a?nJ_|8=oLUgQ4lQVM^9v~H-7fwJu-pgfH+16lMDI?LW@oVzfVb!LB9zx| zBl5Pa(BBF&2R#uJ7EqyMmVco0(!ng$AU=#13rq$o)cpq|M>1Vvy7gWbH5Qij@q^jf zn}TL(6+HRBf}g=$e_5;BujVCs>9J5?Vn@ftB|4$*$jDXeqBAl=yo-^EDel?k@uimp zl%MSfd*tyv`q-wHh28~C=Pd5V>DeZdwhyiko&f7I`q*RVLO=QJ>vK2Tv<=QFZob=t zw}Fcq3-QL-82zC{m*oJl`u&X^^yh~w_z&qkER4JVC;k8Uh>{eV8}3~0%awf|=Dt3P zJv}dnnomo`ND9eZUkSlZPT(~4y0X}Qmp%eZi>?n$(R`h5zd>rU%2ZSkT2Q@MO^ili zNr_@;fum9M-CKb)8JGsgrkjBl1oe^3B|e@rR2m!svRovz`@O>@tb(ZRYgiQwh@f;*hz z$bH(WQ#=hb0tEG|uG5F48lua~t?A35hn}a(B8WVvu>Bf3CMFJ4;^Uv^?j?kS@vU5Q`D@M?|G=r zI_7Dq#V6RnLCOUez`hx^#**5+Sh^jTZymoLdx=1zzNl4>to9%UB^p`AZ_r%4a6ukA zt**$gu{-Y&r5P|~_+^>OYZ9fUjNM+j$SzfDg$r*+^}5=kj$Om=S_sBlZt-<1REJ4W z-X*Z55G%1muA+Ee>~+p zW{`+=-b|Pa)&6{M+iP(-#Qk@bD4o@QE~a??`|4_&p^_eQUXEG51gZ7NmQNDRs``OM02XewO`2i+&PZ8I{oJK;ryz6HT87)abJo1<=fhs^<=u z27pULP^fOMMqui3vwY?Wt*whaflK}diJd7mPZ$sWo&=YZ-Y=2rfvxr%-&`d3<7R&x zkKB8)5D~0*LE*$L>Ec#qWS&rzPzlHU*Nq2tO8?jk2yR^@Kw#xFD2^guDa*i3iGiUZ zF}Sx)akx z%4vbYKniMMNM5D0gdZ=}aCOrDj)+u9wX5wuWI)|(9z~QK_(ZWfWs@=qhRkno$Vv_X-XQepU~pMVT=qHmVdv zT8RM+5#AVHDN9q+q#wtdi%v(YNo!#IraN~wL@nVDTpCHI9!xZ6qvhbF1X8MVsI=?$ zP3H_jK-q|LhU~o5-ednfxOTpQvs_$q#Cy8S)f$GR9c_d<1IvB{m;O#_xDCihQM6dP zR`FrOb$3N*Q*->bmkz0dquN^1-ZVs~Spll(oHE#IRpeAMcai-_zUh%oHmwo#-EunC zAB02H*afFg!Iph%fqq&fO{v{lw^J>d_#{9TbPr_f+XXOq2dLI$c&_^@q@{&OG2X^?> zh4#L_g%?4)VnW2vxD=mhD*-*Iy>Hv{pR}on$9RE)E7<0|AZps2`o6kA?mzB*xDWRsVi`U*S++UHA`DMTVps(900gN2ps}u}K^Euhk zG}RbU2IQ#E4Bb;7E97UTBL<9_YN&nOE)`PB@ZY@Mmu*((i(~59IXpIOQH$QP@-ecq z`P2Wr{evE{VJ0nt{11JF>RV|w>zt48HRB)~>kby#VcfP>2=bcWD5ui&WOL_{w{>jZ zaXFu>)+2T!ai-zxKErLASaNgEV|}KkwyQVQY$Xk}pgt35wY6{wYp9QDkKhuNn)@!7 z|LIWK=e4xwo;{ngWbs=H?AhP<_$=Qjf8t4y>eZ$1lh5Cb?|+wa^T1bcqF->K_?31| zTM|#Q-eC&1c#M4}W{HgXHe$z-&6*V(knlznMAX}}*qK)}WG?44E__?;)%?~LDAP@k zl{w(u8`BApOt^Xr({1|jgR{wQ?;@Hm!wbMbPJ)SiH#xfB9m((~q@pYTL#%d|{kZ`L zIluRwxFX1bF~?ylZe%WQWPvqqU5nez`pD^{pem_u>Z z_)^h1O7U^4b$QX(fR)8H5TiYL`Q9Ja7`yp*uSeZ*eH)MN=cuP07 z!`zj)Rrcr_#N-PS%xwN8Vz=np%hU(@hIb|f`B2R7Ctm19u#}dX$hg*#MA||*GfS%H z0FxgcwGK@P@ljB9?{Xe>%;JJ*HUqvF|2g2nhxm@H%_05Lz}Q><>nr8 zREyK!oO;?~vcTuYgMs4)A@^L*$NZaAaDNsP zr{F{R+_!-MDpPJC^0T(K_ln)wY*9$hPYXcbtE!3$uC?!b*Wn}4{;ccQXWbtCq@aUl93#^wJidyQ7*hh( zi|or1qBP!@nY5HDvAwlLXtJ{e47=6M*KYj?r)Ekdu<>w?JE;<;+Xx)ie$Sdjd8jZA ztBH#7NsDL%311bHEKZQchSURMq#CDg0LY`6XbcQo*`t97CWxmf%n}~Zp0b2EKV^Z~ z_&hBt2j<>zZyMc^l_M6bUX*$<2kchV#qX?R2gFt9*a))wS8g-EEL(c*Lz>%ENh>ij zzxQe`{pa8yL*mIYIk~i-9Nvz@Y;VKbCv2H}Tw zgD%}hUy4A=F6zh7mYhw2*Osa z;EMILZb+{gUQI}FAdDC zhs^`HU6^6v5j~X5h7sC>45NWcel5h4%k7njhE7vSf2^a8^)zhYHe9$_Sw3ts%G~C$ zd1V=~vmN%;<8U~LFE>r}=>!L;>5L7uG}qu&(@3pp7oyhk{xPOrh_F&SU?8OBA zUJ%EICEk>;wiPkteqH{8vEPr^dvwz+J^2X-bAe@2CKEyuGV+(WUj91rr~sG z^u478gYu(fj!t#1=%ksF?Pj_pK5^=kpHdsT_p>4qYM#)JyHHHcr1c#*?GooAPvOJ9 zJSD^ESH4dM6XOzeF>U@5&!^3%^^<&l$C;cct+kcVIRE~pHl*ctXwsYulo!;2-QW^y zye4$q%L0iW9!3z4g7Hg=Gz0fxyDZfZjb5Lr^<8)enV5#cvotO7`4)*Mm9|%I-P2VgD%Z{& zhE{Sfb7lNu#LMHb5xm`!k|WV30eCy;9!b;UY4{Gw4tOFgY=Z3ltH=xvg&HbGlYKsH zh;B;M#YfoSHABww{7oT~{u^Gk|Ke}|VgPw&M#i+Xq$EZ!o=>DT!EBj>Sc~;7A^XaO zxP{-A(Xfz9gBqqqy%yPLl#yFh6yCCwSeUZI>}rgdS>R>Ln%pW7%ayqoQEbhOXneAc zU`t4VYw$-vy%?Rx&a2?rT^sza6Dhy5a4k!SF;sde-@kwVV-BdG zLo-?~>IIW{Xdb;r$lY;LYbfOyYKQ@|%v0zUdSwvy6Zn8i+g4O%jYcPdKI+if(CHLEe%}M(k(ZG_K9ag}{U67bftDN}EMxuMIs_0ba*ROAKWB(PXaU z?6m}@GQbH6J)oo_@Meyayg)Q|EGs)(!AH2^_?IrB(mW!WzP0B=ClKUX`8@W5fb)gG z@|C#7epWwBw!tj7tH-UbN}Vaq*E(-$09HDhTNY&ASVbFtQUV93eAPVc?Ci8Hvjxp! z-{Gf3w5}A=z4h&5rRDqCLSv{ z?WTE@OedRpU^L{el(-vVKXe1~VYR#?v-QiU8XSL8?4pqrC%ZODctqOdSsSD4f1v&v zEbO=6u$f(VnW$=YXX@M+3vQ;Hk+(B&-nbE7!rPO0YmAnjW;j#EZHxhQdbF!j*ogX6oetiE^WrYW=DjngIWWWech z*f_O^X~UM7=cAh72!=%MiHg%%LCpm29*t z7@Lx-S6`eGpx$@Q%yN{JTkGIM!zrOW7#E_o-M{3cY~$Zvun~Jm5cUVNYKB?W2evN!GXJ1AB9%@e%1MvJqT`tO#*dKNG8+AThR&T4#edj`B&4q?Ew0iz zD*;N`!d1%&4=-}seHu+!L??NumW`16L?pTS_OBTq&&6nSRLjQI|e9GKD|zhkEB*M#D-f zQSX>;DImK|8Y z62@-P8Pa>!0KcB9e~9qvZanoVyUbKc7x(+fyLggCl(V zg`iQ{A)e!_Nk~*}>$5Uk<_KO+>ad|>iWXDRkiA(yo^JLpkFH|wbL0Uz3~pLXUru*v z(gU&z0gz5oa*yw0h-ad8a@SMMHsG^$?jXHqt=zjNi?gX5=ymk+!FH3yVpjI2{d0p` z^3^`}_G>>kYFtR8S4iWdpKwFN!$}J@ujW^4aiQqpGS+!g?W7e)@HmGx?qK>Tl8&gz z?YH#c+yM9O;T9XseUr`p@#Z#xQq{UV|h7c_H)x~T(&~PKT5gTlWF}hH1#l%L1F(7Q< z0qBZvc(zE}FMuEnoed{EN>rg*qxU_23(MfY$Z^X?YiqnaYu##_{ylmo8ft|+KC&Yz0=v?_VJXyU)qo^+Gyx-?fCs>a3Zv;lJ@;BJDEY;c@>V@Mr5 z?)&JXEQbkKup^?PML`AiPHaAYOhPoFbXfL?BP#7E9z*l3mkCdn>jrdQ2P^Ow&WfLa z>WJY0V8|gIH!x;|;~IG^pUQWuzLp?DV}3%F{&}NT>*>K_gV&vtS|l5&l;n2;G7d2| zh;ILCzM|er)SjvmWuNJ+ycecuRuMpXZgcUsu4m(>s=vOM7XPFTKgsw$vHAq`Ltr9< zjC__GE-`&EWk+dH66L%?X)9~&Q*5}*bQ>nsla!R8_mIDDtHcZA5p+?zTC~$|Q%l?x zhM7_zo0#6%tu332U>?ma@>Ub(g@bo^TJS4zgoDkE4VKwQL;MNi?!2B0Cr&c9DOyuh z#DcTRcAG$^62>LjOYk42Ul2jVEr2d4tcwRIv25;-ya0wHe&V1W!?vRHy{!e}& zSSRmX7;;B@!j7|m93gui0{r|-8S?rRnJS`s_@E8&^TUo4gI`w<+o(aub=}>p@&k0j zQdfoCUVlc}T+E*yZ6@?Y$%LXyh-HV96O@h4-riiR!Gbh{9byk)xF1`AJZnbqt!*h8 z8JXy2=BQOEGi7FfNk5BVGx?CI^R+X(ANk5m%F=OHqj?2Yyo6v%bz3WEZucc8-=keG zm^4|Q2&f#Za^x=rlKi6=1~;`rNa`D4EM9%>a$!deni9b)2Pg|E#h^b^=IEQ8k`+H! z#BReh7or9)WHI)ct&6!&oeW7Y?>5pS_NYoq%0Bvz{z%ufq4HLJHC6R2lo@=TlZX0I z=Yb+MFkDsUkSLep?mDkfhCP^W^8ZWxsMzy3pG*DIVMh325NWr2nEE>VZ$t)7c?~<* z1ilpMX_m6kapWNxw?M@i7@GBZe@@H4RWeZ^Hf z44lcTiC#vM{@Atw?2mqO9J~x^8*4MA*Aj5qNopjTjo=Eh(xlOX@bGW7I`T8QF z_m|f>SjX`ae;=#mb9wMUh|eKMYc5&KD1Y!r{M4bDm9g%i8ieG~e{h?cJrm^r-QK>C zq>6o^E3yMRPg;NtCi6oGUK}I_KUY zVG4`31UV$RpWA(JI;h4!YT$f9+qL;VA#0XU9#95yYWYMz!=OzvCZ*;fyD1@#X_xV3p{LX6*L!NVJ|I0G7Q4e{5fF}%oHeWUB zjB0_XYl`;}V*}zi1H<(e2#JjaAlo)CWCS?-dgpfR;Nmfsm6W3#7@vq(3Z-5n(p=3W zZ2X|k4$+X8dq#b07Ip~gDWS4C*B4if8BV;V*gbxb>i=L>j-7`WXVB`pR`ofW(|ruJ zTCmWV=mxiG5U>fC5C zW9m&s<9N8E^L~Y=nm#X_tmYY)lvx6DaC${O0?EcrJ}psLgP73=w;dv%HIBr*3G4E# zB5Phby1SJg$?&{&y{p*mJZvM%wo&u9t5k6gNi&1Z`<*B6Jov!! z6Nd*_#w71tc?*Ep1kSqEozzhWEJtwArhQu9lwk*#JkbvC=Bn#R583ePZ4__j4f{t# z#SCD(c;7!$%L%H(l&r($*V|M0*zI+Jpq$FjL$^PgvQ>nS3(=xsk+!cl^H3dFwqaU3 z%=GOfrMs!;uFK`G8t>0Z?`7)d3jCs*bbflZ3c~Yjz5l(=w0FWI@$>o;G;=8fk!4KK@JkDEY{05-z_p)ftS_eRx=sATGRP<>0IhnL=k z-BwY$-&z3XTo-MbENi-ldJNDqkeUgSMA9YMONWRMB>Z59ypNI~D79NxZoSKWm-^jK zfFWeGjxD3wtKuq^QWvX9Okph3dYm@$!Dfhg$rv9qEqVRErcS?i zuG@Bd#dWaCG1-9U;4*nBq-5I@H!2$ET%f%=|`{I2pyMLR)y(cwuk7%+QaXaqVA*UyQ zznt_PshRNbR*=12_Pos#UL>!X-vPe6lFl9RVn5>K9^ZF&UpluR(uWId(EupTIXf8@DQF`SW2Ny7**H{W8)6Ut%vsDk@legx|T zlKUQ0Z|BoKtgZJQR`v)dm1Q6B^IOpQ?(@EizV6AdiA{@~SO>(s1@K~T@{aB8z zBtFOw+QFmcf6CQ@&3lNnTo2lz^|^Om-`DNgLYwlp@TRFcl>6!gob9+AMFdlLE2|7J zG4EV=5JOigw|$vmx-gwA+3_3JNBuSy+#)DpMrq96S5H0+8R3gU$)~iRZZRhOi{ExZ zpg(>uc_dUOD86`J@S`inlar(TL5!dvyX5!lU6Iv=CJ=w+#kOAG>&$l!qn%9gG9~4lLRei{=SM zvtKImVAoRTCik#sc@um?M5=wl zK3eV3iriJipT8VdA^nz0Xti29U2m^Puz6&8KL@e?T;WwM?Zy&GBpoH0D$69ykLZo5 z@X35y=L|0B150Ej(7A1t7&EIGLB312PMtS~I_+GH&Q~^(yVOorK8#z!r7-0U2!}hm zEI#fA1u}oD6)C8782FGDl!Nf}#2PhFq&m1-tWY9nr1aeI3MwLv5zm&DT-=|cNmEU!|_0;EG;ZD#&ly1ZB$h?|-|J+;5&etH(nf-G$Fk|=)fjX_P?WuL7H4n`rBK-|97af7gm znN85ih(8QB=QUhxnRC!5kPDv{q`Gt0I+N|e9gbgR2Ok;rHYM9Aw_~7uV$qELYM0a= zPg=wD^r+ZxiWsr8l4I7%*CTxHY43J6DrxTi#Ixl_fr8~Mnge|HB`;f3C*ym+M@RGv z7;-3ot+V?HQo4ubJU9#nL%-`qirZCXXy`<$C@Uvueti&e$K}R7H9l;HS-fP(@rZ$L1iRj&!n}Al}R#|+t6HVJxcX_IRr$q3&XtQ(=Bg^ zz1Mnt3#)F6m59$V5Tz2lGuf&M@Zk9{m}kX^jnD7@vq39WU;K?-tBx5G&D1U+b5p7p z@^SkD^?ftN#EhSn?YG^&(uJC@-RAt-2e0CHR>k7m4}E^JrwnACn;VO*y#Ol#?fg_7 zP|6$SL4HyW2mxzDP4a#z>HbhC9DfG#S4=ZyxKd63wO@klMr+`sj;~6=3bhZW9I|l2 z?PF=)MF!|^O$2ui5rg14f~q{B#YCJaOgr@vEQMBh*uDqHMEKtBEVi`cyhy+6JQFMtlsAWWDNZ8B=tY95ri)F>P8 zHRfOX2(JhGa=xhdZkph`&&xd1xS1d2D34~sK=O+liCLt;20~Aol}ivxRn@&4kH^Fe)Ma zw|0K_`7R(NEr@FG;K6Kuxx~=QsP6)CigG802@9n(sIaTcCwt#E zL4XVw$2=8|;V}LNq-V&vD!6@l)E$nL4(PCSx9`32%o+3Oboo@mU~Az@!cZuFE5u&a zAH1lm@^Xsg`L}Cr9@Lx)KR80XJ#X_Ry#%W$T9Y(AU#^9%-TAqy#x!Me1QPWi%z}pa zjL@DH?}6_CxScjZs!xYau3Ho1hq_DVA-#lrNfr1f#TL;!i|^7pdm}gs=`LWg2J9qh zT|EK|sO8|^a6UBt5NB{lmG~;)_`|lqaP!PXZUbLm2Rh)Qpizyu`EHyt^MQmQA!xTc zUa52_VpCGn(1F=}KmT*2#IP)Eaj15%B3)dLW;K z^iJY^*=84UKmvFk1L@aKXftS6|AA~}H41#+`)#V)b=~{jHwUhOb`{f!6>ABfxb=$r zx!S?2_N1QJ2e}W4*!P8mafV4o_O__v!dY2Mu;8sQW=r>hXPJSp+sM|4nQ2H;?#3HY zAYGgXOfye;LdVarZfj!W+0TQV>-3acXdmqILQ0Sv{c4w<@g!QWD&&=w!-IF za?Z49RY=y*VvD-Z~YDrWua zu}=P(CpDvZsRyF77x0R6Jq;$1C$HK~F?d4UTv0y-neiYOzKk7YKNR!dS7o)tU_;|h zF><+1l`SvNF5Q-?bNxP$o%=Z-C@FZO>K2W@vIVe16&~R3d8(*`owwodLkF+0_Dz~r zzInssY_*b%OA(J`&$6Ksq#mz9-8d|cJAyoJymmYQz4mpaz2o!+n1^Plpz$>rcIdh< zhY*%mLU`O&!EM}M7OL6b2aKael)qO5ZWQXe@M7Lu8Mb@L0Z+^xGW~=$b>L?`T&c2wR(O zr3|=OiFi>&+VY3ij>(rjRN`X}hVKRSnJvy_&HeZ@HenZFFC3Zojyjc(XHIcxA@S~M z)%aa{pZ3HcLif=1=%hQ$VVj=8$G_CXS$5<-Cwx~sV~%zWoTSm5uBTqkFP$k^lB?u>@`LPsL$8kNhiBD*daOCQL?K(c27n# zflSe%=!e(PF(m^|5J>Os#wke0}G_fxI|@PT(qEH51v$a5211|1Db&7a>z2)0-`9hJfzf0%R22WZ zyN7LseM$<&dKi3D&+*lcemNvw!eHod=F4vfKaEJL90gp->yyJ^8mSFyJiWp2EtY zu#unvFB^IsomWFqC>2b0@M3StkRjBsdO}1i1AZ@z^ZYR>Y$6b+!QC z_sg?>jgWY*uu7mtXL0k1IFMYJs)Bm2kvSPdFyCsSId`i>s0~~JL}tH_T8d0Mr~=C; zdi@5}W9&ZtD2RmioI1lL@w3(>3g)~k2_bW@Ik~Rqy~H1*2Lu#lgU@mi1`e2K=U-3% zYoVFv=DS_`lL3T4(Z5x_Fj+0evAw}VU5T}mXed>$ob(~)*yP5?m*>Wjh6yVCh|B%~ znBsfu{7}CEzCV<0{kov+a#?=Q%70hQ-awqg*N2|PlD3-^a)1WQQ~wql3NS=@L_JV) z#C#96*|8Z3V7k;k0W?CWC_?{j|NrAlhZ@V)H7`x>%F7E; zZc&BR(gI_cI>FNJBFn4*DjC`~ZMf4d^noy$~DkR7@%*Dqw_iyiDYge8ci#5MLRM#a>h)`L)cYE->%eb;vU%(BJkt4c64T=o{hW4nSZykZ_v4hc!cP`YDSg`F3rey*OBndC_jAsR8%5_jkC9F%0tOZLAvj z4ERy?j5&|Rps}FdJfX|#270I$8$WaZI!x6=pDU4xN#KA;Sd%IpE;w6vD1U6qIxAZf z#q$(Me%CO7C_UDkNo0gFg~U~_t@B+H@_zR~H~vZM2=tahT)$n1dw{5gL;oGRfL8bf z;`gp>^P8-*&D_%S8fNexV=hk@#}g@Ux|vvYi>>Zw0EA_*cU)Giy2(~Ic})$`1p?&^ z4}nF@iDfV~@(|5$!y;70RJ+O4*q$duzw)}c&jGfS76y+C>b(#2^z>wnMD{FgdU+sK zxmAlakX%;=+cv{4hxtSYqyoRWzNG~~5b(0E=AzT|nH!!Cit9LEVvpf6f?ZP4O$%+Rgt!gAwQK<2e_p@a4EXjQY>zL3{QP`0`zT$-2pUFW$ePGg_;m~Ki1i`v;P=po^r3d>qy2U0^NKbmKgvwQRXtj z#MIm%yWVnGmuaI>A_PfyM?T3=9axG$&tIC*CC_{^IbJY@PoS)B*xSKeTZ_2z59_jQ z486z;UiqsG2^=(+QDB1_eqS_vTj1Dx;WjWlJUmcHSm3A(SSZ+?ct2})L0A#}VwOT! z+6e}{WC<%>g^%M}@}-1xuNGlTBlpI78 z%s(j8vFp_0;9ERM8ElfXRl6=U;2!X?Xk9q)qG-}3GwQN8RkZ%alXOKC2=gj7&%Kp#}Aj3?6mzx{P)tl{=Fn~#M$N#eCsuFzfZ{68J(J3t)OTIgVJF*f>H;_xoE^v71eCc8j5 z?wmm%zUk^(srtNEuN=P>!&n$fIL1lUybuv@n^c{@?{ZQFF+FF4M8EMxGF#U1);&dJ>v+2B9E_vA`KC7zjI zb;|JhejFC@x)jpexnZztPPNkfqhF829sKO0?A^s;_)LPBuBGgY382P-Y&I)eWGRx( z{8yF7XOIAFEkzshfpfC%Q4c7?EY=?-ZMYsEXN=t|95~$Kc|fL>^QFtMhorI~lD|!b2v_r~eWmf;xfbEMoDao9 zXI%TFZM-f`LL99|&xMu)x1mY$Jiw=?HJ|(5-pL`Xpm)R9b0v_9Ra=&6n{Djt&>;Bo zwL@?H@du73`rdgTzaCc3lGBP`)1Fta3FH0B4=FFF%)jE@5qqQlUhMnj?@&@&dJR19 zv4`51*{>{gFLaqD91q2VCy!^}yQvd7)jN@~X4k#<-J$wlXVHn+JJ0BSv^oLj6UtJ_tyc z=KQGLYT4V}j;$FlM}1wUVM8@frI17tF5MD z8aTVxMN;tSSB^-h=PyS=dR{J?&p4k|GPy{*-!SDRiE+WK2}8wvhwgo$mec4Pl}LPh zSF56Iz0tk&)6?+`|K^yx+`qa*rQZR>@)#Z@;cE~*Bv0Za6=yJA2>9LRw9v8Nef=#2 z78ZYYdsDryFmVHGM9A#Gr)FIb3U~JR8OVuZdTkt1*^jA>(0I6&lXv<_%hZi4=+mFDqh4WL>@NpY}$Z3jIfvYFM(OZd%PI&|^F3KGk zWwBoOKHxxy!qNM4)CPhcHo>2pm1JlM82@PA_;_@u7LK_p%ZpuP&_PbfJ~0h#2ahAe zE(mbQ!ym$((1m+p9R==VvY$q8Sb-(2XzrsIclh`fUtWTh0My4Z)2(Rs;QFqXK>a@l zk$}NvN*Y+n*kZZC=cMI`O(D80>&0!jHnNrMV9-bJu4q4IWFA3N^UHI{Nb%Sg2@N@47T@EDa~8L zVgb|ZElIC7$$g6GL@{F*zoXPS_!2W-CSR-I7>2U+FHSwBi|gw8L$#+fwun6XOvzV7 z9B5n18wZBsL6Iv3svZX33V~X8#j-@_R&#T5>JS1?eM~RjNDalvM;H zp=Sru1GAd`=o%Lv9ax)n+dUzoZq;Sk4q-_!@Tj-{IGe^-JB?{?^f=j;24}~C1}fHi z3Y?ENudM@qyDR$nSte%e;8F-Dr!y_fi(Sj^#L>m}(&K1pYzmMngP`61vWz?OJou8Y z7csw~3_WL&L^*?+EUW0p`7M-$mGAjPg$AL-nRAw_2>4Sv4k>x3F+AI+z%tp@wU+r! zbh#Q|wHX~l?L&O$4ez-qjf@=TET=y83shCy|hH{ zsYTRJ*nlIc2s8;%q{2C1L@c98ch0Er0hZ1Md2v~VI!&ME)Y$Wv+!GmaMO;kg0@~OT z7=7>&!~?uaO?&_u1b(zzQ@9A4C>rO>qMwFx;2*)-fUYtq8t8%l>8}`Zf3(c2l*nZ% zt>B(&Ptc*~abHXbVZVHFW<-$z!0nH`2#Jl`%JEc^nM1WuWp;2_-feR$gieNxQl0Mu zUflSU=Hm;}qhpIBM$d(J@r%>~iXrs^L=i6+XOZEWU0XYsktm$Ua5*g&zoq?BsV3J( zqj2+3oH`1Ny`+o|kC&_pYqdSnNE0vlbX<3JM8)9cH>!Icu=+aG-X(DY;`Ug9<8inl z`S-n8x)&Q_BXU-~Y#Xhw6$Vq9)X+sZGC9P#6KA1ubn1XZDR;Z&+j)a$$2&C;v||Tj zp6iidMn60t0wFPL|1lxW>okzp)gT8@`CAGfu2;vW^`U(&Ww?zy(n;(-`oe4$VZTd_yb9=kbR4Q2 zs#d}W8Mphf2$T4F`-`)iV;}YVjQj7MC3P%3nb|H-v95)O7kRa0g03-vZ=G$XS(m91 z?$o1jMPuDO-_|F8nyqxZQH~snvfqO6n}gVr15yrO(bJr4B(~&;#LclRQ`d#EdnmcK zzLDI!rB;nYgS_`yG;xMxH_ndJkl}=GWnXzW(t+V}(GPeVKE*3akAnt%c@5{#JWGs^ zO=_e#6a(go{Y8-&a690|7V#>t?u)sU9$n)|w54xMV-yQD1c~F*EzKpjjf))9&?$+wt?Cm^Oz(R@=7&3K{ z{7gaNOepB*V#W0O$vFBGassBPLEh$@^9DU?_37m+FQvhubfBE)UEc7Ej@-c)jn?%lhoAI@f7+WiXDaEaY$jWu1sVi>ITbbG4v z=2N5F2eAXEc@q4A#)r&}6q}{43I-EZ0f`+$$xjn(1>CcKj}pOzo!rsxCp&bYM^A*3 zCtc}aTVp$&h!Db0dyxg#iH1V`7$bE)5EsAf?~0@7C0hB+4Om1sicK1f^X0Y-bmJVm z5jEoxYneYN6R<1r`c^q%u0lyf@hF*AV1T$;>AXfob8CIbtp)R)(0iuaDOq^gEd=9# z6icgQ#GzP!GZn-30men(Y!DT$SWArC((NfG_vq7_1B}g#5X<%g`UEu$%O~J~@2nh>GrMxQw3s>3IKNNjw?h3hVQ# z3ke6857RR?;8jv`>fGeoFr#OyOtR0q*ODy1o;9?nWPV0XuTHVLm?WlbP3{;^?jqt9qbBgLn5bEzOQ|3WPZ%mLlLuMjV4!Huse-hw=w`84CG|q;KzeBdRWv zUV`#io`#w(OD{b-Dnt3Qw$3m7X$xw2vkpMKswkpUf?u#5rH*X;u0Wxd-v$h5GkVY? zv%>5)&f?oXEKSgtDb))5LmnjNF48(-yz+q;w~yW0)=u{MQNDwlGgGO}7vm`{oLV0K zWyw^eX@Zi~H!d8Lj}Rrz?9@r^f7BSB<@7j17E%bO7A$Mtz41D{7D(!g0TXzO082vj z_o%IvHZ6`C0~GVMLUGKVc@J(!;S=*;iY?nDqPhg+`5<2T-Cjs-Wz1gdslHctmFa10_YK@1-rQ_v3~ z7B}Z3&AuNQFmde5U9fv^SD6gdzfDgPB2zR$cV50kW@^4pl<2~qsxfmnNlhs(s{!DgVmT`vj$H~o!BL=7R7x5UGn|rd+uVpjA5%AWV6b|*HsEns%#}^%=z@(0_ zpL02jP3b`PS>j zo%1OqE@A4?dW#hU>%s_$&va@Mr7$BAYj*4Rc<}H^Z#^@8;VU4ksdI`XEZj3i>f&Yk zT*=F0bp)CBPk)ZbokCXVUupp@j3SE$DYqRJgBcH7NRC$T)}3q=eO;j?$&mWOoYu62 zF1${UphhYVAp&h1pZF|%+V^-k=0Q8refcW?4sX#@>-|uRyPWzFPuzCRf%^+aI?7&y zTicdy+;=ooJxoJ&<7ais*rcU*;dGqr!#&j0cD_2P@-&d?U=#dT{L7SeC&9nA=T$%t zbG(4`LN39Xw@+$6(NKCt8ZlW@tfRJ=pXhpGCR{y;e;wT(zYaV<#veSAaudEA`s9F8 ztG%KXe%&%eoB0mSZWZ!%LcYhD7;*bc@1*D)bdYd;E=cP%-}b&0^igD&JG!kx-q1xS za`@wMcg*IJ%{zAa57YYM;*@QU^e!K0G81v-lvZErTHxxC(Q@*Qzr#lr<)GM|f8vIE zN*{R>_T*djvYLIThK0I%SF)b!V_G#>Zdcon4dwSSX^i6sfqWsXBKIyl!~}%54CSS} zAeb8@-(2bEf>0dR;M-2Cf}?rsQOMdpyaP40QJ}gXW&i-r6!LX z$$0vt^7|^27k$q?CS@;u+NyGg$__3lq=emP&YH0-ZO02*F;}^Pzo+cOM2Wh#MkI={ zmZ>>itbRESbq0(T&N(T2LtR-mDB@;cEIcg;sIb19LN`!xi|+(-x>fiyudJ==b;Cxi zTZhB>EO(&JP=V=QuwpGv6sk92I^?TFV_r{d738DEb`oOjy*&H9{uIFbv)3t095khJ zB9{mzdiI5tp(ysy+v(f^1Ia~^-#2TB(m`srDg8S@5Rh%D3{0>H58q|?UNP^o+k;KX z^qJ^hx@#Tbwl?OiceaJ8VJ8=m@nd1o>q)W{EB<}dMF^YWqK82!3&-}H(P_dJO>^q$ z#cR2;=(tE;qL`F+lkkuUXfEmp{`T2`Q|?CUo^Y)Mu4X6`c~-*qulwjwWm8kr9ld1W z^Y=GX$wLVTskf!5Be@G%fA>bl*VGz)9;Q$))%dD;( z4QIQuT(nmSH4HqIBQ>^6qzM+Tz4?;;T;wCYB)1eGQb4g|B1n0SFg?Q48@f|`uWbRo zP=q>lIf^s|ueMlo7IQ(I;?gg_h%$y}4e|Rcy27u$o*L(R6jeJk!7GVo_b}S^rvUN`Bo+OwW@e=ZX7H;TK1gH z)|~9ZV{zK>5@NDTaelmL>oR1ynT%xBdydmqXW*V-SRk7JV~YvAZ}!sMt36}#@H$A{ zJC^TWL|19pz*SLEYJ5uv*mRgNwNvhas^=$K7toQiGW*q)JjbSx6hI! zf$!EdJuH#b7qjkoM8}=r*h8!QhHq{sQ$ITb{Dc%Ds0iIU9$X?MvvGb%vQ2<#)uE=N zXY5*{Nr#hFCZJ#L(q(D-Zdr@xpQn-l?;ixdsGX9GkbsBq69h?kS1fr1Qt^G8`y`}$ zb_%{P5Wz{Y0-8FU;a8eNqxWZ2tVEf}HL}cPnXtYGqL|Ekva+(Il9wGF9WTE>!~8?* zwZXN+3K5YR@^x#-^4vWAs++*oT6BnL=z%+XyuFQXV?c?pqmu;>VLB+#ND;iF?As!T zUaq3!*X-kQqtVxEZ>*KZWHt(DZdn87GcRvoGB2MeM)XD#`ji@NT{(Tv`!&f?8%M_u zg#D;^B7RB^UsCSSkMd#rBwmb&n2`h+*-*Q%N zd|QEXk|emJ=7~UhSPTm$fHnNdm=3fOMZRd3pa%l{hqH{&im{51aPSAK4LY@&Am&#) zXX^`c07fezO(z%CCjqaWpc{0gn#l0@R9T(QquK3On#H34DLJ^HBF?`ZvINX~BV!q@ zfc4}%L+PLht^@>LJG}85c+!Rqm_$Wi^3i+zP>1^KU3NuNsQ3ox$vw#16Gnb@K35i@ zJJ{tlty`072JQHU;C&zSWd19p9BOk}C=zZ|upIgoLQq7VY=}<+j4?`%%!8v@6>!%* zDT`6xP6-l!MB+L0@00{iiNh)CDx%@oa;<&!gW}GQ>7PKl6DhWy9ozdQI4W{fO&3k6 ze06i(Vja5D&KptZMa$5Li7&h2%f*GnvmqM0W>ziUuKsVm#>epY6gY{fF$*(}egCw} zKr%9`|K&{YOSWhEE!2n4G_XM5+L*gQMZ#T3l^)0`HJuFaDeuHleix*rd__^*<+M8N z!!Q;{!E6&o*|^xV6V(jbzVSlU;1U2#>NH{N@bB+{w%cbF1}BTpjT1!A@}BpM%;}O+ zms?GcO9$m^bM#HR=Hc>sO59U>6CC=wiH&)gRkf3d8Tn$*+6hlt;>3RYvo#GKX?E3h zdezi@eEr$xI392@;1lY8B+kf;r?^*sm7BE8wH}d&L=FY76MUq{y}V(0b+?5dleu=I zn~+g(^LTL4;tv7}7@4t#*g|nneA*t2YDvDS+HHKkV&(`R0Yk6f0y$)^zf&bMidact zlC9-m4OT=E@acwnbya2WiXQczl^Zwo4-ik~>x@v+f}VNubIbh~b0v94jQdVX{k)6> zNx5(C5J|qcRG_tdos2qtu~;MBaRzPyG1*4L#t<|Nyi^ayl>+UzaR zhkWUHbb?Ho?x^J63_FCZy(4JyS_8=5HgPW@MF;9^9Ia3NO0F<^xKb^FhkKKb330$yP5!w``Qir$#59yGxLJI%9B)B09$<77>_@-Jrdq2YUn5WfnjVehu3;<5dLkR+Xdq}j0~hB7)8sILiR%B@(2W~TFRc*uVy?o1dRCxrfI4;)8LlwDWY!n zDq)SO+LQRI?5Par(X$^}PhVrnX3&iI&|IaP^M`r3 z#F4uXhV7nSy_ZN57~@M5RL)&EIOd&^(j#JVzvw+kSHc8-w4WZBY9r=K9_FCExfm3b zE)0uwpq3Gi1T`-Cp5wk!cR*%huI(5K#uSws5_IMHA|qn1-ZX(tdqEsz`c5Erb2SYf zX`WQTqa=t|;DK=JJRd~z(h-+rC&k51i_Kh3U-8mmF-(jsEf%{ywFq~8Nu#kk%-mok zvQS^etGJ7I=iZ(AiF*LbrV9rJZhU`P!d|TY`&i-7gMDSC$NyxVWs^^D(UI?)JG7CY z(m%%Tv{3B&25(nYu$>Karhok6sF4K#2Fo#dFh^LO^Xi*4!X2Vu<xesN_P^P4={|7NMYSTg<&HpEBAzCl~4 z^SPA%M>g`h9`K-;7#bF88hG^hg!ifg2NNQ(G^D7=KYw*ij=~SN`EzAKgvMnx^xTs| zM40t72Ss1%;Wzww!;Fw3YJwIA0*CAgREBGJz-L3nH!~@tnf<+-?UXhWck2ei$VnjKK{dyhAxlUxy(6@kASo7Y3?yRabd sIEOFgs?b* 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 G)9_s+O7VyK18N-%D1xSJIP|W!z z0O=X;cQ$Nr#+Ni4r;J}miDyV4dsLg=#!+nGX++unL5WAmLP>%2AUAsw8t^fGei=Pl&&4K+HR0RlXLw-h z1NwI;OCON1yTA+i(ArlopAW*)Erv})SHFZ`(c}R^IQM<*ztgsD6_?brU3im%=^6dy z!*)LnWtT|H&-wKgyX@;QjMv5 zR*QWrLmj>P!xli);RvgVUZB#GOFY}CJg1DMEe6oQcyqJxX28n(H^g@XX}^Fj#Ym#! z7DP#U^?vxP4ZlO#?7?O^0vS6`eTBeu_h*%jF|GD3j)Ne6$Z7Z@qoa0cj>Q-cQKGexboWfE#(v zqohhqFEX*VEU#oEFWZHv&ikZ&MDp-+`Mp_LjUQ>oB)A=_sr6(2EjzUx`j0S~s7FKL zC;5vXwK3QalKG~7I>xL|JuV&vMsY+6GJQ<7eL^y|bzi6b>X_@MP}(lNPwjxX%Sj#_ zZRK!J5ht+w(+@@%i6{6zG2q@NCaqQEb z%%RHBJf#L=sD|#Z4n=(>*22%rSj_+B(OQ$c;%8{99f(UL(CT{qffC&(aP44Cc>OY+Kkdg6di=C{z&j3sf2AH3ddKKiB2IvCwPZ`_Sif*A|Q= z7L0KkDznRe*zDW+OBx&TqpCY7^GGgbYt~INXlWFL?jJZ*(icPfQ*8Sww3W`qI#f3V z(zKyOLHImY1BoEMgM1#m`9g^rNQQ!rl{Em>&x$J#D_f_(i83wYm99ut7Qe5#8SNi) zSc|&P4>yi9Eu><;v-7)#woEf!Sg5Qb8my~ODqTc(BSg=O&DG?T=ZQcdl;`rYDvB;o zl0;R_Bouc4{u_XAf79;O5nS79p|*$DtlKw+9z9Fp>w+D&SpVM->op;te+y_TM4R##}_uO+Ou`MNl{K1 z7fk4HDQiEP=F1gykKcAUb)F3# z$E`X)>@7K?`r=)tw$S?ZNaZQEvSS7jsfEu({^h~(lKSkvr2lQp<^B!EAgs3I_oskh z*5}^}DA z=oUX>N%ZywS>*3C^b~l12Eu$l`-Ay}(P8fE{egZ+sL$6&!~=m{Pzv#`Ums;zYeZYb z;vdS*$n#uo>CT&;i2k;SsN^bB7Z{x;ydjDQkeFrC>ex-p#OppmL9RBEma1O!uE!y$ zNymE@rswA7^x-Pq>{CeAvxpDJvK)URff&NQKuN@Mbh8t6`bbO=@7FX#)Yr!Il%}g+ z*j(OaN%b^&rU0%tdYzqN)N`&0_gfUeDcJoXs$@IInE6L~J|$Q^I!Mu`9!N*rymz@d zlIsdLa67WWtOZH_BL)F~pe+mYc0NlAscjxj+XmoKLG}6L2aXcceBI@f0F+DhxY|Mr z--f3ueQ}jHrNeJAtOhaDw3$m$MzJhztBjos$G!ts45!U?%_QnkJI~r< zBYI4>8sj(>7h-VsSRtZZJJ-o|+9vf{T}QFlQIm&SG?OHPR)z>=?f=tw7#%GKJfHZj z8L{P+ZkTKzcc72T7jYzuFZ#Lr)kyk>NQ^(|=9eC8 zCRC?juKjoR%V)GdQdnh8)0bcw*Q9%Ig z4tV>FAV_*1H;0VNef$$;vaM#sntCZp^euLCs&%#0)=u&~c>HJH6T3rE4sjUW%Ah@1 zb$)eN4*WctwNr{$OxMAeVk=$1La#Y^H1+pgT6vi^su|^HqAP;P*3YY2bX;LhoZn*% zi1Fx*%wwn1kQ8gH-J$C|otq<NSc-u5gp?!c-7$dHu=`9x3(-~1xAn(* z1J>jb>Td3LC3g65wHGeUao$^C#a?1{S^^T{h0~ZyrvXWDHaAkSaTKrVo8FOaMYIsH z4_Qd*>4obnTr$__-f4gX*%QopYiO^&BDYla48JlGLm$jL`R?(m#I~&Y2Nnk1~e5TnoTNV&6YZoP!=zEWb>_j0VH&HRYByr>GEIv%O#VY1FH;X0{ zxrAqt#aQc2I4ZC^DOjuYNWo_GcLQa-6?sdXmI@wuX1kUPxiCZ`sC^>U&#hjZRB0!^_N}W5ejPk*R`3n^9O^w-Z z#RhEyMnJWay$R8!Z@`BhPH6&Wf0-k*cf+!W zr<=`Wf_jKP&9`tO1Mx2MUj`Jyf(P@2l7TGDoyjbHZ5y;dZALLNs>L~I|7-|%Jav$g z#3X*Qnf%+QE*_wy{91#yz2KT{amLK<9}vCA$IVJH$n&uH!ho%kF2xq{64UZa$dK;1OCNFKs@z5i_n!SJAkA~xkd*3j%XwQ1p2 zgEu}y&$(woSQynP=&)Fl^e;rp+=mBaArfmjW`jh#W*H_mGS@HPYAc{)rQKsfmV40Y^3Z=|oqSzs|IA^#x(Dh+;$l}`4j2e+$^92OY<;VF;}w)(J1o;DTv zUC>7hdiUiBzbgO^#nfqaeRc13nr|<)D*!EHlLQ|Hs7cn%E@0=4>M$rm^6NaHj`W@ zaGWfyYv{m!k00(vBf5EKa%t*9(HR3PVmltJE&lJqAednZ?T{On%NZ+3cP^x68FIy{ z6$?wuv=ipl-E!PuQtuL_Y6#0XPMF`BdPZ>bM&V>>JFwxdL^(N3;OEg4I?hgt%5@vb z=C&*P2EjMT;dy+Pv(`aO$-dY#RnKJ;aSsMkiDld9VU%s{S|LQN)8^>OoSjbY7G2qU zcO&MV_-jE=AdCBT7sqvPuZ3Zu4h(BQ0zs;U_F6ks1?iK*aPy)7$=5v7ZT18UTYB74 z25*6T+g0LV;}Oxz+seb2`f<%|aA81_@)7TW;%*?-aW~-ptK%EVLXa2X3%+SyVS3u( z7C50ZONl%KqrEE4W87nn0a68Q>mzoI#8M%z53op#3c% z^0~0H>pCTyjR&t~h{{nW-!9oD*!(T#chX$Z#$mu;Cg$emLwUB|Q{-_%$E-A5LZC^S ze;i^6jh)3{N~FI+*t*M%?KT5b!Pn|F5pC-g_P*suTK!%&*w_)R*ti~(9U~>PVRES{ zu!Ck?`>~5{a9aGKARpi(Tz)EH6NbEIygL;1zN=EZNm0{L!xUV-*w|TYSj`d|B zCIy^Wz+(HdTatqsR}ak#|xkQF59}!dswHA1)(Gt{Yd7wlG&N!tLIzDcl;- z)1*(WH4>F10>ozSE%9a43-kFYpA82N#3c%(hJSX5sQ?9iq!y-MJ^<*#WM|Pe7M%@W zsFFFVuQLpTRqaWjjWjXyASS4Xc|gZ_5tmPj{x#~L@aRn#+!B7`uJg&W=EwBlCo zZxd!yh#VFlblh$7-JL9AFN8y5tw+w_zL!fofO{MTR?*72Xf&CAI;vNR*?UJ5Q|8;d zUwOH>bwLZ|Bcx=H=f08=IZtW12vi4vuVbdsz0TFUKR<6rHAGI6$J#V@+?HWFYGGF6 zh^w322ilR21uw$zRJ=YhvJ*S18WSAh6X3*E!I`6)zCw+{;)x%0badFfs8;2YGL5kb ziLEr`=e&D_1;vg_WJ8BEG8MMH*I3?6=8~iC)qd#VaTbR{u{OM^WFyXn4t#fw$VIQq zQUJ+Lq}4=vKI9Ra9Ftikt`3zMT?ZtuqzzBd+y(h8P$&BCwo$HsiLDh;z!Ap$V1^@Y z4j7ZaEig_UcAe~8TH3^GF2l0s(*3O=X18D9)<@f(H@5-=Jix7rzSW%pD?c^vS^+$2 z#u(duTXcxm&;F04sfMMsgtrejxJ$Izr$rJ-BGHOy!O1eLf09RFs`j5tbhhz7xMbVm z3fFzBlc^XXRKtq-AO>)LV3C<7@vZ=|7H7Ll=-NiHrmOY+s0`Ep(lvOW=zjIy7A4&UP2Gfw)4KXU~3gO|&co>v1RdD~wV0Vvt3ZhW9i{riL))b?y`Mot}EErv~Tpdj(Q? z`Jj(Ws|F(dc}0JmW7tYfzONlH4Git3R?ctNIzLWK^*#mug z(Y|v`Z{;+Rv+z=t9n>?-*=n~x|4lW}Y`^wSD=l?jZyb7lwcm}YK|qp5N1m#R@wC|v z#QwO*;MO1$G5(UFij$9d%uO-#K=D{5FaHxhluiDsu-pyaVyLG%RA(O6i_9tm1jbGu z!LChqr@Oc7b=+zZH-7{wRV>WSiQ?U2IhM1A zm|g(RCOLZ)Tw{2Owzr4(G3IJ0CHtD%zU_C~=a6D97RuDH>Ltm+Dz1TwPB|awWT9KY zdF96KJV13AS_E#f<1nM0^S{x$^tXg`=U}(X_l%szzeSnC>2(}R7q%*v(Veg9{Kfj! zwqd66MM-t-L~47DZxOcvfNiYl72oNrxtFl^juX~vh}5~KWji>0cZv!m=Pmu+7nty3 zC-=luq_I4JdPIfk-Dgc>cAeClkt`K(0h1g^g*28hnL2DEkR^w!*+%giYrObOon+%i z>2!7t&HPCWUKb7eb|$HeT@C8Aa6b@9xtrN7*JAYwCx-YWRvI}Q+$WIrJo}IilN#4J zBzL?)Zmxxmau{%^Ft)x&-Y&V#ck09rX~i}9nt4A~0d_w4An>x|E2EL0N#~pWYe&E+ z4aaNZ$HA^NOA*vTRNmbjr(qxNYq*`#Be>39W!w<5tEdgdeLR;LeiO?V7y0@q48+~$ z^6ldf2OqIPWkb(~I61$vAzSljwy%D`@RKP|!$yD<2W)90<1TG3b^p6twSKcc;gSNj z&2woz!n46}ap5$6@BeX;*~_ENcK_u53lEsmM**I z&jtlHB1OTRJs2oRC}GMtUn22Iy9p|M1Eol`j8yi1(5-jsL90!bu%q@J$r@j8NR^@N z#Z>g1r6UOs_yYp+jQvqxrL3Z)DbhC&0UaYA;UAyUuE?+It3Mhz?nJb4&?XX9IJooZ z>srF0IiQ0xc<3d3^JYplV*0vQLBhtNm%Lb5GNobDy|5leC0u5LwNIPy86>2KFly-l zA1TcDy?mpB`!os`s-Dy8-yB}O-?G9gV~v=50QMWK{L~nE4h@$FyiSNvVm=>KU|hq% zFNzq$j{v{^2z((UAv^dro{)l1lmuZtS%0icr?Y5MDYz+3nBgiDEA3KYzo#kJ$HX=v z{tX5EBlf5seA|*%7Yrb|o{vx}YqtGO-BYdW2$W`?}s zTbepGfsppphy;iX@Q-weosS7~2!kkb%Ab4D7znw@`dE&v9G2=`Or6_(s{PcvJG8zG zk0V~%O?5X~gF%gCl34DMnG)$hwl6J1`pbr*P>V5+dWwPfW2RW|#0Jr_S$ z4PUS!@(I#RrVmH!bAuFSa)^9@bxGC^*KUk+rfbTEWC=1%1(vsmbc~j%ivGbX0 zx_z{*z6%WHr(C|l)JZfs`rM|H+FiyKF=ip|Z5)paGfFOdMF%;oQ8xr26`le35-;%c za>o;-Nky60UwJ2RbHC)313T$rwm?K?g@E`py+FBmy^U)~`DU;X-B&0qHML)l=wp6b zLWmMI-h`dl)jS>nHz49A%}=jS!+>Ye)tB4Tj9;E8eS?-MI7{plPTX~#?Junr^i%u31jodhk{ZAVewZV4CI1^W!BGf0xY4`Dly~29MpiNdMrk8IQK#Jh9dW~{ zrFb##-g4Ox&c9DUFa`*Z)OYPF@zzJJ&^$?}vd&P0P($h+s%cXulS+6ZT`K$~5{Fn%(7Sk$`8W?XFjm*?@d^_O3S zy0{&7GG+aKf5g5FqYfBQhd;H;BzoVIZR zn<}1~BC-4N_=B8gq(1mhd}5TLF$0S#iCn(nRcn0q+wj2{kD(sonyFM^g;-8mFYmWzr>6s|vi)uM$g^sb*&IQacLd`!{hroxN@PQdPv$S#>0)uYB^{3);G@l1>?pk&%Y7@+ z>fDr4GA5rAM7Nn2Z>((|;y&cZb>03Y_CJa^ucDHA!Q7;yr%FWyb*?o_n8+0nBcAw~ zLHG@VO)1PTfjUU&#$(`_se}IHYMbk`%Ee&6MC#Q2mVO$JEWRELZ+x(x{N}8(n%a|7 zJ*xx5wehiR&^RrtIEYEAcB>pNsiVl|0a{)uQBYY7pHhuV7UqPz758$3P}P_{q@+P{X(8`{bY&{x6#pl$zHyBA@o}g4RJLBc^aiUj zWiM0oUDhe<>#$|&q+Hy$Dbu#-CDi6p6$*dZ|1SKIy#{Nqcjq!gq%A#ABJc0_6P`t& zZ#Qrhro8>O<6g1)VSM6hT!AYk`}AQRyC%!62i(Fi!?iFLny9}#o%>b)<Et_ft6 z3WjZf6I#JvKiN{zl?$Cy-qmW>UqDYI$45R&(Jw;I>b&i*@na+F*I83IkcOr3reI%V zR@G({f1I^K7@BLNRr_ufLv;C{d+^78-4d20f^X>MPqhjC$w%@gG%bpkAF?=ErKMsc zlQAT%xXgBKYc#80n2Qi6nIz{BQ}U@oE!0p>@iB8PpxrIxRg$GXb#T2u7cYr;FUd5> zKf=D$ZVwkih}rx(!fjrs1qB#YJy(=asDP}OO?E=gI@x#NSaf?^5q|r_3Phf+zRtDY zGRgFS!1vFW=nNuFiEw2?Sdf|L{Q?iu<WA9_(j_3S8n@DzE~-=? z6@zgU=>6_D;@=J@5 z0EP;)!-cMPWhw9OXR7Phq$6o=ap~isM@O+YJT_=T(PFP~R5y+MY0&@EgX80YZy6)D zrTrx=JiKFs>V;GNVld1KQ67Tou0Xj&>XU!J{mSD0ghiEv?9tc<+mdGU4tCt7T|vJ1 z)TSJlcYwWj&M%FP&>v>s_)lugOkn;Zt80X}NuX|l@qH|=I)Q&*Dcqm-x|x$NuJ7C1 zTi*0;QENxP6LpTIigJ$PXlE3BWpl#={A0V&=qSCbrW@k^ow^|V5d9@KBCR#FOW>hP z>XB|>*b@@1$GCW?1X-x6*_s92ar&MqZjjp$r6Z6j*-6!y;XV)E!(U;{k7TufPHswa z#PO@Xo5HG$flSO~>4G@C(6Gj9(sz#N6+pe7YKB=A_R-uR@7{f^SU1}CJN`2P;8`lR zOSKZ0*W?U>Qi&Y0Sblvxry{3Z>UY5>048AX&3!Cy%4KD-*=@-9rRC3`d~fgV96VBM zikFIx3_56ro20Rb|E_EsS-WT(nHy`~xG00yT@{+~(_X&Mw6K4Oix=Jg`um4ZXN~A& zrl%j)tqSVGwgt>Qk3CvfTFkIx&`hTU=4yImCp=?nCYw$JpK?ESn#k*ou0l^>3I4uV z(wZeE4=XumBdT4MD|UKJ`+KFFrX(z{m!O13o&($4=5V2`z1`9kd^}H{uW1d8STXwh zg?xixe63oL$Lr5l>AUdK9-!M?^^Z{+xHaU)8C}qbCC5oxYkwS>&3aumDULEIo+5s6by348h{l0`X-iw`uA zn@zp6<$36{N+7>D)&A1m4#`s6Fh>v5Zt z1ad^_>PY4{dZW& zq|~JfiUUs`bH9E-!ObcS3m|gO2RiO~p#E|eu_FKEOmCIaG7n)f0 z-56#HhGHI#bno#`>sU1?GrIk6$^Ug4D5Gy(30QI!BE(L-4el5n);dXw5fA&h9>+0> zkemUDIl)HucO5(e`$0-(5eG*Ti?Dqx&oi1(v)a5>HQb&uhu|rC$h|HWK6vCDIEFesP)klw%7Ex%cqj>rjcMeUa)i*?_V+8~$y;eb1q< z{q|}fB#Mo1jdjtnMnTR0*cED0m|FDb?BmwrJpcRV2G*^=lnsi%OjS{c=*e|L%2;Uv zw~0a8-5+O=+x8U)7`;BVRf5DCGJ2@pAcz0f`RaIk@wW3mZMET*$Yb* z8IPGiiv4dD0hmX%Wv2u!`{STsGc;D1@@Gs?cdb0v>OCid;J^IW?KC{;(kJfHwdiCH zkV4iz1U1CSTTJqnhijrpzSH*>b7^@>+xm6icqyx>j3e#$a@6@tw%i@L562(7wQON- zR|*gL?*!4&3eQ*WfJK5uoo!t_hykf_m$BvHZjue%W4YfUJisUU=O?6Qx^AH#aw1(9 zrg$pbj=edQ>Dyg9smdv?*nSTE+Ay~KY+dr3u22fjai%c3uag5=K1nk>_b$?&X_ovc zp1+YTZPdkc1cQ2KAlj?P26nnDvv&;+ce#a~4R#EQzE;AE;08#ru<{}+^||b^bQRtF z;B(+vXNNWQ%r5i!wF@-59+Boo?FT3EKdAeR(OJ2B2=^SrS?XYPfsTB+!0TcebuHa5 z&id5lE<-Py_&kSOTxr|0j3Ygjm0e90v#hWp-rE*CwL_j;u0id9^fSWK3DtLTU6i@d zyTUm8-(^`qa;(yRg_dk~_{k+1S-79#Cfa93%Wci#IdtsokIoP6Van7bDykN-btFw~Cw`>3%sqW9o=wvMQiB9!@5D@8&U f7O{z3+z}pV^=xTH#dBg`6ojLtrmI@3Y!mfAvZr*p diff --git a/icons/mob/screen/old-noborder.dmi b/icons/mob/screen/old-noborder.dmi index 18e49fc9c8812c1c02289e0538b5676c4c4f6347..e4fc7dd55c5c637426758bc11569011654f2a333 100644 GIT binary patch literal 17179 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 literal 32084 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 z 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

KE<^*_TLB2?7*%Tn_(ylEo+8ltS!^|Kl~<8pL# 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 diff --git a/icons/mob/screen1_health.dmi b/icons/mob/screen1_health.dmi deleted file mode 100644 index 9cd7a4134202f9dcc7e59246b0a28d934b98b065..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 888 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 FO#s1S@|FMq diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi deleted file mode 100644 index 436fb1169a2d3166d4a6844445ad9d4aa53d0651..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5Tp9i|n8Y1e0pv241o;Is zI6S+N2IOQ`g+!FNq!uR^WfqiV=I1dmRLltuD<~@c{w28JW2E!o!!Q&n^#DjFn{vMN89U+ zZ|jDsqA`DC4jf}*FjJKhUhC}S4YZWU)5S4_V`g%K#2p}S0R!VxY5#RV7K5j&pUXO@ GgeCxq=14;T diff --git a/icons/mob/screen_spells.dmi b/icons/mob/screen_spells.dmi deleted file mode 100644 index 50be07d787b8cc6ea9637ff1240b3972ddbeca85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43631 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

5xTaOOKcPYNBH-&FDUvX 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 OM?pqaxb;fC`t!8n>@0HQ4CEp zIm9C(Lgkz@5t*>qp7qD?|KD?6_xpZ*{<^RGdVlWwbA8h6FItL14?_U}5Vf|laNv>1 z6Iw`smxp3wt$E0ab#lX5_(%Fh1Y>c*;b8y}Q;^ZefVL^iCQrLpf4%?hSVD!3j#TQb zBKX>V%3*C^kJxPmKCQCFC^3_FqhF0Cd!P*2-5@UjPz%o z>Q@`4Ux#QWuHmo8t!YKSI<<(j%QNj0R2+y~Tim`GF=^5_ce7|x(oXA164CedkQR|d z7vjfeY6A=ZKRy~3T9pq{c4M~J#ueEeI#y*4`8}Nk0-@7w8P$w%ci>8T%RSqgoK%8; zNSN!8mnPi1Y2MYm*7yZ0s675m;htZ9d{}I39vxDNKpxImPI&jyb{ss+W-{oPP|<#0 z#h2A;mf;Dl2GKu76eJhDiSGE`!j|k*;yDqL1pi+aDneksdY3mB9G-uC7NnQX3k#K7 zp{Io1vyZ$x**dNL^aHt9In05|F@|UQEp%LuaowE~)vTpK>$Vb%sb%#;W;PWJXDolU zGydI~FKL?xN|lRR^PMi3g~c1lzomLN0YI+pIYet$myolhh7(sIaMS5R&3(=~C|0co z2`+*MRbR*&NQ{Ao)1R+csXYV%st>LA4YI7z7|iXoX2<>Lf?ikWgdIQu*%=NRPONzw z0v>j1;#9I2K>sWCg;#h5dk$F3OV=V_#lt*LB~KWpV^((Xw}BYeg3lDWxP`IPlw`uR{fp)^MtIK^m=GJ5BAu7s-Fb-_KI@tf?5o$>q z)9gY#FhotDv1~ku&*>S;$p$!EN#u{@BZ@1Z*5V-=2PIi77NBjq-!7{s7b4_B<4n-d z)NmN2fHErNg}T*YL3?=BB_U3ZS@Y{__k8}S;NT4h`cPW58mjRv-UK7&b4$J z3eTIejBDQDG*t%n@-8KZGD>a`P$jItX=;p^vkaXW%ScO0T5fMQ4@pwNnEfRJ&iXhw zm=t>Ij?#e*GxE>?^${I#(>SXvdm}-J|58fGh9(x&rw5W zi+Zb0OfQTx6Zeq9>u$oi`N1B{F|tu-L(nvqtwZ@e)vlf%v@DcvxmL&~$PP&#cP8Y6 zfHrVI7p6b3m{D>HkxF(dGP6aej9~{@g9WlGYT9SilH5KP=d_6AibQxaD?xycLeCto zhKOoUSAH)cFeQH(_z$=~rbJ>^;LKa^#4Tx9Ve@ly<(wU)jz73PG2w$O9!ktcYm?y^ zooaLdjnv`A{h3r4+dP<<{Xhoo8||flSEm-?;Z&--V4Xk)M!)?^$M@|xAMW}YtMo)O zWs-Vc$!dU_y868=n4Jq^Q0y9FX8RZNo+v}W`Vw!A1|K>)ZNC1+@AV@%xGi)whgcct zqzcKhvaqYPMf>#0iluI~cY`s=QWa|tD`RUhwe{HuLr*;2P^RjSr)SGU83Oo7V{Aag zMwH+Z&cnHe4_N>9R@M}GO?)YP{RC}|IEF88k;$vb1+C6cM(d|+-K(3KV5+YZyvehB zpB9yyJ#*npVxfJ&e9i3U0Y|(Mv1uVlYLqaH8pvGak46)65k%?Fq4lcd$3q-}+x-vi z(7P0U_J(Wf#Yc>=4{PG<30YDHq6M>8(h&H_#{`cRK=b4c--cnPZ({(Ce|`riRToK1 zRIzTX@K1`z|1&LVCMg4|y4bUeZ+yVL@n)qvUbHd_{~E?~%Lc)v&SsEq8Pd~+=VdPL z%+K2^>C%Z$+a_f01S9|rmsBCdsLd6>6BLJ(D=*0E!}n!~s_N&9K=|5kGlSy+-cvGn zGsM2GkBn^PbB9VKWnl{K^cGFq?)z4%=LK%@9s`vu^i%I34#=-GX=m?m2|pkCKEF`h z!Q^?R(2-F(FsXrk)q{E_U3~E&`%^kapG!+z^)$O`uL}wmrMy59J)LTItEIb5!BOM* zzMpxfCd}gZM<&0;)(ZXV@-_t9q%&+Z?h{zqlvz()O zZN4=*9F#nNT={azzG#pgH0wi4gqtM@l)8w%!l#Q7$~lYQqG(WNZa(46F=+mP;=kV7?06gBfu!`ESZV-8(ArR|2&lL95U*p-9?ud*Qp zR&>Wu{4*QY1NsBy-o*HXo_vMK8!FaaAP_;CfAWYUXB|KjqfqwKL zo}U?fLW!?3>jfUaEr&brdzjY&1v6~j7U4c|oJ%TxgaVg_>r|`dEZq?EP rBq_zP!kx=EHX)DK!dsd^oC6yl7+rD4uUhi{LV)$zix$+==)`{ksAF!^ diff --git a/icons/mob/status_indicators.dmi b/icons/mob/status_indicators.dmi deleted file mode 100644 index 80baa88177f75762303ea5b87528c7bc46b5e5ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4832 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 diff --git a/mods/content/xenobiology/slime/_slime.dm b/mods/content/xenobiology/slime/_slime.dm index f38215b8f03..baf52a70476 100644 --- a/mods/content/xenobiology/slime/_slime.dm +++ b/mods/content/xenobiology/slime/_slime.dm @@ -20,7 +20,7 @@ bone_material = null bone_amount = 0 ai = /datum/ai/slime - hud_type = /datum/hud/slime + hud_used = /datum/hud/slime nutrition = 800 var/is_adult = FALSE diff --git a/mods/content/xenobiology/slime/slime_hud.dm b/mods/content/xenobiology/slime/slime_hud.dm index d5162603531..7e8edc17290 100644 --- a/mods/content/xenobiology/slime/slime_hud.dm +++ b/mods/content/xenobiology/slime/slime_hud.dm @@ -1,6 +1 @@ -/datum/hud/slime/FinalizeInstantiation() - var/obj/screen/using - using = new /obj/screen/intent() - src.adding += using - action_intent = using - ..() +/datum/hud/slime diff --git a/mods/mobs/borers/mob/borer/borer.dm b/mods/mobs/borers/mob/borer/borer.dm index e92806d6e3a..3931a684a5e 100644 --- a/mods/mobs/borers/mob/borer/borer.dm +++ b/mods/mobs/borers/mob/borer/borer.dm @@ -25,6 +25,8 @@ bleed_colour = "#816e12" + hud_used = /datum/hud/borer + var/static/list/chemical_types = list( "anti-trauma" = /decl/material/liquid/brute_meds, "amphetamines" = /decl/material/liquid/amphetamines, @@ -60,12 +62,14 @@ /mob/living/simple_animal/borer/Login() . = ..() + if(hud_used) + hud_used.refresh_ability_hud() if(mind && !neutered) var/decl/special_role/borer/borers = GET_DECL(/decl/special_role/borer) borers.add_antagonist(mind) /mob/living/simple_animal/borer/Initialize(var/mapload, var/gen=1) - + hud_used = neutered ? /datum/hud/borer : /datum/hud/borer/sterile . = ..() add_language(/decl/language/corticalborer) @@ -85,6 +89,9 @@ . = ..() set_status(STAT_BLIND, host ? GET_STATUS(host, STAT_BLIND) : 0) set_status(STAT_BLURRY, host ? GET_STATUS(host, STAT_BLURRY) : 0) + . = ..() + if(. == PROCESS_KILL) + return /mob/living/simple_animal/borer/handle_disabilities() . = ..() @@ -193,23 +200,10 @@ qdel(host_brain) -#define COLOR_BORER_RED "#ff5555" -/mob/living/simple_animal/borer/proc/set_ability_cooldown(var/amt) - set_special_ability_cooldown(amt) - var/datum/hud/borer/borer_hud = hud_used - if(istype(borer_hud)) - for(var/obj/thing in borer_hud.borer_hud_elements) - thing.color = COLOR_BORER_RED - addtimer(CALLBACK(src, /mob/living/simple_animal/borer/proc/reset_ui_callback), amt) -#undef COLOR_BORER_RED - /mob/living/simple_animal/borer/proc/leave_host() - var/datum/hud/borer/borer_hud = hud_used - if(istype(borer_hud)) - for(var/obj/thing in borer_hud.borer_hud_elements) - thing.alpha = 0 - thing.set_invisibility(INVISIBILITY_ABSTRACT) + if(hud_used) + hud_used.hide_ability_hud() if(!host) return diff --git a/mods/mobs/borers/mob/borer/borer_attacks.dm b/mods/mobs/borers/mob/borer/borer_attacks.dm index 28ffd23fbe9..6fbe780cfd4 100644 --- a/mods/mobs/borers/mob/borer/borer_attacks.dm +++ b/mods/mobs/borers/mob/borer/borer_attacks.dm @@ -31,7 +31,7 @@ to_chat(M, SPAN_WARNING("Something slimy begins probing at the opening of your ear canal...")) to_chat(src, SPAN_NOTICE("You slither up [M] and begin probing at their ear canal...")) - set_ability_cooldown(5 SECONDS) + set_special_ability_cooldown(5 SECONDS) if(!do_after(src, 3 SECONDS, M)) return @@ -44,11 +44,8 @@ host.status_flags |= PASSEMOTES forceMove(host) - var/datum/hud/borer/borer_hud = hud_used - if(istype(borer_hud)) - for(var/obj/thing in borer_hud.borer_hud_elements) - thing.alpha = 255 - thing.set_invisibility(INVISIBILITY_NONE) + if(hud_used) + hud_used.show_ability_hud() //Update their traitor status. if(host.mind && !neutered) diff --git a/mods/mobs/borers/mob/borer/borer_hud.dm b/mods/mobs/borers/mob/borer/borer_hud.dm index a215aef94de..403bd095de9 100644 --- a/mods/mobs/borers/mob/borer/borer_hud.dm +++ b/mods/mobs/borers/mob/borer/borer_hud.dm @@ -1,55 +1,39 @@ +#define COLOR_BORER_RED "#ff5555" + /datum/hud/borer - var/list/borer_hud_elements = list() - var/obj/screen/intent/hud_intent_selector - var/obj/screen/borer/toggle_host_control/hud_toggle_control - var/obj/screen/borer/inject_chemicals/hud_inject_chemicals - var/obj/screen/borer/leave_host/hud_leave_host - -/datum/hud/borer/Destroy() - QDEL_NULL_LIST(borer_hud_elements) - hud_toggle_control = null - hud_inject_chemicals = null - hud_leave_host = null - QDEL_NULL(hud_intent_selector) - . = ..() + hud_elements = list( + /decl/hud_element/borer/inject_chems, + /decl/hud_element/borer/leave_host, + /decl/hud_element/borer/toggle_control + ) -/datum/hud/borer/FinalizeInstantiation() - hud_intent_selector = new - adding += hud_intent_selector - hud_inject_chemicals = new - hud_leave_host = new - borer_hud_elements = list( - hud_inject_chemicals, - hud_leave_host +/datum/hud/borer/sterile + hud_elements = list( + /decl/hud_element/borer/inject_chems, + /decl/hud_element/borer/leave_host ) - if(isborer(mymob)) - var/mob/living/simple_animal/borer/borer = mymob - if(!borer.neutered) - hud_toggle_control = new - borer_hud_elements += hud_toggle_control - adding += borer_hud_elements - if(mymob) - var/mob/living/simple_animal/borer/borer = mymob - if(istype(borer) && borer.host) - for(var/obj/thing in borer_hud_elements) - thing.alpha = 255 - thing.set_invisibility(INVISIBILITY_NONE) - ..() - -/mob/living/simple_animal/borer - hud_type = /datum/hud/borer - -/mob/living/simple_animal/borer/proc/reset_ui_callback() - if(!is_on_special_ability_cooldown()) - var/datum/hud/borer/borer_hud = hud_used - if(istype(borer_hud)) - for(var/obj/thing in borer_hud.borer_hud_elements) - thing.color = null + +/datum/hud/borer/should_show_ability_hud() + var/mob/living/simple_animal/borer/borer = mymob + return istype(borer) && borer.host + +/decl/hud_element/borer + abstract_type = /decl/hud_element/borer + apply_color_on_cooldown = TRUE + hidable = TRUE + +/decl/hud_element/borer/inject_chems + screen_object_type = /obj/screen/borer/inject_chemicals + +/decl/hud_element/borer/leave_host + screen_object_type = /obj/screen/borer/leave_host + +/decl/hud_element/borer/toggle_control + screen_object_type = /obj/screen/borer/toggle_host_control /obj/screen/borer icon = 'mods/mobs/borers/icons/borer_ui.dmi' alpha = 0 - invisibility = INVISIBILITY_MAXIMUM /obj/screen/borer/Click(location, control, params) if(!isborer(usr)) diff --git a/mods/mobs/dionaea/mob/_nymph.dm b/mods/mobs/dionaea/mob/_nymph.dm index 9cfc545d061..e9cb3750d89 100644 --- a/mods/mobs/dionaea/mob/_nymph.dm +++ b/mods/mobs/dionaea/mob/_nymph.dm @@ -1,7 +1,6 @@ #define DIONA_SCREEN_LOC_HELD "RIGHT-8:16,BOTTOM:5" #define DIONA_SCREEN_LOC_HAT "RIGHT-7:16,BOTTOM:5" #define DIONA_SCREEN_LOC_INTENT "RIGHT-2,BOTTOM:5" -#define DIONA_SCREEN_LOC_HEALTH ui_alien_health /mob/living/carbon/alien/diona name = "diona nymph" @@ -27,7 +26,7 @@ holder_type = /obj/item/holder/diona possession_candidate = 1 atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_NO_CHEM_CHANGE - hud_type = /datum/hud/diona_nymph + hud_used = /datum/hud/diona_nymph ai = /datum/ai/nymph diff --git a/mods/mobs/dionaea/mob/nymph_ui.dm b/mods/mobs/dionaea/mob/nymph_ui.dm index 4eccaa1cf39..4b4b19355af 100644 --- a/mods/mobs/dionaea/mob/nymph_ui.dm +++ b/mods/mobs/dionaea/mob/nymph_ui.dm @@ -1,3 +1,6 @@ +/decl/hud_element/action_intent/diona_nymph + screen_object_type = /obj/screen/intent/diona_nymph + /obj/screen/intent/diona_nymph icon_state = "intent_harm" screen_loc = DIONA_SCREEN_LOC_INTENT @@ -32,30 +35,17 @@ return 255 /datum/hud/diona_nymph/FinalizeInstantiation() - var/ui_style = get_ui_style() var/ui_color = get_ui_color() var/ui_alpha = get_ui_alpha() - + hat = new + hat.icon = ui_style + hat.color = ui_color + hat.alpha = ui_alpha + misc_hud_elements += hat held = new held.icon = ui_style held.color = ui_color held.alpha = ui_alpha - adding += held - - action_intent = new /obj/screen/intent/diona_nymph() - action_intent.icon = ui_style - action_intent.color = ui_color - action_intent.alpha = ui_alpha - adding += action_intent - - mymob.healths = new /obj/screen() - mymob.healths.icon = ui_style - mymob.healths.color = ui_color - mymob.healths.alpha = ui_alpha - mymob.healths.icon_state = "health0" - mymob.healths.SetName("health") - mymob.healths.screen_loc = DIONA_SCREEN_LOC_HEALTH - adding += mymob.healths - - ..() \ No newline at end of file + misc_hud_elements += held + return ..() diff --git a/mods/mobs/dionaea/mob/~diona.dm b/mods/mobs/dionaea/mob/~diona.dm index 0df03ea0e90..f30cb151165 100644 --- a/mods/mobs/dionaea/mob/~diona.dm +++ b/mods/mobs/dionaea/mob/~diona.dm @@ -1,4 +1,3 @@ #undef DIONA_SCREEN_LOC_HELD #undef DIONA_SCREEN_LOC_HAT #undef DIONA_SCREEN_LOC_INTENT -#undef DIONA_SCREEN_LOC_HEALTH \ No newline at end of file diff --git a/mods/species/ascent/mobs/nymph/_nymph.dm b/mods/species/ascent/mobs/nymph/_nymph.dm index 26445b5374f..b3f64fe4ec3 100644 --- a/mods/species/ascent/mobs/nymph/_nymph.dm +++ b/mods/species/ascent/mobs/nymph/_nymph.dm @@ -2,7 +2,6 @@ #define ANYMPH_SCREEN_LOC_HAT "RIGHT-7:16,BOTTOM:5" #define ANYMPH_SCREEN_LOC_MOLT "RIGHT-6:16,BOTTOM:5" #define ANYMPH_SCREEN_LOC_INTENT "RIGHT-2,BOTTOM:5" -#define ANYMPH_SCREEN_LOC_HEALTH ui_alien_health #define ANYMPH_MAX_CRYSTALS 20000 #define ANYMPH_CRYSTAL_MOLT 2000 // How much it takes to molt. @@ -30,7 +29,7 @@ holder_type = /obj/item/holder/ascent_nymph possession_candidate = 1 atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_NO_CHEM_CHANGE - hud_type = /datum/hud/ascent_nymph + hud_used = /datum/hud/ascent_nymph var/obj/item/holding_item var/crystal_reserve = 1000 diff --git a/mods/species/ascent/mobs/nymph/nymph_life.dm b/mods/species/ascent/mobs/nymph/nymph_life.dm index cd1a17f31af..2fdb7bff803 100644 --- a/mods/species/ascent/mobs/nymph/nymph_life.dm +++ b/mods/species/ascent/mobs/nymph/nymph_life.dm @@ -1,25 +1,8 @@ /mob/living/carbon/alien/ascent_nymph/handle_regular_hud_updates() . = ..() - if(!.) + if(. == PROCESS_KILL || stat == DEAD) return - var/datum/hud/ascent_nymph/nymph_hud = hud_used - if(!istype(nymph_hud)) - return - if(nymph_hud.food) - switch(nutrition) - if(450 to INFINITY) nymph_hud.food.icon_state = "nutrition0" - if(350 to 450) nymph_hud.food.icon_state = "nutrition1" - if(250 to 350) nymph_hud.food.icon_state = "nutrition2" - if(150 to 250) nymph_hud.food.icon_state = "nutrition3" - else nymph_hud.food.icon_state = "nutrition4" - if(nymph_hud.drink) - switch(hydration) - if(450 to INFINITY) nymph_hud.drink.icon_state = "hydration0" - if(350 to 450) nymph_hud.drink.icon_state = "hydration1" - if(250 to 350) nymph_hud.drink.icon_state = "hydration2" - if(150 to 250) nymph_hud.drink.icon_state = "hydration3" - else nymph_hud.drink.icon_state = "hydration4" /mob/living/carbon/alien/ascent_nymph/handle_nutrition_and_hydration() . = ..() diff --git a/mods/species/ascent/mobs/nymph/nymph_ui.dm b/mods/species/ascent/mobs/nymph/nymph_ui.dm index 06054830a9b..97ff0507a67 100644 --- a/mods/species/ascent/mobs/nymph/nymph_ui.dm +++ b/mods/species/ascent/mobs/nymph/nymph_ui.dm @@ -1,3 +1,6 @@ +/decl/hud_element/action_intent/ascent_nymph + screen_object_type = /obj/screen/intent/ascent_nymph + /obj/screen/intent/ascent_nymph icon_state = "intent_harm" screen_loc = ANYMPH_SCREEN_LOC_INTENT @@ -30,10 +33,15 @@ if(istype(nymph)) nymph.molt() /datum/hud/ascent_nymph + health_hud_type = /decl/hud_element/health/ascent_nymph + hud_elements = list( + /decl/hud_element/health/ascent_nymph + ) var/obj/screen/ascent_nymph_held/held var/obj/screen/ascent_nymph_molt/molt - var/obj/screen/food/food - var/obj/screen/drink/drink + +/decl/hud_element/health/ascent_nymph + screen_loc = ui_alien_health /datum/hud/ascent_nymph/get_ui_style() return 'mods/species/ascent/icons/ui.dmi' @@ -45,49 +53,17 @@ return 255 /datum/hud/ascent_nymph/FinalizeInstantiation() - var/ui_style = get_ui_style() var/ui_color = get_ui_color() var/ui_alpha = get_ui_alpha() - held = new held.icon = ui_style held.color = ui_color held.alpha = ui_alpha - adding += held - + misc_hud_elements += held molt = new molt.icon = ui_style molt.color = ui_color molt.alpha = ui_alpha - adding += molt - - food = new - food.icon = 'icons/mob/status_hunger.dmi' - food.SetName("nutrition") - food.icon_state = "nutrition1" - food.pixel_w = 8 - food.screen_loc = ui_nutrition_small - adding += food - - drink = new - drink.icon = 'icons/mob/status_hunger.dmi' - drink.icon_state = "hydration1" - drink.SetName("hydration") - drink.screen_loc = ui_nutrition_small - adding += drink - - action_intent = new /obj/screen/intent/ascent_nymph() - action_intent.icon = ui_style - action_intent.color = ui_color - action_intent.alpha = ui_alpha - adding += action_intent - - mymob.healths = new /obj/screen() - mymob.healths.icon = ui_style - mymob.healths.color = ui_color - mymob.healths.alpha = ui_alpha - mymob.healths.SetName("health") - mymob.healths.screen_loc = ANYMPH_SCREEN_LOC_HEALTH - adding += mymob.healths - ..() + misc_hud_elements += molt + return ..() diff --git a/mods/species/bayliens/adherent/datum/species.dm b/mods/species/bayliens/adherent/datum/species.dm index d378482d7cd..c6629c7abcb 100644 --- a/mods/species/bayliens/adherent/datum/species.dm +++ b/mods/species/bayliens/adherent/datum/species.dm @@ -63,7 +63,7 @@ spawn_flags = SPECIES_CAN_JOIN flesh_color = "#90edeb" - hud_type = /datum/hud_data/adherent + species_hud_type = /datum/hud_data/adherent available_cultural_info = list( TAG_CULTURE = list( @@ -122,7 +122,6 @@ if(can_overcome_gravity(H)) return "\nThey are floating on a cloud of shimmering distortion." /datum/hud_data/adherent - has_internals = FALSE inventory_slots = list( /datum/inventory_slot/handcuffs, /datum/inventory_slot/ear/adherent, diff --git a/mods/species/serpentid/datum/species.dm b/mods/species/serpentid/datum/species.dm index ac5177ae5f6..477219f939f 100644 --- a/mods/species/serpentid/datum/species.dm +++ b/mods/species/serpentid/datum/species.dm @@ -39,7 +39,7 @@ ) rarity_value = 4 - hud_type = /datum/hud_data/serpentid + species_hud_type = /datum/hud_data/serpentid total_health = 200 brute_mod = 0.9 burn_mod = 1.35 diff --git a/mods/species/serpentid/mobs/bodyparts_serpentid.dm b/mods/species/serpentid/mobs/bodyparts_serpentid.dm index f75c02d8631..e8ab003c569 100644 --- a/mods/species/serpentid/mobs/bodyparts_serpentid.dm +++ b/mods/species/serpentid/mobs/bodyparts_serpentid.dm @@ -83,13 +83,13 @@ H.adjustOxyLoss(-(HUMAN_MAX_OXYLOSS * oxygenated)) if(breath_fail_ratio < 0.25 && oxygenated) - H.oxygen_alert = 0 + SET_HUD_ALERT(H, /decl/hud_element/condition/oxygen, 0) if(breath_fail_ratio >= 0.25 && (damage || world.time > last_successful_breath + 2 MINUTES)) H.adjustOxyLoss(HUMAN_MAX_OXYLOSS * breath_fail_ratio) if(oxygenated) - H.oxygen_alert = 1 + SET_HUD_ALERT(H, /decl/hud_element/condition/oxygen, 1) else - H.oxygen_alert = 2 + SET_HUD_ALERT(H, /decl/hud_element/condition/oxygen, 2) /obj/item/organ/internal/brain/insectoid/serpentid var/lowblood_tally = 0 diff --git a/nebula.dme b/nebula.dme index 73d0065054d..ede02880e02 100644 --- a/nebula.dme +++ b/nebula.dme @@ -49,6 +49,7 @@ #include "code\__defines\gamemode.dm" #include "code\__defines\guns.dm" #include "code\__defines\holomap.dm" +#include "code\__defines\hud.dm" #include "code\__defines\hydroponics.dm" #include "code\__defines\integrated_circuits.dm" #include "code\__defines\interactions.dm" @@ -165,25 +166,45 @@ #include "code\_onclick\other_mobs.dm" #include "code\_onclick\rig.dm" #include "code\_onclick\hud\_defines.dm" +#include "code\_onclick\hud\_hud.dm" #include "code\_onclick\hud\ability_screen_objects.dm" #include "code\_onclick\hud\action.dm" #include "code\_onclick\hud\ai.dm" #include "code\_onclick\hud\ai_hud.dm" #include "code\_onclick\hud\ai_screen_objects.dm" -#include "code\_onclick\hud\animal.dm" +#include "code\_onclick\hud\constructs.dm" #include "code\_onclick\hud\deity.dm" #include "code\_onclick\hud\fullscreen.dm" #include "code\_onclick\hud\global_hud.dm" -#include "code\_onclick\hud\gun_mode.dm" -#include "code\_onclick\hud\hud.dm" #include "code\_onclick\hud\human.dm" -#include "code\_onclick\hud\other_mobs.dm" #include "code\_onclick\hud\pai.dm" #include "code\_onclick\hud\radial.dm" #include "code\_onclick\hud\radial_persistent.dm" #include "code\_onclick\hud\robot.dm" #include "code\_onclick\hud\screen_objects.dm" #include "code\_onclick\hud\skybox.dm" +#include "code\_onclick\hud\hud_elements\_hud_element.dm" +#include "code\_onclick\hud\hud_elements\ability_master.dm" +#include "code\_onclick\hud\hud_elements\action_intent.dm" +#include "code\_onclick\hud\hud_elements\bodytemp.dm" +#include "code\_onclick\hud\hud_elements\cells.dm" +#include "code\_onclick\hud\hud_elements\drop.dm" +#include "code\_onclick\hud\hud_elements\fire.dm" +#include "code\_onclick\hud\hud_elements\gun_mode.dm" +#include "code\_onclick\hud\hud_elements\health.dm" +#include "code\_onclick\hud\hud_elements\hydration.dm" +#include "code\_onclick\hud\hud_elements\internals.dm" +#include "code\_onclick\hud\hud_elements\move_intent.dm" +#include "code\_onclick\hud\hud_elements\nutrition.dm" +#include "code\_onclick\hud\hud_elements\oxygen.dm" +#include "code\_onclick\hud\hud_elements\pain.dm" +#include "code\_onclick\hud\hud_elements\pressure.dm" +#include "code\_onclick\hud\hud_elements\resist.dm" +#include "code\_onclick\hud\hud_elements\stamina.dm" +#include "code\_onclick\hud\hud_elements\throwing.dm" +#include "code\_onclick\hud\hud_elements\toxins.dm" +#include "code\_onclick\hud\hud_elements\up_hint.dm" +#include "code\_onclick\hud\hud_elements\zone_selector.dm" #include "code\controllers\admin.dm" #include "code\controllers\autotransfer.dm" #include "code\controllers\communications.dm"

AIl*;2=OQcCbx0M|h{Dz)*x8@x!a1J@%79IEPW96_u zy=`ZevU+fDXo*L1Q}`TRn(_Jl>JMhA-#%AT_e9pK^9Gd9S54c3@TH(I5A1x5spVF;A>j5!_&KLDiy8vvAh6JNY$* zDz<0LvHKS^GPPhs=`(Or8d4&iA5C>%4nhk%l9_qKa_lB7(u5;x(anqbc9 zUmasxXY9p<)Rs@2Dp*1u{LC?#No`y$A232fX&0AV9TISIRx_!nNC08v5wgtE|cLH9zQ;$LuS`s6a}L$`7Ev zgTeHT8)t%D3J4Cv?=_F313|7~XuS}UQ~Zk{?I17AWKYocD8DqUiHKS zb_R9ccd0XjA@5W5TbwHrJ0q<{SOUMajVoAG@mTn!T)$|x^b{#+s3Py?jKS`0<-gu3 z&Z@k<{rarFtnoEv%Z7XiyJL) z>CMAvrG=Qzkf18LcaD+bF&-zEZpS5#2XE~EY3#e=nhL&kLlKaU^coPP2uknLr6|&* zNe7W49qBEhBMJmW1f&<~f^?J;iU`t?5_&*-4K)x#k{kc$o^xOB!+F`im05f5?3ul0 z?U`@Z`X+mlAG)qR7M*UVBOt&wxOk^*a|D5$TPOy_6HP(tcb}vXpWcpo-Uu1@f9s;g z6{=G;B$jYSTe_{{JhuHClOOd%=$z6p^`BpMg6`xK^-6i1Nvhbc8FSN3)Nw0)%Go(f zv(sU2jfBX5F#3YI<+CB8aPrIKdqD-`(_kr&aAcgKL+Z8KAc$Mv^+Sp=sIiWkWs-KZ8Qv?c+lJuX{SS+GFD$=o$@uY=W_91ay!D&r z%MeXdRhg@Hsfz%&F_=xOeA=gsreR6F856lHeXD`Dzg-?gVt;{|ZM!9rG6 ztp;~9_#)M#Eb+rcgPu8aUK$8*p8$`V1}H+~Rw+;<10C?H@V6m7ouRNC=ezQ^#RWR? zojhnf+EJmyTUe0QMe$u!=dsdhcj=a(cBHV-*L2ChFQ1NeN?S1BoZO@PE;{)$@?34ha!+eVMmAf|Wp1>Ia0W)IWx@CA_0 z@Z%I7F2P25^|e&jI}TJGx`eI||>fugiTZ*;sc2 zG|qWTFC3Qx!qDU8>oT}&NfX>;`!()|ojK`CmA$h|_W}T4aoYS$$nT+sYVi*d4F%r# z)D`eEaPO3_54?=oxtspd;Ic_2y85(~waOe#?_yTn$DB)i2@islV?^8k-Zy>SN^}I> z26?0H0t3>=zq9vaJ86Kn7_1Aw4UpTH8ub zgF}6QoYC~+ld%v3UF=u>Tqn!tr+@ZM>S*tO=OZQnHlF3l`vsD#8_9v|b7{ylU)yyH zoL!gmFjPfQY>VR8{R?Ri&$jA#KTdaKI*a+Y#Ej?U=i^Gqg@Jkkf`yLy@*A`VC5?(0 zMdRmZ&`w0%@wv)&X-kPC1NCGTsxqwZs4_%!)DSeLLWU=GfdbLC_=F=T{GST}ejgjn zeKEY?HX5NI+w4OPBR9usWr&NLMEeG=uia^f@QY}QI5D1$8PE{QdjftO@N-*;Ecg0A z9)PF_M>m!$f0{zo-uM{1aVpqZ2MxOydQN4I>dTR#dr=X`lLM6jJ2yVd?t*jEND z*HbNKeJba$mO6R6Jq>n7GxV?FXFw0753e}xDLq?fK4JzCMKsTXEga$7)h6~;hw3rt@WuCma&2{#lM?mJg(?sWb)Wie++dj{XmL7 ztO*)MjUdZ(-!U6w#%ER0F}C@3fX3l<_zXJy!Mb-RUI0j$MfN){hd`$5_U|#f82*;8 zPNU(jXL>$?Dp)}d!xsK;EiVgdp%m!3n}3a);2jAl<-Jqg#hSnNC8+DYGL5p*%H4Ge z-l)jK5=Z(xc=0$v`3_)IecSb(2j~N5?LqA5=yQi${983Dz_;SEdPS~UMWwNU^3pr= ztB)L!Vm$zK@VB~w8^-}GX<96;GgI!4UAOP zgX-Jw>7s+Rem%T%9Ew$&$Gd{gg&=aEJo@XCh4={djBAN+trHYKb=7 z!R&nMc!H{=KLNwni2qj(9%ocOSd@zpCVP?5hars%$8;_jIOW&B9{OE=?eHS@kG6Q} zQ}d_jmtbwPC)BVpBXqs@%#tJQ+;LmbNkC+4(^-h_*4qZ!V-&g`c!45yfD45a``2v9 zu-C2v_yD{bn(<=?uz^fFw#rRs|*C z&?DR^GkE-ty4k?kt%3(khG|8TgMY7~c+}LCT2L*2b$zCb!-!=|{9^ttnv$1E!~b46 zlcb9x>z`4>(;Yyd{#;#zd^2+%=Z~;SNm=tB(!5!RnT5ii zM>=e`qH;@~W28?Ns?QLpIjhQl=klGhmfG#N&R;y!r2L~GjE6pt}5}gj17wVmrvr4`cdq$_PrPE!IvFuKKUiSI^AU0f6nNZm|n;?TiT@wJ*b$#?I z0xN{q4w3NG;q$G-C5pLrEgiExXz#zeS`}st?@V#{0f&j32+LJ9XJT@k0V46t*3#R9 zcX-9uE5>Y*U`$+pWP$yu(@GcfVF2Zf@}b7hZ3G-tyW?{Ci!ofj-dD)JIJiI3n`LNC z;#1F|U~UlGEk>!xS674GX*u(6oSJTt00rpuZ}(`Y#E<;nBGm3#+S*x5|3%OTLqp26 z@np$IT-KCz{-sc&+++A;J`zMAMLPF=#Lm)Dpui$cpcz*;pj1s%k4x^eJ#O39TiAxF z{bf_Vo<>}Z-y_!DW91$^z$Y6mhniVeS$n%^>@$l*j^N{5^(tcCk=!b{o58AV_HF*o z-w5w`2%|^K$L@gqN0(C%?f4=K-u z_&k=IY1s^XN`nm)ySc2-s6^@3TJ1in0z9}+J7zBTGQ{ekjlyAgu;=98=^LU(uGhxM zPFq}I7r1WQ`^$^+d;sPBIfly_BiX*ieOO;40g?UX(egx*2I-4NXR33hJ*k~Xmr~Ti zBBIyH@7PqoufAfXdy?|x)j-@`$=ukpbk35ggSNYI=}wRN@}N4;$TYT;i`1B4c6|H{ z=~`-pE0Jvuc|OWh5M{P4D5|Vvz3?n7RH$3_A>jZ%A*Fexb1glYooYY!taDWn9u@aK z*K}_J^))=`K|#!Zzg42yBJsyRbaK(ckZ%X)YO}H@7M`n>2@L=RVjyvN#AmKkUQ$)PVyn| zfU|Y!gC+QIRQ61$R#wraeXF1+;Zjx#e+I{Pqcl;*yNEiNN(BPGkIK1shurcUl|FYv z@!mV~^XJbDu|DsN3_U#`Za^ryJ`j%VoH4%;y&Rbb-;^Dw4&3 zdcB>|TNJB1zUv}~aNorTmHfcmA?Z^O{ck1*VVzjD2%PP>3VZCvrsTC}bUBNM7DV4g z|8BSsCPiyM;@ut9Ij|%;KulGzt`|#W^xi9mwinAz*B?9o(RuObuUhEam+$I@Mh)n5 zXAe%>j6Rg)+qdj^XOAhPSQ3H5mPlO&WkKE>aYT`AIKk@J4P< zKn%VSIe|+2d@-dfP@cOY`|zoYL!$nPwK{40Rez@ac_RJQ>1IvK1BKN%zfU<8hC4Tp zM=hn$g;VXw_#ETmV&e{mL(&jTXE;tRA8LHDGpP}!b$sz5J(`48ru{eV8{-t0ere)k zLRVIGuc4yG$F7X^-{$q=Q*+)t5)IEis#pnnXn95rO zd>o}+8BLV>Ngd*`ERLsZ8@D~V{vk4q_^3^N>UGTuk@fi4XudIP~H9B+%_M{;R`bVk-* zg{k>fo#nuO;a^eVJj&Bjku~&U{D7?WO_g8`szd|3e%RV~RK{7I|p1%ykU_dy~cmaUe@@aq}t2Z(5Qr(_7<7CUJBL4yH5*dkA;oF17SJK~& zYL!V&Oq3P+ND-1=jl+9yN~|L&|5k?k$2*h0AV*@Xaok;Cm2Cq6`E3qVFv{ADaaV9o z?f3q_!?0?p(OhPNO%EvY$Ri}b%d>d6e0B7LJG}SyUpruBF%OMmjGo?$Met<_{_8)zwKIdX=gaAxs1Ofkz+WwGJ6#PztiXB`!(^x$tma;#m+~kQ?!h_N= zg`NwUdGBB+MirvizUHHNSY$2LvP)O%+LVhEF~Zu+xvKn60P&UQfrnnE$p4 z#i)1bK{x)$W6PuHcae9K83vW-A>CMi(;2O1WSeN6l3j7B+mxjDG=~+?ShDJcXzXIS zN=0vP90j9U`z7&84yYu#G^ynN`vs|-ZDYSf%Npk1!AtGfc%KIr6)aXLb7eQ0zywfU+e3w>(-6G{s> zz~@GoqaT)CE!xRFuRB#N1=lZbbDuPVZEQ-n3v}m;S!G8(jA%0H|Wur z(7VbvnRrbR^G9;w+iHaB%25JdSX(7(y|3?uc7cjsCg(sE?1`s`d?NVC?zggr)9X_I zFi*Gef<*?EX!Rz; z6toAiwF>=P&EqwwW63#D8g-T-ix?oH#qAQfxKzx|gTD83Jqh;JIg5X=Bxq z68yFQM6(~@x&FquF>v&x{adtZJ$}w`z1^prU;uq&+BC@&lS)8NR`6(E+e(t7k1=wBT>?9qaUBF& zH*W-`THUBI7dh;!rEsb^l*;Rgs$vh!PPPV5Pc9ng3buMMRz#_ zoC*pSvutqxW+oU&!CMY+89LsM_eV!<%;z80nX2QxeyTQ?`5 zZg+SI#qmD2Prz;U(q%^7?uP3aEvK4u>V)KchHn;V;8?A<%F-B&dEHja!@?G4Hsb~=ej8TYn(SWR8Y#xJ@&ADYK+^8>exLZ9-k`bZ=c(D z09+qezOlQ$>M;B5flo_zdhAIDZhNC=@|feYi-&|n50*8|0dp&ZAhTon-TaIUVj!?e8&s$$T7 zw0PXu;NG<@?D=Dz;;_-9@3l4Bw&jTU#o6na>V5B9+$zW%`s`7kI1U1*cHGTlW&K*H zC&Q~-OmruMiw8p_v;>-XW)awfc+J~n%K3M>Pu|TcHK$)SWc|H+ux*G-uF9xwaLtUC zaITi>vy#x+Zua43x8V+)bZ`reOBqDT?FH32o}cnD|Fqv^-ud$e>36@u$F<5q0ZQEu~|!PUa3d7c$3z!bBz7)2il4s^|N% z7vs_s4nWT?_V->VG5$v@F?MGuXtyb^gBRW%IklmGr4QD426 zj$*cDPkrBDY_wHj27YF<2_t%L`Q5v8NjWnSjYLBN;nqZg7e8hQ=y|^TNm69OV_$98 z5s*+^i9HwBR(V53t0)olk%$BRzUbRVnPr88(X+$mX0iAO)%S%PNmu(Ib06i=7wl{y zydEQXhwgB%fF16$!IdUP6;iM)4Z5B?Jv z=uwX6rI<9N_v9GjrIu$mAd66X=p_v4Ij#mMG_wXx2WS;)D{yXmt6>-$Kv`}S2*^4=4|g^U;ODlb` z%0C&%)_8BgQ7#42r<>c%GtSc;om$*4id=t9R$9;Da%~WYdX^39Mdt*GHTnjZ1;aXn z_fLO2!J9WgJna>N#N1AYaEF4mYZYa(al0{nrX0AI{uvj6c=xL*6(XI@Ku&_&WEqlV z(gAzFg|oi^fZs{@|Jbfms;?h?UGqe&A30Aw9i3e3=$+NGpQ6rdZlFiZTvJ$zJ0@!y ztXoW%G)T;NEaYbh?Wc~Z51SG(AR#JMB(`C?(BUyngO$ECjJa7UVr0)~1oU1JtiPrX;aaYVF9C!I7!Uz%=g(AZ@McDB zG!#f)*YEA$uEY&cvb2Y^2XH*%NL}&3Ng9mb{(eOCS6YIOAd!vDifQp(Cyh=ZDEO{8 zDunGdy8`r0{++LkKc7jB{7}~xEa!|_VdGP2T`MIKJOC~Q35K`XR*yaiZDgW;IXr(* zhvl<5Qw#>1ojFRsG(cXA`?x|KDk)o9S&~S;Z9WZzaP&{(zKTI%t>j9V6oJD;I-)@G0Gii_g^-SVnYl*l^V#rD8z<|ngAY?Lr3=?0gGb(kYl3F9cCtFO%wPt>!3Fy)s#^!L@E;SX%+Z(KW>5?{<0T<+o7 zjp5452kv=rSEALilA+ZB19wk(ca|jmYGt|~0q^>p%(-s2uB-r*s;lhH8;1z)Ey9^= zfW-dpVD&nMuA9>>-=*JyuH`QlWEHLZ6C&C_UnLYsck2XV@a|`bap!qucjAF!H={~u zgS7j`x-6l%x&88uKL01umjsDiJZ$jx4$=oVX$H8t7GH_OfI(O zAcq&&dI=TDATW6n>T{RSOik^*+N)ztn$!6VSbL128&t*a`4XVvX=m-nc&9Yek$E5e zg>J^qC#Cd$(JowVcR>EjK3y__E}SE^Kw?E?)u(aWtFKW*(rW(aF*IDx-*6?4b|V&N zfo^un1Cm+EKsy!6Rjn2z%ON9dd|KS94iX!7;`6F8d5eouUWDvbWv~&xPiMi8;ahm3C&jA|Y8nP$ON3 zj(8I0G;ThG+3wYJNeN%4U`x8OAsmG%fhKw9iT7cM5eIs!-rME+^y}4Q!_Z`I^h8a7h zuv!wCDj%+A#zzR5%4F$XPuVX(qJg^ za<{NMM8m8HmB}4$)(w_TSx45xd9&AZW4f>`i6F;wVi3*XakkF^amA1?4KW=7>N{!7 zNc33)#2h_G`s!`$oWzkM3|}$jn*Nw4vNDRu+J);Pl&GmeGeWh59~ec@E8@n z(QrK?d2u_lEd}&EZTzs2e0E#GE4pv3ZM{?bm_VpiG=k+vQkz(_o`@rKB1QVF=XX2r zJ8{B0(&N;O#E1RWGed(tjl zwlj*k^xI##T{5}4jYf3FB&l}&8Z$cg!vvk^0{-Xm#tkLPE6J%7!aypIi}K(xBey3#u<0k&vI+CDoW^wL$KdT{y30tOGZ7MvWWD z9y>sh53E|cnHAH&mEQ~UONFr&dcbSA55PSKj)y;#{Co~)zt#L4u^3LhC;4xVHfM-IZmWM42mP(b5K-I*=#8 zmcH&52xk!`n3*4T#4~(x_qyjk>bF9Zwc6nQn6IEu0d^n5txr7uX!fu94M%=7BBHm@ zx|{s8<1ZlLapfLIg8reod%mheiZ7D9VnI7jlE#i;+`C(ZFS0X~s|Cfwi6H2ER3CG^!cz#H;sov(qd`fUSYWAO1?bSP=!P1 zL1SSP)e(UhKZ51dcbxbdPGi5p)W736s+meYCwRzGTyf{>BZ+t{{A2;EjY^d2l~{rD zf!-aVScm9S5`6pogQ=_M|H0HnKVSG4p!5A^~;co%>@SfahVNw2}H>Nmk@oEfU*4}j^cnEmG= zt3G>WL6IXnrin|@gP=ekn$Tvb)B6C1o`P0!O=Xru*YUN|%O00FN_1NXHswI~nC|j( zI4&{4v~w{LLst!d)lU=m(QV_YnnAX`b$7EL45&-g|%mlx2la6xQu z*i+V4m-2&k#TLp%LdgPX4?@IKb1HOymUb^h7?rDSe=qla;Se(EZSt(@rL@@1Nswzf zX0*MH$?d3aa^-va^k?P!_nQO=PZDql71{2}DUv=(ur&chrR^PT<#ONjRy(q)(BAm@ zt#*Tl)p1W~W{$-dj%o6`$2cG4ABcX^Vo|*+J!qBCK9Br#JAp<$h0At*L7A}j-HfyN zRL!07`e&1iJa-Bu0O1Xqag|_$R^7s6t{;y6ih-G?RMUx=ywUqhpaJq1=l#KRtvOYl z>w?{6gUD;djOwv-j6Wumi=w>Vjs`>uxAm2ZnaByh2*5q<)h($GenZ@)we|&%qb(~F zR#eA?eKQdCMqcjE$H=-{CaQR!RhvH_wQuuazInCy>F|2H0X!+qJ{ z*LFu*mB(kFDDo|C=PB~f(?ALI+dasD*wuWv$o4?D%X6`awqm9CAekOgn&Cw8c)`ytyBFa^)6>(X+_A<<(QfYUYo)&yDSwmqUvU@;Y&9`k8xOOep^+k(;hG`n*LR5!_}-6%1j)5$VocvtkTgyOazvW`}4f z03*N^bT_w1q^XOvRxrkUxjZ@k+m%fVLL~|~aCte7{k3A%2ajC*E>TuaVg)DCJK*}M zvj@-YDDCVR`w~$OO;1wB^R#Xxh36uBoUV9w<$)eA_v;rHuy1FuM=J19-&2>`nc}<^ zWtspA)XKRD$7{D5M}16M72APX-=G9`Oe(1 zaEWIJe=mPP4^m>Vb%5b;AXx_NMdF&)%J+k*vI(839g{) zbK;=sZpi#w7*u}X(z^jSBN5z5H83oi}btA zn+uFsmZN4zV&oFT@qk-y+IV&9OjiNAj#mR z|88Da@|muPBoMtiny*$r++wRZ=tX+YxNXm&AOqR&J&zAw$VrGhGq#TZAt`VGCrVXa zOwt$DX`rbkcpqz>UD$|9wv$@EW6nU~nf4ax-Zp|C$!m4xEz8LWCbvnq z3PnyrZY#a%v5$G@gIh8X>-b$n@YWGhLT&uZKjWe&zf#(A`?1P>(SACDQn-yB0d7 zTwsk{UI9C(54P6Wg3LGcyrTeviL^TXggj?{EHB^j8U!IqRng>!i8rJOugFYU6AeFI z!j#3!FaC$tgpoc~w)sS9?jX4qD^Um%vS*vlR>T&??-uQh4)>^+!@5>Wu@BscHXq`C z=|`?x+Wpn1LNhHOX8uIy0lI7XKTmb_%ZJt@T1dtqc14}YyE7Z%FR9Ko29~Ri8Fr9| z4Pa8v^Yd-$3_$s1T~xW(e%{{gC8+X9;e2tZgugnb()f)pcMe`|Sv*Oywj#_>|r1r?ARR`y8${>}R|A zSV#=j5j*1O7}qsDs=Cqt2G{Qrk^+d)2AzI)9Hn5U*sV?>?zi~w33+ZOxeBNVSFEo_3ZCsn<&fnFGBX(`z)fm&sv5glnT72_qr{ozBR61D^3xv!wz8;K=Vxfj-MX$anXz<&h!-t5t4i5N?3ESyREGsw+#axKpKXf?$`$U?n1%Jf zBy&G)kw;*pp2+I_a#F?k&0yPorFKbS?6a9MLmSdn81FVVMFW3nruQ>O0eqjI+8MKN z|Bl>{mJ9jn@ij+2{8*j`dpas#f3cX;FCD_`Q_celII;EREegL(9#7OLmkFCca|==$ z$X9x(j9zj+DKH>MT#tOHrVF6b+8f>nzu73bNjAf{FYjyUzH?Xg9A-6CbVkE8myqVH z8>_L9pwX?Lk}<|^!wrS8QDm4X3bj7AP3@ClZ8{-f|Jk;S88y}NCoQQ*Qi{=ID^Dh~ zvLTXWo;qJ?w;$%;0d_jBzaiSo?xqUb>;6sJF@Cxe=3$DEN@W+L#+|8ov&x$UXS7e% z>BuQ$T4wwSV#den3G~|l7fbatl0JY6F<-P6G3|S`;J@uOf!<}dlZOfWdHxaKUV6~J z=nQCT-?yHz>Uwj1)IovBy#uspt^ZhPEFU3i_?;ls{0YJJm(A>vGdo|LEnN)Vo1TWB zqZIV!2~$L0(FxH1{?JIHCb%O!&5$g43uthPzL~R zvreG0XI5~Emk*KUC8@)%;y`)IMZPy5^QOtO4ZFizSiR0lvS&0jIZJ9LCYJ>`@&cwf+|o5)5HPI!{%>=b-IOFt&qvhNzD!8E zFo2RLLDq%SVT&s9$RW(%a^=VMRLFjvrGe=JpLO}8fM-ss`KVl@C20XrDw5()>o2qER7ePc~HOIg#uB)gMJF!Y%A8T-vMF4W?59e$&}k1thUJt%qK!9PhA?fF%0f(C@W zUY8(9-*VK29v#xCl9)KY;!aoF$ucY;Atxz|yLH*vo?FY!LJ2x-^h{$Q!)!hywqw5z z@CE}Y$*$EVpgRwUl7W%EQQi(khkE-zsA;J|SpVZNs0e>_fhXois|tXGSOZT0;1eiD zX->kYax4wor+5rn%}^K^dt0=+O{yU};U(tY(Q>}Of(5Y9{v;8=O{W5hbM|w7MSICz zT}Z}!i0;z+uREFeMVDKd;Gf!rzcz|^xbV-8ZO#NZYN-XZya)skMT30O%R#+80&ZPn z+=93u?=}xnn$&kF+4TR?SIHaod>wf|)-r5wT!19)j>K;-OhgC(v{_KP`X*JWAB z0s!`^!&%D$KhL=uwRoh}IV{{Bc-XCZ_z6Ie*qn_DbgQ0Q1Bw7ZVsc9%OhD7o+180x ztLf#l!EXv%L;%C@lsXQSPItt3O4vLC0RU5R?rf9^F(o0Oke_5a)B%n0Cj#JG1aB$? z1pj-1g%SeOehk^T1#4Wc+$ znK>puoy+GCX!;&kJ~^3tf2M(p=sh!qZ{K^WZQ9bdX$lp7p3?L~^ND5ME@*HH>$Ed~ zk)6RkQE>7IvIx*SO0ZC7e(lE|L06vV5;kp0ZG{1fG0Tf61{WACxkQjK)OJ)6n85eB zy_Bl-XTDTdxtkQuyjHN-D`)}so;_;;&z_chqD2MJ-ah!*~HY^10@IVA8^z`E@CR3WfS>W3+h5O>BhwPtHf z>4ggwnPwxm@$kNziZQ0399uThZDz-?%r*R$l|=fL8LxKpt?dxm%6R2g8PheRM+yp$ zk`rSgBOjj6G^E6O9Qimo6Z;Yv45&r!QdSL4mXB?odEuNc!1>pi*%w(y6r2|ljFKkv z6+F=;3;s()AK{VDfGDlkKfl7v%>M3I)l%#Z0fxtpKb-&7|9)%Haa!WxA|@{&?BN-= zU@eya5+_F_KEwRFY03+tFid9(qjR2%biPb<;uY_OnfFqCK969jq`Sar-|e6v2Ky zE6JU6%a=nN+YV0&1mF2r46VHmq{3V9f4b^FQ~uuw|7;oWp#XsYzYuv&vT>mNd@<+) z5g_s&(dkHeW6+=Yw#G0mHXuJSzz{}RVc_W8#bBx%Pm1rwQrxeVr^1Ge@&cO0c<}di zWhE{6%mC?>tII|3LLt`&xLG@c>Fa-w_Ec{|$7Cyd4d27*h{#>!pUl%cOZbkw~zim DUI#Nd diff --git a/icons/mob/screen/old.dmi b/icons/mob/screen/old.dmi index cc52abc3909bb70f49a3c38e6ed54cc2e6119816..ce5b2f074dcb875e2f27e8be455ac7d71ce2dbc2 100644 GIT binary patch literal 18211 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 CyDcUF literal 33462 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 diff --git a/icons/mob/screen/orange.dmi b/icons/mob/screen/orange.dmi index cb94ada06c8808915dfb3715470453d95e1c2f02..285aba3ec95be29c2fd61d312c9d87a351a417ea 100644 GIT binary patch literal 33110 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 BZpQ!s literal 0 HcmV?d00001 diff --git a/icons/mob/screen/robot_conditions.dmi b/icons/mob/screen/robot_conditions.dmi new file mode 100644 index 0000000000000000000000000000000000000000..717853f481a3a606304710ddb5e8468b885b7a78 GIT binary patch literal 1818 zcmV+#2j%#QP)lq&|CuxY|NsC001yxm<>df8JUp+juUJ@EZEbB`U0qUAQawFA04x9iI{*MY002?| z04o3hUjS58R8>_~fPjENKtQ?x0Lwr?uCA_GSy?hNGXFq8-GG4qfPg%C6QAyY+pd!L1m89kt5H<>=ia4{3h*G6XoME~+O;c8I^>YD7 z0{|IdZKrRlm;nF)1(QicK~!jg#g`3V;y4h-+u*9$k^*9n6}>r(-$Dm*|CfZJc! z1VJtU)MvBsfRe%c&-subynfR}160+#f@RPb02QbgH7EleV0nGL!~sD5VsXq$51}sr z@?Wi1e8mF-kh)5~X>OWGfNCyB6$AhkSjbTa1R!;l{Bmg#aDbU6kPsvR*8~!RBxr8b zXykvApsF;$+}8mS)U^g!xH{kf^4{zBlCHtbHz_-pFu}?VGnWPgjefgn6cEh)APE+J zqzSGgHBiYjSOtQh6)#%_nt(MlfdOFiKWG94uwGw?SDJwN0R!0l<4^acBBb>qSEO<$GW@xvj}ceM=|#@}%M1_l{HLd`V_Xcznf!ARpgxRH+ zdN2Rv%U!_h&r%RWelT;82>|^+M(_krDm|4v=O9C`OEj(PgE$}{)5ioFKTgnTAwm!V zfCM@~yauX1mcWA803kqGLV}l9nPFs_?YwT#dWdNP1OUQP%mKmo+t*DzKu#}Ezn6&Q;o=-JV9^CP)9(1f~^mJB#c; zTZ5O6*I+gq68yS--IhK&K$Y4}8|BBr4;Pc*F$ zS8^8;gyY;i(Y8P7b#OFKG@$cP#{|Kc8iE6TkDuQRK}t^%DF3fAq#l|4czm}63BAbq z|5%1y_x8pT1Xj;lN1b8hsbB7PIX!EBWrla#!{0G;o71!QU1ccj`R0eR=j>rG-1&aL ze|&s=_{X^Gls?-3XZHtV{eO0UFxLNP_XjzD@AdcN(RfqiLZdo!ZMEDv_x#p%-W;oj zDL=6PXUKc%3(&g$q5{|q-aF=eGw%1^|1;?S0|KnuD*=LMl{~ZILBIF@KSh9bg5b!~ z1jhfv4@T?{tORSI{k@KD?mi;;=>CA#NBjTm{vhY?KfOQj1ZjT{b?#;dBuML_|M$ii z5P07McbJ|4xbGgBZ$!Xt66TX2K)#0{u+A<*K>K^AyZIgNlc5f_$bcZ}@4e3L5(#$t zP!FuBCV>9lTg!p}_e%sEgmt~i?~#t(GrWg{|EFh>)43f%4ZJ&s)-&s#Jpp}wNMJh& zXe42Vvrx?Tqi6Qun;-XGvOGSGtxboPm+{5{c&2L7Le>s3R?iXKM340 z?4|?%AIzc;>7)IBc7HI||7Z6HWBq@2e=yenXZHtV{eMpX7bLSve1#=ch5!Hn07*qo IM6N<$g7?5#&;S4c literal 0 HcmV?d00001 diff --git a/icons/mob/screen/robot_drop_grab.dmi b/icons/mob/screen/robot_drop_grab.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7a1ecce37dfc5a869064d840029d98d0f3f9ef95 GIT binary patch literal 410 zcmV;L0cHM)P)=0UeTL8=r%c5q+00001bW%=J06^y0W&i*H zZF*E#bVOxyV{&P5bZKvH004NLQ&w5PzcbRy7T4Q10q0Y#sLxP zX2z^1^VJ@9np^^`H8F@dfiEBen@J(T20jrcwQUf#)yso`ZrM0|@&LIo<~G=?vwe-cI>74+LU%eqI®FUf07*qoM6N<$ Eg4PI~=l}o! literal 0 HcmV?d00001 diff --git a/icons/mob/screen/robot_intent.dmi b/icons/mob/screen/robot_intent.dmi new file mode 100644 index 0000000000000000000000000000000000000000..165427cc63390392597fde4dfcf66a0ca8dfdc00 GIT binary patch literal 951 zcmV;o14#UdP)|O@HynJ2H&+l1nYqzfc~Q%=ss8icEq-YX@DglBnb%V9E7EE5Z2!& zFkuK0R8@r*m*6a9_Fe)#{WS!80u;v&6QJe)oWdU_K)ts$CMd8x1gQ76wgl(B+#am+ zM?o+I*mcG6fHD4+CzIa4@Et%vE8DX=F~C^MRX<#Z0x^pzxF?2RHQ%PgaEz*wH^ zDG*UquQnox?|gaE*S~>2|Nr0;lxkufl=^?rG*_XvZ9IY-blpv;?>mp=4KBkljAH;n zT(75Tn&$w5B)DG3MW}&qvlf=%cAI(E@s4x#mGy>TyxhU=4x9R@6NX@}AGO%j#}<~L zZNN25(1S4|;46Y67?HV;V6L&TEb9$HD}9A=10;<@(1WM8<)#6cfRH30q;sIO+M-J3 zK#6m=+7jIF+jURycx=}_fpNC}TLR;3{apg^R(n4Ic&ojaU@-)XpMV1S?=@TO+K+`w% z>`Y;iS`S-HfFA)}_fMuU4)he}iOxaWUdbHv{f#0R$6=syFwfJZr$9tez1oN%euw`D ZzX704p~0}`=Boez002ovPDHLkV1is3rSSj& literal 0 HcmV?d00001 diff --git a/icons/mob/screen/robot_modules.dmi b/icons/mob/screen/robot_modules.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b9061e1b6c671169fb03d77cf6d1251c0f184f13 GIT binary patch literal 4182 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 Vikq-S0lfb&aKh5g;;9)i{(n(`^Y{P& literal 0 HcmV?d00001 diff --git a/icons/mob/screen/spells.dmi b/icons/mob/screen/spells.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4916ce33ab5cf1a54e5e35e2576f083f0d4e5016 GIT binary patch literal 256 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 literal 42868 zcma&NcQ~9;*FI`SCm22Y=p{u&bjB#rJAM@fhTqeZV##)uv@I#ClOy3q-u z_cn$zdEf8*opb&;*LD7wYxgz#+0Wj4-RoZKd9SCVNp6(kLY_@8Qcj&Z| zuL1F!B-I?AWFE<8A6aA{1!d+Q(KDU$Jkxd0jF)DI~!L8PeR(_ytdnB zM7CbeP)gI{H!B|F0=fIKXeeSlV(|S14L*%BLtYDk@GG;U2bQC$#iutZZQCiI2p*l| z#nu;fyeRu&=CEw;YR^y~Yo+RT__y&yAUO0~AUF#5i$52b=MsO@{qEE8{pqBS6@{wA z#=fYCIrNdElwIP`Y+28CFs-9QYA_(tV%<>Pk zN(>bIrujDhh?#Ya>2J*|H74Q$e5R-$_RJ-Y5noEH?^h8dto|*cjMe?^lgdgwgum|r ziJC3$DlGUe9e3EP9sA3GP?~W;O-sC=d$jd0%e=3%>?HZL8Ka75PM!?ESpo~q6(beq zXLnBe%Mq=tker?dep zo4VuS!SU3U6^!1@?gW!&8BL_zlqyhnl>6gbFso$NO?(@^*M2< zqGAg972c-@<_u^N%-QZXrdwkyWOmAmbXxA6UC@&RHsMmHMFfLwR;SWAX#|F!pA*#6b*d+DVwZy15ePmn+ zwtZd7ywPyHXMgxmTySD~^SXDD!SQw3al?b#hVN1f=qn`>+uNjx`Iq80EaInMEpPm^ zH8I-S{uqDsMftAhcj{nt)GkwQ5DmIjR&<|WmgZ6`ZB$lXP#5@ZLp?8X*JQ9kLaO)N zGw8>DE?+M7_hTD%WHg*oatZJBPpUO)-fvN^I`dmMr3^CFIz(y|Vq)R_^h3a}MeLrR z{k_gYcX=_;<@oFSIW9EFf!kqPJl0@s!-Y$kZ5Ea+-{Hp-pw5t-ATpk`T!*cfX9~(M zI9`0-jqs`p(cH_T>3A(r$_^`QmS04QYdrftc8Q;s+mo#3TF=2xL^OAU=!}@SN6yIb zz?|+_iatTtFNkD#G5UbVNEvE@{gK`9R5xC-CHNO*(I=lYG=hw5>pF^p#rUh+h}`-3 z(2xSq8LgWNkA5XB=}DH=e*CRIIF5vjXKgN=4}_Nxf6V^GV}QC_Jb<6M3tc&YE^|+n zq0-jay-P|BpuUvcK+I&AQ@*7WJp{#V&BL&U(GT&zy}^=y*t^O#DJS-<_Jk7l zWZyn0v%Y`-)H15Q zaxSFT-ydo-2bU5L3Q>l37l)N z7XHVcJNND~3N8tKRGi_z8Y>}7PbJ9ZBhyY6opr0xH*?!Gk3qc-@+n%)XQ5Dwkrro$fFi3C0XZa3*PCVVK38PtG?{CSdW1l4;4&I`||762~}86DgO zN!=FvWmeuj28ZpJA|KFCE~QeIdTFGgUs2fT+mP9LCqbuQpmUION_|ht`dWyharmO!(@< zCFA4pcLy0N?&Ol17yuMHp)+v!8(5|`;PTnJDj?wsT4&OC6Nvm7cf4PPl)BgBEfR3~ zz_SI}=Bdw_6;%Iv8g@GWeTMtnXS3=ZF>4;W2?&2~v1J3QRpK1xqFS^N=>F6<0bvZj z6p|3&K+MCSIpaPBJJtQxDK|5W{ZI9cfw_uLdAZ$TniG~JK4 z*bjDc>i57#!E7yVAG%}qkqt*flo+(j>F>k&CrmrHOEOKnS0O8?ASk4xMvTp9FAbPPho0#c|n5(?MEfZGgbeu+gXMXvEi>3h8|c2bQ!-HJm}B`?&DqO;YmM9l}i|dA&o;YNnHYlbPLR>IO zBgzqWe$lEA%u3cRCNF)va4P5N})6Qz@#qqm{sMRMRe?BCiX(qQ??*2s5x7lRDhevq|_o>2;xElJ#` zDRjFfcuwiWDQSQ&kU&)K|bbyJPGf0zA1G;y&TqPc&APoLkMb=M zl7kVS8*T4NS#@f5m8p>lS-AkJ;LMR2y)an;C=Fc}o?(3y}_IdYzi zxjr7*_IWbkI6UGviKhDIP%a%b2ol>5C)^5Kz4R|n&}+904iY#5R5Wj) z+;9-A{7i6pNq@ta_z*<8ERy~B1@a0TLp+|w^3X6;_NJjcBIs3}MH^K;^Xf~NBMNz6 zV~a%8$5VhKinq0ePh?DX8L!Z%zcJ3`?~r*p!Nlyc3M723Y*h%Q8YxMNq@hQ!L8OP8RM2{b@r=!_4oA_BGXu!YH4?EhvREmz`>m5 zxOX3giKTFWO8GbJ^xVlX?ZlYwh_T~bgG#B136I&I^{BjA0#;SOWhc&pmx;PXC(+MQ z`BhuUx4?jv0gDLDn7?VkElm#^%4<(Q9{fyd?o))MDP9WH)f&qaAi+Nz*@gj9mN%=K zw45AT`9ZA5W>`>O_(>37*}&f;P2ozbqhHw{9elEbP!=x7S>!Ss{lqYjy33`Idi{~l zLLS3!wM9C2dU8(1ZA2OL^GK1Q%@*3E`GSAan?rqyPKCxp*M;SwfbfNt( zYwhcs9`GkFxAM}R5~f-cvFOtwp6&LkN3GYgy(VQlUOq5@7~#q#P~~qg%vFDs2rl+z z=6Fm{NJm*-WEdz(2%P?QbQw7545;Nz-OnTXXoi%wY_Tf696FAbZ(!Kxh=Cskx9IDV z4=*;Ev=@y>#0|d*E)O`7Xkr~w9r^o32m6afT2$x3RbJDfbAEi|McMZ@aiWP<7IIRO zjI0WGkg%ZI*TL8%-QO_xw^mfFJBOj4*g;x)@gxA|qIx|jK`oZb+{SWm64Jk;8iyvK zm~S1%JiuXhCOX084q=y_b=Z8K*0zRZ9;M2!cIMs-XSZBU&yYj8d8ltkXei36Dag^c z|EH@DCC89&C9$~=db_>cpN76V%24Hm@9&&VzbPJq*wE`C>Y-1E)>~&4 znY>xNd*E+=142?i1d+)8#cMZbyL1BfQ&r|+U_SjN72;D9l%+{cLld0Gi|%_ds-F8u zIG<|1n~#x!gZ9IF4_O|I#=bK_Vz{P;>QU}G5NO1LiM*cU{VQZT^5iVjCp30g>P1_B zl8vn8A)Wm0pu(g`-Rapq6P+#3^+7olRD7# zxc`fK-Xf{SgJ6xMk>ZjuMZKgc zNZ~^8HVjs)`LHdS;1d4kd3+Km#CozlqS^ij!|8C@zI0EL=B0be8vdrfw&-Pbun}&4 z^8=gf7QUw1A(BJ{*O|z%UqAhiyrYrcb~@C{k~TG;GwYv7s1Qa$-{&Xk%dPo^q#c9@ z8$ivE*2WMfc9}jyiEt$dP~rE4R|rYb#7E*6hL5w9-^i92Eqb=_?;^>fYkuE&4gg%P z;bRkGWw$#Qb#<36Oet!0Ec~2iM3}|gv*PB<9ilpW_s@gtKN`Tflxz)S7&nh;)7CQl2zw;u_=>RW&)QfKRlC+NQW0gc9&kcApIsI2(C*AIGRAz%SgZsUdOr^wt3x=D7+>nrLNYKSPOl9u2G*P&uGeSL z>4tt#TtP>{p!3bXhGiy|ugSWZPFDtPw)W-G!&}q8Tmi)`_t?x-TbU31<#{6i)=gPu z{yDp?nIEw@C%gn5j(TzxqPU8B-#PSE3KU6Mm&07tJV0>1+@DRWk$)*G)S3`j_a^p= z)^}@@p_#{PwY&_3FSt1ycFpj~c%C%B%JmFiLoI3@3BrCFPf+OR>-=b2Fgw9bZLWSe zQDjQ25XdayVX@x4T`{I}T_TSyy?5!glE29JE0ReC9gj75^d2chhv1@d`9XC*mBT83 zRNXlTFJroDPWtt@o-Bp?q9QZ{uQbVk3kI93 z^3GDs7`9IdX3l=3?c3MkvH9<@d*8a$TMI5OTxbN|Is|W9m6PpQb8lD%Kl|+hL3$5SG>RezuakPDw^={9e{$peAy^SmYyXcNPqdkWfb11A_ z_%=avIb;HYwn(13Byka#^grh2$L6okwC@d<@jDLhP2hNy9KNNh&}Y`UvD>B-4%Th0 zuk<8vRLl>g{$~SH9PQJ1J$Mb8MPW7g-oHfXnb!+1T9Fa(D1$*HvqD>T29`D=WwA*f z*)8F~Fen%Vq#?oaMj$;wi$P|-dFlG=$47oYZs-N4b01gF+)Te0oaPwX(N*uf@&0i$ z_NPJq11x)-W#Vpk6qWFoOu4|wQ%!hK{yue**>rJ#N~{_ z#Da7A?W776oExk{H(Br%KW@VQCxd+Ouc`Ag&gOV5 z%l~DUS6g>zfVs{5&i2FM-rY!ab1-5A!Xm-&^FNXtbNn5C$tHmMOVCPGVi=;L8b!tO zXt?C1+mvN#Y*}(wP?K78(#XR&tXN#|kJJy5l9#U*tx93mf^RQhCV=>J_jcJZ=B$|3 zK~=@9pk|prKVWfB|MhD;o*%hXGMo|d=a&tmXl?CV2%d=Ae{fGAyfMqmyumY(3jSXK z_*Albtv6TOWXGnE=N)*2M@`wD`#;D@>mCy-uXU><=cbDSMMzUvz#KY?_6>_|X_12- z^5$BKe|kgS(Y`zW!+WdfYZUTqP9v`zt^1!|V2lQv=oEPbLcQv6I9|b_Et5 zaF0J||8I-yaSg@2p;Xc+NvajO`E)Go{}jIMjkdV`N&Pbvsgy;0h=b*iFq!|`ap$Zo z1r?O;MN+?=Cu1&7KIAwuoR>j*tO9~a#Fk!_mZMd(`aa^few%-7j~ibDSdnWD5OZ7( zx<2d+kg{)AI0c_|PsAIw*8zbA&-mxqYWzk ziL#m=s&nDGQP=&qQI6g2ehFBXRfKTG|F8To0leNV*PwDf5fq)57;uvu@Kbc@hp#Mk zn3`ID2|Wmrj&%s1Chgpu1 z#%sZ&{6FeNFH-+MiW{0kg1k&RjgWVc`gbEP9y?M&1?TmztY}}}@7VsqWz--hApoPT zbtxFZ^69LcKb)0oyj-`ao0Mof^tDExKgZyuTC->4T_dP;2Z%`LAF^fEQvx5eWQV_S zfTV{UxZ@tD-0?$f-l~|F_`}`XSFreUXL`8L9J8IwH4Izh1gC(V{z{`lm1o3TCsCU=D^JhB#!UKmoE3K9z5?ddfrwfQ zR=CuLdD0S-dLN}Bfv6Vq8DPR~!p!x@pZ>YfLI?*b|)pQKyNu?ooIYl3zA{G~-!RU$om2t)XX6zyl&l zG?7v0N7CT#ngl4~E_GM=~W-!#aDTR=`6-iNRXxE9S{ zk?COb!SD~Y6bN-L;(+Or`;C%lymX$&jq#ZJWI{$q7I2a>(f*3ftsMrUua4|*i~pY< zzwh-x^wp4QbS-7)#owJW)daLLd|}BhA2XCwW%=H-`mZHapbZ$ZK)Uz1z%0mLf+V;L z>?PFzG*(AJGWt9@P>smt6%C2ya7yM7bl0?FB3Kk0fw@(Ow z3SS853OQX2x)Q;vAV~tqc-Ew@7ZQLDuBOg-#-)eOR zi+kMQ_Er`iF+RlN0!1P-ZNKL}k$NoYT7zFiVK2cE`kR7*9q@8@K5x|9`G-zpIr==) z2{E1q4GEOUbB~NP%Lf*SL&Wbl@n6ygPj=tr4n5DEy_ohI@v*Pk{{=kGIUjt!_!+Pz zr#*nqU9a{?q`|1;Kl8Mi{7&eyYIj4#r=`YCrKcy3W79;{DLb_f3`9+mJKIt-)L)Y9 zg;P+8C9Q$x2wB)&_y#x|Nv(=5ub$b;J7aKw=09Z@m1G?jedvDx2MOSxqY6r*hFcmG zeeIy$Tfyjbc(HbENn{+8VNR6PF8{-`O5r3dt;LQ!j2*L|6`V0~(?%sb#|J4MTk!7) zz*6l8zJ6A5`xUcTjpk_e^xw%{wGDMi-&y=?d;1Mzyo;Htw(EmNI6isu%q%Q?}pjxm!!z zhPnObAvk(A<%%3?zMLskCt0iYX#IfoVa1UC6JjaBi1Cv?D?>!~`|IY&&P<)H_Qg+O zjL1lff^U=|5kwS6b=b1XHq<$Ql#mO|mD?H7+Mpg2867l7B7i$oM~BRbV0Bz7mDj4d zpF7+vd0MWShU?}Mz`o=muYl`O>bzka8eGGpykjYChm!U4}i4c|72_`^=gF zeY?nZ(p>mYR^1Q6@qryLL|!RkQ4s71e=j ztM(i`;~9V>=ffM{*9+}Mn&dpm$l$1;xrI=!eC1u?^Qv5aTxz{;Bd@DCK~@3R3n=ji z(UO?ZA>=WIL5*90!_BS}nSHulS|ReiWh#h3a>(xv&CA60Y0peG43-x2cUCwGXjbc> zZIk!Sg~`2+h7Kgify~*+aozj8gEIr~UGMGC-Q}hpbq?HnW(1t-&8HkZF<|cvSxoPW z@Yp^ZBMQCUQ}2|D#=hF+FNLdJzS^GDw)E;G47eOGHJs?<2(>uW5O62N*)5~tM`2r1 z7fTTn_3r4G%7#-~VhN}vWk7VWKGe3oP6#Z(AvqFynHs8pd(kI9KGlBX+qyTVD__n` zs4Nu84}eQbtOwrH)d2j=m2W@D91e3kO4EBm$U~+~hY$c)FPhPhdVJe0E}@{H*sAVh zAKP+FwR~NAAqk=*5u_CUVp`3mPe@b~wh~6OHC~$Jve?%8u*z+^N+F4Al2E6cfe?K5 z6!0Efp9iOuJJItU6fAM-YqB3=XuW>RXob8ujsjjzHnbI$QR=&2MC4v8TYCR`y5-lf zSP>G4J>AOk8P@k(4ED1nP$s)`UgkPgvDHJXd*8?oax$vq^7nU<%SN`JF^-=X4-jD_ zrXJhLw(c|Vk_9aQ{kjpWh*CQIRnH}Eaa3YsOY1RX6NBXjezg@Eny7+IWT(P2p?6PAL(?YK-& zV-uOJ-2}UM*lBF+6|(~|AouAQj&T4c(0b`a<9kN~X)v&;ua(wxdfP@&x<|xI zJz=_#OJx~tBrzVrTbCk@o*T@5E(T&1pl-qhxm-&MAY0*qPULGOlqmMS^*>(!JFS}w z!O^|>cbQ38_sMOco^6*7)SVyxUxJloy_P!Ge`flwv)IbxWo?x=ETHIn2KaL=61HOP z+OcP2%Euk}RGT}Zpf8J*Cf(1ct8ALFbf`<*B3mgw4Tqo2x(ZJeX)@M1{o=xHPuvO% zfb^l0z+syxdLsg;JN(hptkvI|!sTkGDr8Zp>58^17i|qs+%*_h2vyb-k_$MA#m`W8Hs|AQER>>Na|Oe>y+`e?-#39vj+zt^i`YyCcBhULR+MNX-S%|$G z*i#=1F!~+xQO*|Kizj5?E_V8#rt#Ch8SZ-bJ9&v`c01H)aUwlILK?^T>3R{k#%$#Z zdv!ul9qx)^j3(j@FzSZAJY#`3Qo`xHv-VXvf(sV{_vNrzpi~9h4r*1_{DG3{YLNsV zI8gCA%ET_bQ32xgIr1SK0qYO6MUpE*Hc45!@uned1?>5D%%3{N??eb=L@0)q#P2An z|8GVRQ*Licgp1uOst7Ij!Fp2+J!g5>nTkz&XJ19pjfYVyoR4siI?iWbuKS<5rJ;}% z$|1NZ6$-i32taaxK!k^a3`V8UPfR4llpKc~I2SFo?c+kYafL38M)RjAl`LIBgd%M>gYGr36bQXM8xmL2z_j{tvR{mE%40 zAm|B(s+p>2khpa1BZ&X>F5a9;WZSDi>sU^$RoTM0AQ9UdDE_E!D*2YT%>|9j0lh?u z_x|BNr=QSIEP^CP-xUaLn6BP&yWuu9z5kx1C$kT+GJLB+%4gk4QSxlsu8yW@BPZ}x z%3bF7e1I1#VaWUt=xj^pyA61LK9yZn#-->J#ps=1K9>-+?R zd!*o$!szc*Ix@RY%0u#kK>G?`-jCmfvx5YDem4LW&zNhb4_KbLXGQMSx{VCEXu&isV=I88AAN6#+w_k=Z=#cQSz--~yr#FG$PvvmiZbvTuo`!;rXv3^dZ zYgYB2C?g1MoLc`7Bw-}eJY)QNw;AQ4)2;HKKbhsiaajoTG5?Wsz_Hzg?@gf4{}FjE zn-?8vvAZ!)@;6BWHWj~7Cg42XZ>7Y*QZs{?aNy3L(#B20d3I}h|FQK`_5VsdIX#!` z&`^A^^KY1F-_6z~D&u!mKJ!I~^OH2@=af~(&Tzw$EhTvuK|!cZKDPn$t2jE|niV94 zULLjnyqZ(t2aT8yK^h68YK$p#jF-tgoW#NRg#;fS9dhME9-f)gUM6$pCp`RDBluL2 z+tSFuV$Cona&zWf2Xw@fGEMH4fLrf=A7B_ zaj=m3e+oBax|~+)C-+W@kByYw?bCvY(;R)}5dBv<7Lt-Ua&fpiu{Mwt?0Ij)`VO-# znrivb9pAq5k~5#DpPz)3R{??xOd&mTR#4=v*Dt42RxGMl{}GZCso|cKhLt5vndK9~ z_|pj0Y1g%y;GjZ!9Gi?ogrvg`_eO4a>-j>a)PBoxjTO%eH2)(2ulA!5bpaSgx5%|! zjP|27jmE^y<|{V0M1s}SNVC;In0ll^?1pY64c%|b{!Sc0TH`#O{V!H-r^M5G;kG{T zcC7I%Uny!!ke4Fu*b3uyp)HMkanJ+6 z-==uojy2yPH>girw1Haq)gVxUE&_b_j1z~^74F%|LoK<_-hYT3v@GxnT(Xt7#QYJW z_$D>~b+_RZvpBhU`;ynhD+l@EI4>kB@O%CG_wbPB$duz3A zqv;7tbE-!+c8063pEQuvNg@l&{x=a%++Px?+&k` zh0xkm;FjitI3FSV+u}?QjjU^%)xmp}AFTm^mUF}BKQqJv$Q<}T0J)xH@TNvM{=8S7-!r^5CvFvaG)VAUY{jO7yiPQhO;)wx)xGyC zEnU+>u%r8_H0O5myXW$|7>*5$>iO!pp)M>Q2gjFlk^^q_qi@$G+Mk)8;n0~=JM;Qg z#6swuyNs!9mD?L?%76swiU6o=hs=JkyyD1W zUfLgz<7k%%p>Ri|Rtu@~>Cx--pfMjc;`j zCz8FyCtF`@yuF%g-(n|N>Zts-*K7(yuz2Nohn9Er$Kc^31JYpQG3*sIzyL?YY7W-J$iHyo`1OnP>tSUWn#h)({!> zk7FTeaZIZ;IMN+m)EF9ii&;GN_owf_2Lm)&hT0ND9*U}6 zE)n*~e)mz!N#d#rZXrl6bmEaiYvZhm0s~>`-w{F)tDPJb_)7Cf#BVb-I0P%$x_{rS za@^`2um7z5^sf6;$B*E@HW|X&2s?sm-SbGdB+FywGE2ZO|L5iw8#tu)~veF1`N za3KA|&8YjuPVLAmb#9kCgJma?zaMC55CoYTHNQ6pqzeh(>H5^+O{IRh)J+VaZb}B$ z6FYnJ8pV5zA4*wwRP|Gv@+DvcXLz${dk{qkA9eZE%M=r|6dtO!f@=t^`k+q{l5$okK<*J z)bitGP{0*#gRA#V$>F8HuRlc&+$?oQoYscoq7zSi153fO_-;|Vhf$K0J1HnkXn#?3L$n#YT7IfemR^O?0EX4U2nCmRus> zW~WD6gp3w>p>}D;vUeoE)Q&*DJ$1(UNc<+oa7IxBC{kIR)lcn@G4w>SJ7KB&b7Ho; zvhrS<0Q_U~2vP)`g}+CWbyCs3tMu1l-aMwN{n(H&riJv`ZJta{vDGl zc^Q1Ak!+Sld7E45~QQ=LN&wP2%r>5Qfo_a$Qh zX)wwVTYzWl=_lA*0)4R2QA9*ZJo`D|+!03%J)Awq>6Uv)ZOIQf`wW$86(IQOF5Oue zaCNPA$|~?L5J;37t{p?3EYy@*L$$;WToG$6!br^g=xCniIhaZK zxeVS&c%Meg)(y6eIK;>%tW<#yeF)Ym%TZ&ASI%J&bauYMIgokYn=>s~M|O`3aB zd%)vkQf4wo2iV%R$sR&(1SEg3xmAe ztQgtp1R9sH-G`f2OOQ`Oq@UMtYYS8(Ay6i;!=D^`jTeu9S*_UzChTQ{d|%KgRWt~? z82y=+!bm#1lR-&7p%8+jOgoE{wMur**k7LFwjXA5%TcH6q~f=%8&H5QpYN?>{9725 z?ws|}bGR`kD~KBNkBB{$3Ht@5ZV;!BmQu4Azk44ZN!7!1_@jO?1XJKiFeQTv->Z8u zKoh*+Q17BgNOyXrSz2dGN+Nu(l%s_}VBn>m7;CDx$01uX_?Kh~`<-Oa{E`6$Y_$Tv zAw^o7*k<8{Bp26k6T?(l**6GgzT804mW_ zLxgISCSnyd7Cd-;rRC*2d{(!j;Fy^6-{MC+Swi!EsCUJvwY&|j^DsPq{7k*KAt+V_ z8YGeEB7G&sv34j|Zh@Ch06QI}*ejvoZE48)DIl&GD7~I$N7e(JP8RvpDU#Xuz5rfD zr55-jP2@qAFdmLFX!+de2_`h8PHPj20e1NT=z-<}k?1|{PsSxS<*8vVF&p(eQmq$*kZ&)gk9ya>F0yI_Euymq5k|Ukm@oJ6 zaJhtb+2J|J!s|swgrk96Q89k$i6G>O&L9;OMu6AV6(B20204C{$U#U@qrd_(U^d#~ z5A+}ewaG8cEO$q3U;fOLV4TDr=ic6TPR)|y{1QCpdF_o+W-cN_T+8)f!ch_}jLBGM znpjdgMZ6FrQjvDJU64`U`ks2-oxe1!<(7t4r7uIsn5Nn zgrikt0&&|76L`ETP^a^VRD2aRY~CIlV|YAAWO(YxBxN*ykjiqA}o(ZYo(e^_zSS$H)9r)+?(Voe?R{E-{muVgKjD8Q9#8bKn{1Y2U&l4 zz6*%(g<)pa3(3y3PJbUrG*EGXjgqyeD_bOi3Zi1Q8y5fb%YMmgQ8lwPxxji)^qY+z zZZariZkoKa*L-?vpWQ)*Vr4@uE7mWjij!ArbVsUWjLVR^bAZv&sJqwVX0E?Rc_d!XYU zV`}jAS<>C*Q??~+o?pW3XZV%Czy!+ z?r)lL^G0XlqnBL6>^--Q-{A!o@+5sjCA}KZM|b`xatH<^E)e-vP>9D?)YgZ?-|#Br zA$=CnIMtS@H>bD#(@PlCDTz)6usru!2#mKyrKCG*s=lTMI{Ez76-2#d-K5k35eU9r zyv16-AXLUIOBs~1ZxPp1vp{P|LMtr9Y_k`oog@g2gxXg5d#RNHhg)J5P8yv-`O99Csv^%h&-VT7DU9yE z9F4{SYb$dIjlUho6?=(xrtup7bx7!1XkO1>(^vaHw;YZwyeOl;_aqP!1K+>II%o;# z6Gj>zf+<_>AOpBh@o`Z)S9ph`AKnW3u7*WHV`l{vI`6&b^dMaOGu}d{$12D9+`Q+f zm#5xOe1141g5*7l%Q=XLOAtlV)#lJ{reEuI5XSuw&Ul9>+CMo<;9=iBV~y>Pda#Wx zwBA5;f%Ikc_+D=r*~4gH!Pl28)P#g_5yy9aS2Ag2p4|Bx^hg(`T{M2jeJGx~*Q04S zHRe0w_@$;I9M~oPh9lxdXiC6swQ!bHo4onQ1Xkf;z#@N$;m(gUZDQ;VqA|>rnV#ri z&qr}%BivWgWDXzQKv&GBm%QB|*wI50ood0!rl9DhcyS;oiZ3x*9KLiP2b21{WUnGV zqh#FT$vZh7Rv6tWWfjRYILyTXlMu@BeP&xHy1=Cg?Q020fB~S5`a6V6zl&WvZ z{PS0jS*mlq36B;sN)a+~| zd;HUiyuJv-V)xGG58Nax!qu>8GoIHus`}8v4#|OEe(!!5Z55_uJz5Y&Jes(p>>Sl+ z_vj7I-=(agrd6;XAAJ|LX3CffjCqNzzw3o#-SLIeVZ1GcTP1X48{#ke5d|*%w#P5O z!;xR16JAcygpCQH1S*Z-3%y^U`!2d9^;j>+38<6|bll&;HDPDS?kxbW7*r$G|2U8( z?91kHRysTAIrlwYspS5X_TZXd#3S;OqL*FqTLqIVg(TN_n84H9KMnkm1{)5B(5mgz zo6la$8`!>Y`=>X=Fz9t_zMJHnxeHczgfvopP)395jyR$6%yUV}sM16YInIyeV@Rr%DG;Q-z@4 zHK4D&PToL$BTs%^=|hbQ0F6M!_bm4_pJ>!Y05-XwC~)M?+<-j@yRt$1oM~H;nw-Oj zZ`>YWKc5jg_AV80X;t=bl7`hh7Q{paG@Ti~QLG~<9>)faQu5u)m)Lo-aBHxkuuots z>%r#rPX8vv6gGMXe})#pyK|mNfr2B!8})5Qx41w)Xi4_#3}bmc zNJ}3+YKjV{k@6#|oWR`IDlA-hZ0Vm20qML7LC-y4pf{KE8X?~I5CU%_d2qLtuhCdE z^3A${Kkx|`iUVlY=#_t??efHFr_`VqU+5gev38}+YbqqgrSnbP+;rHLWAG4*rqfA2 zUmSS@^`Q9S|2m5!ArW^qCX%Q{J)RJdLHX@3yrra>ubDjHIm~<6N7D-zkQid*>Zc+i~pEjtMre( zA(Tq~+Dm~Z{Q1Qu63ihlEb#abn3q~jX@ZS}^eB$%Z-x;OYYMc>DE$J4*K=dVn}56z14ARkd}m{I^8XW#So6p0RTa$n zAKB!&y)Pdmab2ShQimTa-zOL!9Yy?|uC|+0xo?FT-4EPvmGHs2>FpyxNMjRT{Ydj83$32=R0Zjz6*&zk^f12P5@g78;*%1{McN&O|`Dbt67X|FBI{>60M z#eEmaBefy`H>F7y3j;&ZBKi`)co{6*uPnzlhOrG8ok2Fxfypq%Vx5 z44!BDkNA*#%o|G-Ef`IpB>vTNu`SQV3A-9Ezb7s9`M(pwnP@!d*fOS%CX~-*y*f0* zaD34;d*8d?%iJQrL5uaPRIHMExlx%JH2<9)3LcJ3r{-4K%#U$(btM;ivHl|+_w^%^ z{-ceE!;ia`r@eu;Le| zwf+Q`fkfW7oQ?ik0yxATL>dVQkGSfrRwE31WfgSz^fcBp=ySjLq#XwLg|AjpJX8FC zCjvvl)ehlr^3>j>m@dPIYvy00wH*s)lJ)cm3A#3?Dy{M556S-o z$>J?JZvbQjq2f>JpOD9`K#eG(R)MmIc+fg9YK@4B{maMz|Ag>RABu7wX-4<(S#v}q7g}S7BY~~(sbqRr&VkKf!N7$Y?Ap%Y( zOg?^BSekwC6DvHfQ6b=obs`^mz{2*PXbfer4^jVYu`{(~R6 zp*Ky#;@nTf#s4qH-a0C(|NH-ifgz<71gROqH(k;>l(aCEC`c$GAt@<2G$H~L0@4iw zGITdcN`u589nvMuF!%WRd_SMx_pW=_UH2bY9@ZMqnX}L9wfBBL_VXB5E#`1S2SO$| z(sY94MInKi_i!qe-P0Xju+-5}e(H7d1$}3RYCewK$HisGLwHHK{m#O|*B_rGd!H6jddNU`!(HXW zQq^A@kVROTZTD*8;=aJlzu!!Myjksgc^v8E<+$DZ36b?mUhZa2&?yyAP@ZB5jmMtc}y_%=WhVqWv;D;{s91(CkWkUflzNo@Z+x4#l zyYSRMMBiLWGWAG^1_-BBNFw%|Bp-HO4mtVfmi#COMyUVBY?eIP)nnZ6flv~nqSrJ) zk#(H=krXkWwRkHcf^z7Hhm5#!71Yz-4R8gX zHLONUlgv8Qi&5U=VkmPyWEcrXb@@*6*7q{|XthcO%8$k&hNX6R-6x)iKScVMH6LqC zpXwKC8-_D`+q^payu6_zSM)})wCkI9(fD}SmT$>ewkAofJd~3)t3RHj9TLaLH4gPzIrDkMPJc3*T`?7Ii~z|#B~5hS%#O$;R_ zeC7}hXRHI%U>bZ8-;2W&qp}y5P5^Kj(0hxhwwDgbEWEiR_hlMB8dl*qaCTjHbRFP@ z#AiQf`+tCgfs}u@mjA$n|H1bEbqrte-(=mtQT~6Eb^l+-{x^Y#4?M)cW z{GVh0H*)d+?b!eClgfICi_vvdLig;>RtW>M10w~ZnH!RMvQMsGTnGy$CBBv8Yf3!E ze4-cSP7V9DHBo3iUMoPNmZhcoZ1{a;=1SOUa0yBBP76V2gvM#hW_U>pdWD8`+EyOtvAPm z?TeG-(z{EIjsV;AbDfaU8Btqvz28(Pp}jerJ{3mBpqNPkTL5UdU9|ta;2tS1F~AOi z>`qAfo`7So4q2(S4PNB$0;It9+*=gi+?)A&m$Ga0ZjhTw6rJwO8({0({wUBo+SbKM zBLGgwyK<=#0Dw~fzEY!(eGEq6Z*Ol;vV=3{*xA_`0P~@yZP|P#wM7L5|C|CsUy%d4 z*7h#Q_LuL;kT>S9fNNy#w_eQOC&m@ZZ`xRdIYaBXA1s)<@6PCoiii}&>&QI^HZH|) z01o4%TDxK(udWEd3V$&#U3q?z2m>6AZRan}7w|{W96g)|H~{%n@3Hn5z*{)~V&bT~ zh`l|pp}+c_8>7KZIrGmt-Z3r}Zt`8KmHOe!w|c^fNkG2v_oH$UNCRAe@4swk>6*Rw zZ#_qW7#Hx~X!t7g{++_*g|0kQZf0Xm3Blb38Qugm!%5_CK=ydLGmSdW4^#g4w|Ez9 z&_NQxxDH4wH7kg?zffW!Nzh3zP=E!fiM9e#&XnY4nm%0L>fDE&5!rdINvet2+ zt;i|N^l!{6Yc`1bKc^&*`?+hr+BV*});?t$U5DBMz?CBU9e`QOQ2poEpREZ|mrHev zrP>y?P8H>*z1q~j#aX9ji%-TJ0)QIdt(i)8Bd#gV^ zBc~n$I`pV`dJSAPxx#dG(1&1{|V>uf39sU2NCP8^0yx! zQ8_w~IIU)qcY&4_;8f!(vQ6pgNcPrU4nrk3VnC1x_ ztek?d3GY^Lh{HikiPQW;q6YmNGn`Oba0o)q2o^E|!@l5QFepxupQ8PFqKt2+qYN$7 zTnkn~{U(j}>{TKOq3-3#^v%(hTu%Vuc4SXDu`(BBntIIU%PXoG&%8yoxUJyVJXncj z2dX9q7xG$aH%eX(JCNQu(1aB#A-M-6d;f}4I5Ai`y4t+WKa?F`3payNe(E)pw{#Iu zTBgSHHBGwX<>mjm^x~qVyptw69LOVd6G&8%agX9Q;-Z{+GgQQJAa-@{;|(X&p3o}T z(gDD2`1HnH%$|iS6KQMLFHp!`$dfUMX=U+lTHrWqgsHB8@Y4EleAWZ#fu#hdj%Sv0O7r~hw0ykAT zdME%^e(nVqgS)2LS48hF`HDF$yoh)|yL(S^)$En*DLKo3Z{bH!WlhV`c2Mtp4?8QP zfZF}ESz5*w$&#nva-5V)BAGnrb*)=cTxd+BA8NeLDs9%26@vfhWrsMD_R4qS5fP9O z<6FM9_=s^~)N`yYl>~Nxe?OIUpW8dUMM0;ejNz3NH|;+Z@rbkSVk&>AB`!I|$et0o z@vH3+H0a6<49TGsMfwvECtmvvn{Fe^KrA&&Z5QQ|R0z64r0$O#{`cm`KE}g_-xMmEhplNCw1ssf*(q?>YwgI~T6{P%&@_Qj{_iT`NIe`@Hh?hiyQ0 z-@h)KtSt(o{!b{yhJ!RfFKH-^6eq<#M1yk_K_DlJ*Pxx)EQHu&pi_GvZ)I&cjGRe| z+B9jpwx*^=stNu|9`tv`QO11_=+SqGZcmncVi(GBcXfIra}ZuKMED^+<#1{!WF}an z%Sl^GS>>6kEL*)*_WSQy&Fu^+1hY>om;O&sk>2Np1DxAf#T^Ns>MaGaR1+D%x`1#i zi-dgm{;V~C7QAH#W8CymA+-JcgaDE?P|}h&${^ThVXU-Y^nK75){%4raIwR7#RB z*}{H0ngf#ve^>T=R@iV+7f+s>ArUy`hk8mhU9^pugHN4D)6^B-cT(=`ep!A6L!N@&26Cp z8z~Jf3mcFeNlNtjTHt_g$aBZ?Y{`rtD>;n$Go|SmkH;{Ye?5a;?+Pd0zqHs+>k&99 z)bC;x`K&Fb!)!8pFeme&=tgAlY<*3?H(ED-G3g!yQ4!bPrj7u%Pk)%)fT&->#|m#( z7hNU+y&hGfpz(79_Ac+|qzZ{|%%N(bh>JTxaND1v1utPwj{AACc23q}Uuryz=SV7O zwzI9iT)H`)lTnyjR}YN{kDksb&gJ#lM{_UVx*k99|1nKEc;n%>LhGwV>&8M6uA`lt z25U?_$6Gk3IoKQ!=$sRV<01G-UKYO~IIb6?C`Ma^k?4HI4se1ILO)RwYl!1}`H9%Z%Q&`(m0_VI7aIH7S= zDL8%vTD{I3?!bp+k?!%0LTEo-{jTNvMq#&zKTO!m-egujE8>uH1`e8}p)@Z3XO{kc z@44LvhHkkU5&|#H#jGKc=i+VK`1+Q0BsWH2`%$YA%B<`Rx7o<6ZNK?MThwvBUQzr^ zVi@R)!O;Zpauh_x$C){db-_L$&u)9+6Fi zWvXA9*r8mutLmReTHWgCtPxa4FyT&^4-{(u(H-E#`O{z<6*m!V(WA(2lpk6)*AnRb zl-P}CDTF!C@QW$%tS$+|9i%lvBCPtm+me% zYnI3r==g0W53_`t?}aa;hlJ>MRlg>cVHW6$OaIaHr$Z_g4BkaGQOOZe_7&N@`j3_2 zqETL7k0XnO`Y@h8_d}rE)d`@##8rkW#8~Za_WM{0jdT1T`X3g>D2}sN0kOl)^tU@* zyVp5fKj5MZ@<*nzn^0a3=Ya7z6MJL*viUwvuF)&lO!x#vF5ReJIIDK>c~zg0(1kGKys#n*d{NNxqbW6N zuySwy3G`Y-N1u@tTvHF&v0RQe$HJx7lup#+V-tN1{N?b84MRbla?bC%!pQW2{!`ul zAhGRmnxxd>u16_}zWintQYelF{fy>0AKQI1CZk^DR06lQL0{2IXh`^SXE&Xg{Y^=@tbs=87d?3#SxfyfII7biM<5?jF5B~t>fv(aN82$F9j9gY|;R(g+{AT0lj9#6Qu> zM%XJo?4`lGOO%tdLPMF@2vjKOAYc1n-Z3!%C#w3=!vn|lGpW()daAWtT}MgE!IJ+K zO?Kn~lleJO6j`-Q#B?JQpqI&c8RSJScd>MTEqMI`Px7U_fH;k@2JVtJop88`F)FV1v0Gr1USJt9Zp*6flHpf(M;|%jNiKcY@|BZ}v6Y1nOwAFv6q9khZm zGJZyI>*BujLHBm|?g)M$LazkZS%HAaZd4Pk>o2w{>=8!W(FIZ-#e!C3q1BdC?+w1! zJ{Ii_Ec%Kvy}c0i--jW^vgLG%vTFZ)DZ_Qzm<#2d@8X5I6TH5QV&e!DvYtG|pi0@}0DBT<)!F_5;) z-WUg6NQ|FDZ;2q-Eyd1}P9tPA@9V0}6J$M;&KD|m!YM{^yIyKajDx6J>1RHp(t(ka z+XG-F_-e7VYx7!-72>CN$@NnK+;$Zpb??t}Tag?jGD-S;i z=`uu_h?&!YU+J&s?>0#tMVt+}F1_B`WbEY5`Z!WHGRHWwlHUL`4&QV1vG~#*_)2B& z97cSdLDE<9?NbUdjq3db+f0qc+IoswB@0?ZipkcH5?1`6Y{U;eFEDo&Yi~`=H59-==_)B64nEFC5^BpZZg~BsK_dKfA{i3JD%u>P zL?T|O?ZLG;bB#R|=epGjpVDyfjS9VwQ|!OiF?4Y3w)BDB%wq*f5S5dM`z?o^q}zRL zu4JrXcOK-#>%={U+M;8;$#pH|KPJs-wub}^({`%ewOzzY?3vI|j!3Qg*|3}tK77^v ztcXcFoSez6i4b3r>-vW#4RBg{m9gFqC0`VX8Q1}u2sCG75D230jR?L=R7%ovFe{zf>bMTOv-;&vACYUj!q!@3- zs?XJNLnE8uHKgD)uJ${J?rR8nHJ+!XoO;UD(J`9LA_Vw)N*cuv2#-NTpW|q~c(Xt> zqa!I_vpuBTqh8P(x~z^%sqj7sR;~<-Tp4`(tcF=f?JyrfxkOOmoHGl=;HmItw-Wj* zNkkm2{0m)b$_z-FKtW;JJB|I&fZdADOAe-Bb+kX@CZz#xx+#nYkE8mJOCj{#Bc5$~ z?QrMKgQg;?fQ5xwojx}5JU?uF^`as!F16<}K3;E!C5|uCw{ZHLeaU(@CH0vS z`J79LJFv^jq0+(xrx=vptJYr*0hl}2okw$D9xeCTt|XT)i|s0Lff3f>j_i>Czp2NI+LOT7!9VnTd|kX$+2e`oq^W3cZf{qvb@2DF6}$0wlZ_K zg(=xNKe#hJ8EpAkmJ~dWLHJEnBhcxK)M(2K0d$dtbzo^MIR-@-SMB*oN12@96 zos)xarYe*0^h8YP9yl0&XUjhJn-dPw3yU0=Kjo&TEVhslkWrO*Jg;M5MGlc`&WZ)- zPWL219OI>F0OyPr_BpdRB|@pV zth;n8_z~YjKH#Q&A}{VzWw=C0xMXlPpyvV&faI*jZq|Xk<|v#0y;qQ87*{@D>DOrb z{GSzeVpYQW!c$G0wz%6N2HgAiPWQFWj{wn_Ya9E?9}B?coW|M*xXAq?5$yxTWWaL} zQbfR>6TBLVM{pTPljT}g0EvfISVLOzyev~EQ+ofowT$eCkqY9}T|w_oP> z5V>@Js6Gg|duEEpeShj@Z_+#M!=iPcQNu@u;58eBQ&3ON@F&BWQwn!K_chKt6T`tM zF}WU!k)Tz)@grrt*0Ql=r)-2e@zLh?&*Md%7##nMwp4(FVCoL*q&SWG#BJ8ixa_rz za0fcZ#f?}ob_K8W;3QD?LjBm{TmqN=|v~ ztYp4~z#XJEp}aPePbIe_eK&1d%DF0$)?{#UaL%}SviXboX;qIJLzcwnzj5pT_&mho ztaW#zTV4+SHqSR`289FuV~%VP5Rbe(#ND#vTeIX&;YDW>g8k%kKLJ^ z&ziPT%+#@mWdt=ba_bQW&BM6LAF>&SC03(W#!D!!{nJM+DK;ac)wWDl9>AG^*@Ov?rL5)hFp5l$Mn76*IV#K!I!snk)1o`)+ZOten4V z*_I+~ZMV|?zFn?Za~8Ldbn?W85Pu4X$fV&0AoMTAQ}Z zDi^r}NCQ00crR&UQ$l-U9`wjXKeohm>2$8rv83&|KY6c*n)Pw8<%KNaz!$bhq4cZV zBo(}YS$E-vY&kiNpR7&5x^e&w;BRM8Y?WNO`~mc4MZsq(ZMLUrN=Q|Gon3#>ehRta zzs&s<_Xrq(lyV;*WcFIZHC+!;BuW!NTzr^TtM{j&tTVY#Q=FriBPSw(oD&|L+7_l4 z#FNGvs>*6YX%@TI4k~>=@gU1=XPu$Y4 z+deUfm)TSse845oB zYs0~Xid0@@MTekT<}>X`%cwr@*Yz^ED8>-AcS2 zVMQjwYcUy7-Jy%F5cqX)y;O#v5W~+~_4w_oa2cPVt1duup2Nl+m}d;RU1(sIH(()X z?6GF0>vSgF)zywbN`h?8pgG&@h~t9X)J}|Dz-20`;OQy(N(mjPvlmwDXg_P8qOB&K z=`-l|4f$v?oE#A4s2J?X?Ite-e-U7>3-rj?s+Gwx2 z+8wg`>N|*0Invc;>lVY=F{Xo0UC@d*RM#(2;^CY}b>MRwRAWny4|< zGGxNnZL!E@xWlEf9!!4o)%)~xew4BfbL3xR)A3?t+&erPUCeJPo$rBhnbEnv>Y5|G zw2%>u4bJpH*d(cBEyFZ$9p-_NNo7SERe6`sItL5-kzZP{w=;^|NOf&>Ni6ZbdE#un zz23)ib!7r(9=5kL7sCBqT$>}PfH(yZjV<=0P8v+@Gf_`W{WGTOgR;lu&!tU!FJGl= z%-puKs20gx@0zYrF8^7&DIX?HWf0qLQ;Tr^_sQhWsQOd_i~#M1j_j$yj>qEF&pJ1b zCVUa^+d=c&74LaqOy2-P+AHp(SgZ!7CcI1@_8iXxX8bj}E+>2?|9ToJ%kdoq2opcF zTU@!>y83|6J=R)wyPe5(L#|IoVC^$n$034k6)m}swbgqm%jnv{!eId!-v6U(NzxYJ zHwc+hnkc0C*(DUGRBZ^`tK8uaU3`hm&Uq2Q_%{YQ&v3Vi!DLBeM01ROhy)4_2x6lp zfs$!(m$cH53b4S7I^nZAVX?Y;!frsmIkI=+s`eFsyc(F=_Q$&ZJ#^rKQICT^y9RG! zUHn5(x0(0VEY{d^6TR6=reTkcZ{vnNkED4>2bX*+c9R5(<{NLCw?bCSb%vcTn+|Bc zbX>liU3@b#q5oAp9V)qay7Mj_xgsvPT!Ko^`dRuSHwp7@K2Ny}Mt*H;9zcDKPY-^u zh6f*E6kEre3SJb+Uv$)nh@RS}p$rVTnYC{`n~(_Cs1!JdA^ea8u8eXI!8Y%3i1CZ) z*$7K4S&O`n^})2ce(#)}J&LZ5^ugUF*?q+EN@4fNgUY8NNtkLBEDEp>%?kopZdu1a z`@c+>fJqSVjDpE~;SQN%xd?8u6s<;W35V-gV;o?cvSchuzkdwQOLzf`V%Xn_06|Y>g z0E53*XK_-VOhMgA+~ zNzyN?jJZGT#Jqy-?ZkA+0pysRBT2-H3?Y+S>}{9e$wyj&pM$?9DWbnSR2zds@bS96 zD0hTl9^DX5VwQejP7XDLv~VU@=fKUgg%A@YZ5-6>-I~wkyWM}me$7p5p0ehGQU8Y} zq!yJ(P;%w{x;na!S`9It`%A6e1xdX+>YR2I>JpUh-~Nv2GMDLb!Q` z%f+?1(#!VqN$>=F>}o!eqg$5p0Lr1Y)nBG9v2v)s_Ogfo_(}_e3TT7a zjGM^jR0yiA_}x8ey&tj4zU2A-ZRLo1L~tL6%XJjKaY6#e#!nPd@Y?x|ZBe3Wb{S7* z0klaG8t0U|TA=KPPSV^B+-~E2{=AvYwZ~;v)t#b7N$6;$(!DKj!kgT zH;`lqtZjdfwA(}f_jo|eH0z9~%az#Oa))pXA-gZOYfj*GhU7$0yg>I$#?Wyd{RHk` zpZ7j`g>xi#xw}s4?xK-C^GN@B#)qDre^QM!Ka*rR82*@sdn@F;McX+EaMf~ z24XM1^FUeYw7JvV3VtyCe3eSc6mWI>U?EZLJig^( zG`NG^?IbN_e=QA|7e2RQq0yGY<2?`f;EHWZf<83-=a?91!AIsSs`=Hv&Qz$NF6PNF z-jzTL8@h^8A278K5d-%`-)DJuX}_30qHfsJHKpa4;SoP9?^ zeAFA|p+JK|h;+EgseNMdddp(gm9##yp0(n4U)1T~v3+YFAvt-kxmWV_qpnu^8@;15 zLk&4_kW1M?)mS*qil}eO-j&ZhR_~>cz^jv7UxKxR)4QAg_o?wr-c-Tb8vrYM+6pqY zquX8w2)oPAJmGKAQ%^-{#OwVgDrS*kD+FnO9wwQ`&7Hdbed1o6Igms&&Icm50Fn6C zfsG}WLWNpIjFBpKHX3lOg_Dl=#p{qxDZNhM_{Q~--~C~>+CX?;Z-_cPU#*CwuUCWK za~9PmukwEUm^Hh6$}!E?xQN*URq=_I*znP%g<5EPmr%Li6uumzlHgjHWzk5M(T?D? zxR!xkhWCKzKAc2^5y#t|yb3#CxWSdyk&+bR!{4w>x6L*O0LTF%*S?$t`oP;Tvc=>8 zY2_z-aGSoiWPbTCz>wtWGo9CK1wlw|g6{tCd*rA$Jc(oX835o#;#-7oJ^dr%aHFck z0h^C^PnOrJy5C_j?9>Lq#}CAX);fxP^6_$+mVUP}Gus^$8Vut)n$z-qtI+H&?Yk$1 z5nanTt(buwz10bw7oI+tBYw|HtR;VGJ9!P_L0s#oie)%O)@yo`(aWFMzdSo<0H{j?_NT81lL_uiWyL@lVR3?;Vduz74w z)Yqnq!`-0(B5~%S^(2XLOX+;aTfaVxfUCwWLpr8p=9Y?Zh%^A(D>-mNPIGlxB0OT? z8Y3$+cPi{<)uGD($?!K_6F43ms+HgHJ>`T3`!i3_@Y*-lYTvDj)y6H9wZO@)vC$^P(l@8h7PW1-c%Ge6xT6)IP` zDKkERdrmD);uB(-Xu-fg!u;&t#*N2uH)G?6e^@0wNj{SAxQu1%6saq#)^Eg26Bf5E zwACM8=RgF`P}~OEG_fZSReww;c79)!Hfj;HHd{V-@SLA6*bQ&Ny2xS$r-1@Pp1UY= zRem?TH^@esovZ$oY})QBNZ3*leEc%{L*?q-Ky~f4n|jMXsZ2)sYp)HJcdxjFScsE_ zvT?s$>wF-d3UMk@In6=x8LJFicgC`8_k&4&nFxmuST?0$N74gzCwOPuv-;mI*5Y%l z)_g}8L^XyoR#9-m&AN*rtE)Qm&Bd?(Jsl@~`2^!nyb|~Rxx|5Tv1TKUedepPOQSU3X@4IJur8@LsV|JW_mCzNFp_44`f6KUidd5V|(dWJkh0ACL$rn8^3 zw_hejU=PHxuG#D?C-7=P^>kz_oZe7@GgP{*1sPZ$-?E(4#>?Bbyx8n)`uPgBi;3B}3~%w*$340ucC(S2)fjjlYq0|<^QImR`#u*4IIHCC z)xDuv-Mqq7AE}SGW{Syu!PN!KPCWZc!RjH4 z32zbE=UBe`2HJP&M@jZ!8f_ey<2nsf44y3Pb`y zk@V2>XVlaJV2PRc0Y1h|{x>e(w|a%uPjJ274L3(>NVE4|>h^y{`Yrt_yV{xxeNPfu zr*iGGfE65pMehhqG1NW>t2zYFQ|lY@K=+iSJo#C(q3EsB`o}_daE8=5`#hY#1e+u6 zK#G6|`@jEkoogE485|O1Us$z*T)XW`@eP)Qm>!$T=sbbLY^V?gbnPE|g!(SGxHEhS z?t?otafcI<_5*DxWQ&-}A0P@(-|&V=!v@-Opk5~BkoDW%qnq3p0l-x3Q2=KLqJ)Xp ziH3wTN$S^p1LtQ_KH=$9_7L~bOTj6R+DX&aA3QbFFN{K`R1&0~2tinB(M}A+G(+J< zwYig9`veU${%Ex#n^ui|SQ;_ooo#F}{RVqR&`zmItfyQvwM;)JICVJ22z!TqpSsA& zP2foXCK#E`d8j>1d)6?qZrhJ9z8M~OvF~#R*O3#gGelGPU{}3wU!q_UpcTMr-9wFL z>=<~mYG304XY!y!MdQQSmr;_Jnqo_X&2d!rdDPW)A^Q)%xKornjay>7$tJJ$rDJpM zR<8P1E4^ckp2ispU8>{%l=<8_sNlq;VOOi>?c$d}=Tv<#{5V{x^%Q^`d%_5euBmTS zY|~!dMQq*dXL_X4%WkYZwT5kDVyo)P8!Rsrk}eiVWq_vbS(df-#)uu;@+5 z`c+`DejyTglhC9gI7J9rhPZenz-!*xTuB3;@79g(*p$)DZ?WhNE&uyNkm+;5%S_Lv zAc=PV;hP^fjq#w`An^{(#Wnn+>5nubUUkAnc8a#xA)$-syaI$QsOT2)KQ3zNq?`E6X4;2q^La2ld#Y4euKA z1{A-nc>-5L0mr97$yzfNQEomC3rq;Q$`06O9~8PlBE5RC+eTO2Vjr0Cq4tqF}eBqg|*x~Z(tk41v&3q&G@;Fywa-1^nVTmOID6v8#VYn zVb?v&6y=%Pq1YiT+^ix9F5}UYcfNHT=dq9)Hx11m>8v^zocO|z703_ys4Zq+(SWv zhUCt=YHep@g6MlSS7erXtD*^iZ0w1@`PeVWcfA%HJlET@_q%ki%yNHWMQ+7x;;7gH z2c7IR6W6rqbzkgmk=Qk$!&L7c)GU9@xui+=w6FM)`r+$2={szNi9@ZryWM<2ExOiF z;BApZ;ny@8_hEO3@1)CFEhnsqJSh=TsWyhGjX9~BY%$L$?N1FDv7a?Y3~%42`@JP$ zPnZOHb&hRnxY>!@0L@K$Qkdb5JjGF~$rWnD#m~0kb!K4p`=jf}%eZJy{B}-Yie8*V zW41SW1BVfNHry+BK>Kkrd-{%nN$oo0)qDwU@jZWGxa?)s1)pA{ zTGOQ+4>IulW_vyIooB`G(ZYY(z;8iKzVIa zYeh;T^!s$xZ^l+SKLcA)Rc5N~opD$axLsV5=HuJq8WXT0L%V4PJDqs!{flZ?*rbic zNW$hvyd2DN^lufc`r;hMyW))vg8s%FG+DJY+B|XjdUV?Khs!wZGL!D4U5EFY@9pCE za}1%On+s9?PA$P{@J)r|!h6W3>qrr#%uf|#REPOfS@N{)n}6Gc+;-*2A|K;wqv;jW zWBB83aLwRJ?KSd=JJaOVSL1Iv+36SwD1N&iEXRJt+x4tJjaVT>cX|v|q1fN(w1>ogABuOj325&XKwSndLn%+W~cRf7)FZ-nCKM`0nZ{_RJ4j zglY3PK>c(WKn}gXOY#om1#v!T+ROUmhh2`cocd%fo9of*+I})4EIxHIEKGOZYdJNa z3CoRcyL@(Pb(_-Ge33Hxw`jemdk|ot?1v3v{ed}X>}c2;E^)hV4Ngsx45;&DD&_aK z&NeIiRa7;^*7B}K0d{$j*|2vqD7Tl)mM*{up5$xCIBmx2oDVTfSq*+Evi8}{<@v>r z-8DV6SsBjhhaG;QO`>BCM3IhuNi3I;9E*7aTNg#DSj5EzzKH?AIflQ%& zFn?qb-;Pm9N^~UM(IVdIjnP}9x1W3`Bu8w($N9o2;`Zltw;!kMy59621mdJw&SRWL zik!5Wi=LuPzO~NJ?A~eCfcl)$7d`b&34yP7^4q@RYJ|fmw-@gu4U%v^ztmK{qE?hTkEAie`)T=Xe2+jckIx*pOyW`Q?(O5KK&glAi-!PzD&*~GS0W^cy!%CHDqD# zNjr1R-jAlW|5$9Ux;Z^MWr)A`lH;V`UNRngvN=*$%ni*Bnxu}sQ05`mQjEy|Dc(NB znWe>=2wGt#@(I)=%`b=^_-c0>WV9UD@?-x|?Q4RYIqXq88+Jc*JkqY%A<>XJSH(!l z2<0Z1;j^A8dw4t)C%!#if}q>DbJ8x2W=HMid!}lgbbUX1JCd>=XqSF-I+c+;%_*a6 zz@+Fxq^gduoPQBa7MXJFb-BrRc&I;SMp3nzu0d}t5VBo_E4Uh%vQo!k)+Eo-c5^xQ zAlc*~uu_kCY`uP4mx5X)^^_;2@jC-oF>=G!%z%ZDXSQbHl5_vPCH>P>I8+fgWx1{) z|52fcyyQ28$bfm{K(Eae4^1pw=#|g&=OTEodvDm0QEMbbC3AL>Tl+ z;@-KE&b3w_#h1!srx8COsivo@)72O1{GGMZfwl2<&eE%th=m&hX3o#Gd7%43S*lz3 zHuY8HViP_-1z`&*vk~Sh!qep_jhmaJ-Hba@bks2i#KCroT^Ch znIdt9wXG0XO3i~a=He>FvTlSjN?U(@B%iDP>E)Mk%FFuXehEdt)`BR zIMGU%O2i&YQ(m~s)Eop1P9>zVP1D5wK8s}1xG%G`>~KK3Z>?EpFt!}PfUb?@Bh}2a z9PyWrq{Xl3rRPCe3r^j8*(*|Mg)99JN^pUcFOiV-LMLTC@Kb6o&20X&c%z+_06(AR zdYct!gTa^7;}pN73t;9GuKBm!F? zmKT7@QE+D#rW`*oyLaIKH4@f&cP(^e^JKyD!cpqukE21^BR+_DN6=!W$neJk7!Rp+ z)kC9H8=U9xXyffn%$N6@99j!k)*yd=nAX_GQ{_;R_sP}V`f$>|K1!!zA+9w+ef zPw%nkqGwv;MNL8s)h!~IE~AJy#JM5Za7{P2`w_0C{6KPSk@ok1OQDG8wPrTEc41pB z4sbnVkU$6vR~u84d3dn1j^V?S;7<7O-C$K!9cz_-aG(YAO|8aPe(~f@P|~lCXo{}m zuNp<1J7E^La-57iVKMgwgS#`DN7sWXHEYKsAN}Uzv_1{)dIV-axa*h#(kPJco<0~o z>}w+p+yV6)i~?Qlejb>XMU$`0Cws_Kf9-{b#!{3%IWJK>r9|t$qFLtX*&%h=y?9hN ztE$r-8F+Ex=RH1VbiF_0j}GQ&&u@Aly)v*3s??R3g|3i_2}{`-F=0zLRuj)Ey{g}N zd(Cyvji7f*JhbraH{KlJ?#92*@H+U6HzedZM*TVj8>3n%l<~!;$s^=^O}$4ze2I1B z$6?9)6_mrVhAn*ytn_9~(1LlXrlRmybjy>k0~}1?SF|IqgY#}$#vHF-@y3qPMcx0B z-gwXPYHRl*tjR2V-N{a;CDXc24&&qz^?U3xlK27 ztAlDi^Vy@#3pFUwEn*O!UIk{+Lvp4@e;W3_R*+g~#G$&0a3gAA@ZLL2 z(rU+a2E{L2!kG0C`(M87l+nlib>S?#yMc#-_Fr5TvnVldAovw;<#>4g1Ei~~L$$cF z1fG43t|&Kpr3cQ-mrrO}6myCWaJbt>%#Y>ws$6gmW+6x*@mSz@3a$h(@G>6JqYi&E z8ADI2w?D?f1knU#%6?Y!_vU@%^;qq01X?ap_#-G8GJmd%PmDO{!vn#oneksK<*a&a zTvk)y&vy|!j>(|5)+XYxsY!WjXeU`hTAN~*(xZVk=L_%F+wEm=a~$7~y5eIVo);$c zH^vzk83L&m|7Zp@d$djv!a~TBz{sfqd%`(-~qWD zc8EVoL+8(#e^}TGeEGr&U9X3{beoJtiqBi<%J;wK5c@z~rE$2j3PV`IGCJz!4ooQm z=HA_P`=eseYnHbYI3TM~`nxbXGo!t&blIFs)~V&@*t$8wW&S393#YE~Th+rt%Tw>3 z)1O)wzxLg>0=?8=SC-d)7C?|xef|7B-ag$?vW{o98CL|>Xr&^jOdGy60Wv7#tjSK6PaU10p3M0%9JK?b@d>k-GDvlep+EZ|;m} zljoAO6+h2mhug#EF1-9x3Gpmob|bkQ!n8L_0*$cQ`m7G1St7wA?R*-DCx<XcA6I zjPFso!F&oh)hEvCV$%-C#=X@JB201$FRaxG%{3hwy{DDF@RU2&soa{{rOar-j1YQF zw2oQq5AHJYeV`A0nyA3zqd=An($iJ6iE;#?tkzMdYCOuxpdhLbXdPy!7%s{&#yUKj zd%|+UM(H4kS@UP3>Y|{G65epJR6Ktuf9LV?yi%sZ6XkbzH^Xj5P3VF+;$&dR2cEVR zTKu;nKcm99iO%-J9GIwV4z^!kzO_V}$8kvDvy2Q66F=H9dLVoMZtBv)js%r4x+zQG z1BjdNjfyKK`yxzb3|-xpE$MY=5tOY9npmB8O+s#zID*+HW9U|cX%*Rm+a71Ico`q zI^%tIas|70W?H?(%lTF()4V8V93-9QDf55z_1)oY#qZlSVihrK)~MDdR#BAHuG)K5 zY^qkN+7i1}t1VTV+C|l>E%pdX(NffoT_aXPByaq_-|M~J>;2=G|8mZG&hwn-eD3@6 zxz0)MJ5-Z%Vmnbkl8w5X`=d`Z%Vs_R=su=#%}xqQ^65}LijRJ?n_@nCt-vx~RQ zz!W0AV~NwxfBX35)UCnCCwKg3??^Eh+YnKn@(rNvMXyC^u2xmt6Tg`dv-8kj{xp6R zZAIiTo;OL%VJo$w*1R8=X{`6=c&x6eqosw-8tbsN|Ku;H^KX*0V-W`c^yZq@K`YG6 z7f_YT!mQ|<%wdPA!8tJ=H$)%q{iyJ5E_xtlFiV9?&XYLs^WK;u-40s51H51(BXQ}X z!o5V;*PR%A%t4@2eo+n4;iWmmK+tknj}hQ*BArj%dlxy`_@jH$RPsu0V*+cLQw`i- zw&;p;C=yGq zlFF$48Nb*65Vc^$X?Fok9mMxDNk=z2+2r$dntVaCeTFIHH-_d5gZaWzC1MtXIa&}j zwj+QveJ#f1;kZ^VG3u(oIpaEn|XX-&I&EF_VoMo;6H*FmP|;<(3oGXMs<^q+DZUnC8o+CwsO{03>LfD~df3&(^f`LTj1EmDNCz zv=%+0U_rF^f~9wf^&)1nRW}*^lpht+3gHnvO!-_YndCVM&^7bSqd$u` zKv)Nk96T5Z2@hUV_$2l9hYa-j+Z2D%2k(MsX2#!(!~W`C_Ru-_k&LHv@>suQ8zm50t# zrpiL1dHHTexSKeJ+b$ELQ2+YY!I8mv!8D*S{WDH|EGMT(ns0LV$xJ^;TKRL;@JK#u zl}8+RXm?8{u|oJ>o+UNGgtZX$?D_NfqKBBn>aIthre?aEoNDTY`=OpWfVS4rkGI7;r0Tqu3WJkGze!XRkIq|Cix_QlL#q zw*QUW*1l&f-@k{;zUEoR1%9s=y-<>>t8fYZO+@mNaHysU6-814s%@F|^4(xm-;3GD zkDhxs+nR&#kCOCez$G9T9Szer^Wq;)$_4fqPsNYiOQPswfsPgF`Qq-IIGn1@JN)8P zY(7_Z45E2?rr8yz_gME`Xw7jCy!!C)!Q5edIt*Sk&V-+@V%fLG-Fgw#)JCjKH)_SI(|6i)-0XY#8hBvFepv zzC&rM-KrtHpbC3|)NL2vXW-Tb^hJa;I-KJ4R}N#E z$5p?>Ybym-E<#*YyN;BQ{lSvG(MS1y=J)g$XbihQjtACqSN7tJrMYNXOuIf#Kyk?=~ zlbL0r3t0w?Mmp*P+Fw3l6m4yyRh1towz=rC_%=eDY+dm^%CK*x zTMmTJ4b((B8GpN!Fd6!`Rj3fO?Fz~{d#iA^O5&3r*n*%w_Q4cCz6J2y8i&$Y6ITSX zvwz8C+@U^hlE4`@-QGjD(A$vOg}zX%Y`oxE;Lw*)W*pFs@9gc2k&k}Y(kA0{<1xB~ z4Or^WH_dn`X~ZNseQI4pZ1M!pWuD@BC7*|bHje^k1V_M(CY}Mtfu4J}g$S6 zUz#ueg#5GdJ!PS{?Dh^dw&GQ?wgf1)s?qIu=*j2jKX=+h#C$STd0pgndt#D)(iA+# zzZzT~w7wSMxTF0M^4KYBnCW#pIR`ES3NX8gVq=)zh#xs+HI%GufV2&dz-#Nye)B7@ z27f z2qIA#jrLIy9E&?V)7o1oi-ZXL!@9vSz#ue>?~{cy_ZiDmsfk_$k8s8PnXey|?c7o! z5b6T_3waw=VPugUSy@b24p6q%?7(=lW+~kc6Y7ILG8|(v42v*_%*k@sdeXYQ33`(PbP=>08Ha@e**o~ zqKJjf2oer!F>TEZ!a3W6uxUqC9rfAo(V`$tc1f@YmHJovbu#S-%qg(20n!}4eHJ*n zzaW7qpf2OAp>1b5N%1bQA-dyR#6~!ot#BO&MbCt8>=k#6}e0G?mw)B|KOv4*2rH+vg3jffc324RC z(y%7nwtuUqa4Ql3r|mm4;23Xr-zXvb@G|`O+8h2|K*_pF$X$g&E@@eav^NxV7il0z zHa#r7H-(4XZvQcfk3t3Nh??!W+6LEcqWs4l^;%g|RY01T3^=nYYEsoPiEN>~Rn=!Po%A?UaBThFbYJkS z#95IRX6rFN4Y8@GjmX!>^xFA?q)2=QTa;O}(~nj<@_W9PmrdO=15-$H=UC@xu^mgI zu;q?A&cb9)@?qd-4LdaZiaku;6bhHcK9_>bsaRVXyB>6Vt&a?+`>yk;3D^Q8FJk!N zE3pn)4w22+4WTyor5A&@4+%aOv{V37t9y;zil02tO-sScCA%Hp4$rw3MU6+Rbj)gV zhiBYNe`vrR3g>Ey=q|Ec;d z0E+pkfH4q1?^|Vd?>adw`q_v6_05=Vu%S5&KZY5ddSFSj50g21CUx{qhq7V-HjVC` zTnM=nl+2aI6;aP6U#gN|D^S@0isk;frlc* z$*dI~W_Tt_z!5A@s|_B#OLy~u?m};9PXOs%=HgqMMsG1yBAj0@F;DjZ;u%6b$cH&+ zNhA}SoRnH5{b5RmpNVvoENJ7~sB{X5Q6`Bb3 z{B&gQxpam0DpVd;L+#4k7*;ZRid|)E>!}s**F=wnEW6(z9=#E?lw5{iev6>_K1TXu3T?+0?VSC4bunG6QQ*2%l= za^!z+8X5o+eF-nHp!4w^d-C-G*sC{({$3h?ud)`^v4fj#2gXB%&&3C3NAU_cf&QV^ zzO}KlD8{Y>{A*e=6q?rCz%?d@fn9eE*2mzM_f`1&qsS-h@9;xcdWSm}NpxE`yW0~2 zUL4rE-cT>`aOHfxaNOJSH!gcU-wgR?%rJ>eFDObULb>S^31p7_jni3MZ8*y)gyJ}A zH>f18Ha5zx!sc6EPZ{z}>AFR*rZiUbp>ITZ#>tSjum##(!=_qgqY=EL10EoWL!N6xKW zra%j?0xV5sMa-8T@lQrA(koopLR3tsAV?(AUO8f30E9~tRs50n7jSB(=+v>Pz{yu| z_oblu0buq)cnDMKBNFEmsG9_nwl!}Ga5s)fe&O;x)iIS;PMD@r3iA-jtB*% zv*lNojb2oo4k!*qjvQOzjzcY*dw{5JzoQjtX|4i7D}x93#yT6&zmy)`gFp0e-n4*| zJ;_gm8rxq`PIbR3_%kgXWfk#uayF5C5ito(@yr2Mk)dtC7pq%BfqL;8PL^D@W#LdS zt*{B^)am1ae7VQB!QS@p{z>G-w-q^$9C5D*8FrtAg+4_(rHJ&5K-lBADsz-8vCrEL z1G5Px*{FGGCX$J4+^Zy1O`x}&2!gxk_H6dVN#ohtk*!M(52KAAz`2pw$Lm>Sl&^tk zP}KRM!=ou>$znW$TOXX!;zMEwgx+Gj4y8j_IR0c!KQ>4U==5!x8Dm zJK4}6Kq^AbU?-9@F*L&L7U31cqjkfz6hUR{!2ODwg~jvO|8~ZdnqmqMeu-p*jhF`& zeCU{xr!8yfA>+ll5X`9*@qPT32giq-^1BW|CP}BLjyW7QF#~G;)Yn~zXCeM*;F#;E zi@g*k9@=vUH`0O4DnU-pI4I6lXW#sRII;K$t=!i%z%cIccS|rQuFGO`d&NIVd%Eqh zo;bkwzaqfYbyQSTtqcd5UeZ4g9`12MwIrV5)=qos%sDIZ&xH%pMJ!aq!#hf;j0RxqRNBvi)JMs) z7h~vq)(Gm<)tQn}Dkk#2%dpa;pQsys@juNQ^&%(!>JffU*>$1{Qfh;;*AQIajmcRe zOi_YE%2yJ}{oLA|54Rr{WeI$FyYyK` zb}iD8n%2ohqw2R1j;(9HDa2s_v|GSJPF&A&1?sGr$XLbci=X!F80<8MysF=AhuScX zURm8nKaU)AQ%zJ8A&bVc;(PO;LCGc94&yMvVg?c_H!Gsp4{6ZK)Gt`dfMW-}aM45P z{%q3WX6fUJU1w(3hDh?Vtw%1?AL6Jcg`x4;Hic8nF{d4CM4!(kD%=J3&|$<44^&5Q zXk;Uwzv_V~e8G%a-u>Ut5-?ykMrxhH7dg zo^uV4>!Ui6A8jtYOr-f|7552tDsQT@o5ALwy@dly==N=)cK>yRP{gZ4mU!hjNj`q-0ix(P zkdL?_dRMsjtE)`7!qbb{ST#gESRKM8k6LBsfNNT|mWqUg{Wz-k8WYP0>-~x$k_5L5 z;W33*zS!5bzV=WS#%_~U;X81;xyyyaRkwb__n`YP(pNUWKBXDseuKJU;8gjEZHaFRgus+Qot*$l_<@QhD>yG0-yk!qQP>n7A0%cHe97Y(bw&?PKQvC^vIjQF-QwH-N zMXlbSFu23gj=OjbYnPQ9pN05Bgn8t|O^)2Cq9B>Pf25-RtV25Zf51CyfBtTc2)}EC zjlO?1^|;9v0bS(|Ie_0%`S|RJd*r*{!>5Z%E*hTSh~*kVnY=@{KFY|_y2oCgT%3Nl zUB<5feUfG5pzoUfXC;E%huX*5{p@I}{|zMoLV$%XPol1J) zFd1AznILx8F5t-jV!I>*^+Rx|LI!NKR{x-Ad}%`BZ6aMHm`qS0$>5*uw#`o4QUph5 zlP4P&H|-Kv`SVRB&USc;xcxiJN4&qSPrk}EYU8_!#&*A{1EeD^IY!qTuRt^Z`3QE?pa zx!w+x`HixA%eao`(WF$eJ~0N95_c#1-2tSz0Ak4a*%Af0i>S0&KRJIY|0Dw%){?gLM%Sih}AWN{tDKN_9;sX((Mh8oW8>3%%jKOpAgopXg1aqm> z3>K&hHbR9{IZS?XYD#)Joz^_eyD3{yw7eBAeJ3g;L29**OHbP{yI?=sQ zT4V5rFoz2=zAJ$oYPn5qsv#(>+<3VHl9`uv?4yXV<=?-@flb3X!wALR0XUlj-Vqy< z%hr+-6aAvnGF2E|8*4tVEG3?XohO`!RUQ7PJeeV;)Zg`~#E9h)rqc-NU!<`!`eqmx zsy`dtJKF|i?i4rN-q>Ak6|rqu`h|~3KtU-Gc-3Ja3VD~jY1)6s;g@G_?R$o@B;xC<2Rdi-JG&xQaXjs4nD?cdhVB6_3kp@$AeM}_A}%uKlP z@$sfaj_BQvjt=Y`>*m(}{stbIp4ZH>5P$B0tS1mtd6^1Z0k30BoRo@C!F1Ph-3@aY zw1}YKa(YTRdg5|mDUyU-^e8I!TqWeh-3~(uvNa700{Z#bMx>a3N%1@ao}LJhsIyA( z0Ma<+(MHKAlpn_{yv8_3^wehtQ6ZsWZR+BpB0h7>8-y>xAlsJB{qI_Bm&){1J~f?# zHjK$|hl-9|WmTR|R|G51V-B{YOjvxoMP!2vAL;Ow#F2_9lWs8jy$w^V;m%HwG9q&Q zPsu#Qgue}f+r79&?idNZ`DaOA;ng%pv22{AWtuuDg*P;SN`YgXxY_~_O4TQ<=(qps zWBUwvNYp1H=jN;zbHG#tB1k2=lS+JtjsS0pV#07B*cwQINk^_(rw5TP;y`e}W80;S zf0&+1(z5RHe5zE>hMk?=wHBUTG@|P$eL1G8j|d=+q^9E~hmk#EE!5>uXe?E3p+_7R zy+7im8@fU7H;Cqh5twg5LV_>#g_?l;2iC&G$V4E4!Ct5Gl~=HljEzAKA+pWG;Qy&Y zjR~k61WJMsq^=1y5lj{c$6f1QU)Oc*r$9o$7zL^7K3f6icvDN(bJqR?KEvn9xq>77 z=dKkEQaUqO^M8($d0il*(_$a99{27#ez2T~Aw68YoTjCfkMH^%#jrX*mFrUu5s?&^ zl8p+o7&HG*IzcfFd(C^rt@_{77<=2G6 z^3mk)uQ#&g6K195K&|1L_T*+|VoZPd>$QgDjC{8k2(D^%PR9-zaSu|O2k}uJI(JjJO5d(Fr%gnS z96(xh&GxH?pvZt}lnv0Qb-SiNdl+l6W)!+=wh?R`Dn zJf+MUkqpF@rC@_n!Q`azY->QJcmy(_?==0gF(~~q2{pnCkDCi<#FZUm5xefyWeD>6 z@%#ixa5&Pqn)A~zv;!&r>nd{$+D_}YJ?7K6RxOCPZqGzOJH~5HBZ`l4&pXt%H)09x zp5QSATXU8Fo}>b5f0b`g(kXE(Raz7V8V*;#dRmR&4(bZJeLuEP4l-%RV;vTvtv5)XW`u~1u8M!_^p&b zmr{tD{_2dtg1jYnWoLz}`Z1pX9LLy!?nAiwgHco5u2^8j{s=YvXPxU^P}=plB%LJz zvcpdJA^~A*e2KU_jG$wr)s|z%bap zeCCM%pmm7qzfk#KaPwb8{}=C3T882i* z@YRTr*TLBxaV7rU( z_#dJuzNr)4o0yQqRzx9wS|vim@Sn_?ag)u()&kdLlgv@z3H@L@GFvXh&NrZQfN4Qv z2?>2iIe4nVIM~_iRFfAf5>wL?9`AD1VX&zs2epiZFnxlav|hF>4aKwX!dO$*opA#~ z4OWt1OANstRMpDLN|SPaZcaWUQ-?KlU^uj)#9GcH%Ri5so_m`NkcajU4`S}x$W`jj&CffXR|?Qf|L$)=$UM@` zk{O;pCKS;l=>=21*y8J4Xz?%G=_UyCL=%L@MZQB?n3%s=4z2>t~YaQ*DG?D0+ zOsNaa&W_ZE!hpMZkgvpzc_y5dwgT4+D2m5~eT0Q9DD4YR`W=Qvcv!X-K!z?=gr`v^ zbueuGS>YMv`Qz)ki_VmKf-p&43Z?n~cp%_VvG6q@Ck!5DBW}@&#uD%#l&>dpyI~R> zF-j11s+cBlcGSWR2cX0rml7S>9hNp8;OQpe{>D@Z7Zln_zIPzxjvbg9AgVbcoU&N-8PRjg%-QHNemyB@L1i(kR^_9nwfjx5Q90 z0`ng3`+3&-*1Nv@`vbnUX3jom&zZgVm3#lLeeG~fbtR%Zbay}?5Rr9b9MrOJTtzes5#H`5r&K&SNxn?%V2g-s})n6xdI-Gtd3LwNmpn%iKmF`{{ug`|k$Ckz(PDX|8vm}9wE0Alsx6%Tsw#E< zvu&5T@D7UM^38;YY1t&5KZ$Yss5mOTy&m@kZG-u_W)g#bH%~P?S^rE>`sr^mduKcI z`BSMRn2g$aVp5@3+LvESBZ^<_Qa9>gf6|=I5(_p`+Mo}2_e67lUTt0}}) z$p!Dh>*W!J;b)3Vi9RZ3Q=GThQymBqP2{5;b=g72ekJ)V}Y{*aZ|Lo`2oPaB~q)?sk~idfJ!a(3()EZ!?)B;eyp zZZFBNy##-*@DIZNT07^Bg`ehGG!{bL&%l*sLBIn6+jjO*yA&e> z)g#B`z<8-3Y+5rj?C<89>uDdt;Z@njxyD?|dUzYGhfPUfeW*NjgPyPSxG;sJE!p>B z>PC6$s6ABDRU-)O+m6p#G!h2>io_1s)n-WEz1dP7z7LJ}=XHk3UniV|gFs9m6?qwL z&y4*{UmuF87K~H^n2fA1f`m&MmP_$HELbzE#ewu_#r~k|?2dg&ZA*3w_l)Gsc@R!KbrgYcvzswi4P zyk8EF*PVr3PE(H=!uW8QA_6`v4J#MKyJmbSwtQyOOvSb~<=)N2aLGnNkw#y)ILx?QeUM zv3=Ix8X@u-z0Piqc=ljGC$JQTer{FOf}Ei&TcglZV6?qy9)O>lvT&!x*u@WV$} zwa&};({B1Xvi8d~B{ufk)1E(uCU{G2SZoZ7?ZGP+Bi4zQ6UtN}nf|jF;x=KaiB?7G2@ay8r{}*N+`RL0 zE2IBxlZepuqa2FBa!9`qm+=s{{)Z@YS@oxe{LJ?#I#F$px{?0);u-!N$m3s44PN?b zBwhtkw99@^MEomCQ(_--vdgoL!Yex~s;dRY(|MicqXucrrsL8j-p)$|6U$#eseA-i zNRN2}<5g#mG%A^zzT{?4hbE+OWPg}+F9ve^inMk^44j?7w;l_2)%VCgWg z1m1HziM=<=>YKSOEsR!HRypY;A*l^~<-N^ye3a+&xEtS(d+jR>)9$U8ZLvTtdNWH~ zs;y311oAmt>xeS3RuWF+&Gdxj(7su+AK~2r$&fHxPvr50Z^fIzwt5fV5h=`-ty)-z zPs)y1S}aIML=kCLaA+x;TiUp@zaMob=_o|EA-t)Z$3U7AJ6s~+$TN73G=2-H@56^M zVW|41`Abp82GkL@AoNN+5^-dUXE~I@4=R0kZ?$um;OEzYPK_zNoyZ^<(;pa9E?|sZ zE#AkyGEG`ON<0cTF&+{@ynll82vXhr3;#@GuDGqrhwlhN)zN_2K{Q=w9xmqo5#w?F zGMrA#;robOfUrH8cWMuFxV*5_WVYTHmvb;kkcR@n)h^!8IYHA1el^pj2=s2$4n$gk zyE$|>JL|dbAhGn*?^Xt-r~lzwyCDPsM+p<%PhQ z&S&a=mP<@1yUSMEa-n$p z9e%(6tHH={QxqRT>XxHvtFeb;BxTQu{o<08gzEZor*%fleOLeefvv($dPC_I56G(U z;}4BxKSqob8LrtT4yEvuS05PE?~md3^_tF{52v_cuzo!t>&%5Zow;d|i~u^2yijvz zab`{lrhnR1CJDt|83vRUAgHr0t6`*TimAEMa-g?;+~PfHO!j6MVN;Rvrv|3mV!MH< zbccHx8xPbotQ)V1l}Q@6%f?Nb7~?}TjQ_h6-hD04-bg~XjnstqY+ zpeg%ApnhkItL(JG&+G>*97zxESj)aglA2ocqE)L zA5`AN|DDLX(Y}cZ7xuJWE}KihoL_%|mr`^Fflkjw3j-YdJOy1?e(U-pyPj=e5~Ui+ zgvn>X)0pYa;deszud#5i! zNVBBFj?KJ2)bFZ+i^@S9f~cGc{*v{VizlN?Wrq)@0QUj12P2?{@~0r9+`Bn|I~1nC zdT<4S#O~QT0RHd9`i#JT?z^4mZgHUtdZ%y?2IXqd{v!^5<1a?Ydo6O5J}9!bZ{mw5 zU4E1(Mx1>!{X!47eKSk_0r*M$n4fAwq`EVY%}eJTGg~o zT+AM?TLorznYUYvIqK=RH#0nCXa#vzM2sI{>dUCE5^veXw)c8$&*-4-W4$*-pr5`o zFhaDelW{A{o5t62!VKbmL-?jfWn_A8kvcWcEY+O7kjF9eiFy_{_{43|3R{-en>d<8 z5UI-4xcUT51!~!U?QUGeRhnkVl64Ae-q;UiW%=!wIP!Sh{}J;X@=zT94T>V1UOd9n z9YM3So(`ct4~J6W(qcO-HPgNA!&Tqmed!?2xyUo-VaUXDPpZLJs6YXi{el3w=zAR z6>C3R9S#NDn=$&(;_Xf5YffFf5kGk^G^Qu)Z%Zoi=Xda(i9!ot&C_1eK6ueW*nB4w z zl*p|z*Kb~|ReE1I9d24c;CDZDLP3wkzsv9wX9SpTc18Pv=tya;8tkyqG}sbSnT6M*mJrODkYxWW?56zJ{MVecbN%u|_aC*4u%d z-~9Kqx5&yURhd(WrG1!%Zl?rSX|y#M5vtSF?0FZoopoa%B+Zk^1Nru2 zILdS{w#5By9%kLc4;leH!C&7hsz2)QAwWOp%kf%$aP5a2KT!gy{WsQ4U0Tc>s&Q69(m7!Y=!5 z70i>K{9Ng>!hPjuDlsJ$KhvwBg6Z@W$s;~iW2lA-5*t>ehz2U%ghe`i2nDeS-qx)foy zI7Od1?@l{;w9K%Q=5^(8FR-418#TG#PP>g%d_xHNMY6S{-TOjc4?~9@OylLH3pvKt zHn*AC2&~#-S=b1`pgtqEu%6-CC3mG3l+EjGT9WD7MVf)U&zks2|47Hbr*~$hobV;RJ)9&#uaqpgxw$))I&r)IwbCL=)#Z=yzG}knhduTEDrIxb z50U)7Iq{(##F|_A&;pdF<}gmNG!LdrMQXsFnuQB$iMhEp{~({4AN69s{@8X~?d@IM zx)9jcXxY*5jHZf>R@ z)UVC*N&^n{^K|sKov+|)WCvmQ-3$WM`Fn0U^DoXq(7m3r-p03k?-UVP4yHe%#}Irh z|I{b9qJ?;T&+LZ7j$Uf2KUo3qFSnVb=YI5iPqRr}@keHDH*d}|%8#b*BEmG_wKs)v*3))=9=@?Ydp~0-{&U2ujWI_?#eFc z@Gycdog_=Yz79+y#@j<_H$G3L9@|MV_-0s`#A{ajk^hbR-sB0}_%uJM>D(Q~^@O7B z^h4>H7&?302@w{ix<&W&_lGS5mvhTE=XKn}_|D?9-g#q{LifeF(vH8LRPSc!)L*Vf zVu41NPD(4piStOSf+V`iHBBmv6DQg>f7$qMc+o_Mkvlp%(n$K$6MtFQ>SE=3w?akg z>r2D`xWi3=%B=3=zc)E`ACJdL4Ptfqf&&31V%qD?*<;6kQ55V#b2&`uz4r~9Z+Av^;$vhh9Tq`g1wPm$U#8%&+ve)`0N!RPQIyE z01)T7Q#BPa=2?kq%X~+xd*)}0YEVgF {7*PM!+@|!7p$CFX=_3O{Mx!tm#t};40 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