diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm index 04ccfbf429c..2b07ab71265 100644 --- a/code/game/gamemodes/changeling/powers/fleshmend.dm +++ b/code/game/gamemodes/changeling/powers/fleshmend.dm @@ -33,9 +33,10 @@ for(var/i = 0, i < 10, i++) //The healing itself - doesn't heal toxin damage (that's anatomic panacea) and effectiveness decreases with each use in a short timespan if(user) - user.adjustBruteLoss(-10 / recent_uses) - user.adjustOxyLoss(-10 / recent_uses) - user.adjustFireLoss(-10 / recent_uses) + user.adjustBruteLoss(-10 / recent_uses, 0) + user.adjustOxyLoss(-10 / recent_uses, 0) + user.adjustFireLoss(-10 / recent_uses, 0) + user.updatehealth() sleep(10) feedback_add_details("changeling_powers","RR") diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 36e171ec8be..a68f62a4747 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -5,31 +5,12 @@ //Revive from revival stasis /obj/effect/proc_holder/changeling/revive/sting_action(mob/living/carbon/user) - if(user.stat == DEAD) - dead_mob_list -= user - living_mob_list += user user.status_flags &= ~(FAKEDEATH) - user.stat = UNCONSCIOUS user.tod = null - user.toxloss = 0 - user.oxyloss = 0 - user.cloneloss = 0 - user.paralysis = 0 - user.stunned = 0 - user.weakened = 0 - user.radiation = 0 - user.sleeping = 0 - user.clear_alert("asleep") - user.heal_overall_damage(user.getBruteLoss(), user.getFireLoss(), 0) //not updating health & stat - user.reagents.clear_reagents() - if(ishuman(user)) - var/mob/living/carbon/human/H = user - H.restore_blood() - H.remove_all_embedded_objects() + user.revive(full_heal = 1) user << "We have regenerated." user.mind.changeling.purchasedpowers -= src feedback_add_details("changeling_powers","CR") - user.updatehealth() return 1 /obj/effect/proc_holder/changeling/revive/can_be_used_by(mob/user) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 7372a184a72..355b9d5bebf 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -607,12 +607,12 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell playsound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1) user.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1) sleep(10) - thrallToRevive.revive() - thrallToRevive.visible_message("[thrallToRevive] heaves in breath, dim red light shining in their eyes.", \ + if(thrallToRevive.revive(full_heal = 1)) + thrallToRevive.visible_message("[thrallToRevive] heaves in breath, dim red light shining in their eyes.", \ "You have returned. One of your masters has brought you from the darkness beyond.") - thrallToRevive.Weaken(4) - thrallToRevive.emote("gasp") - playsound(thrallToRevive, "bodyfall", 50, 1) + thrallToRevive.Weaken(4) + thrallToRevive.emote("gasp") + playsound(thrallToRevive, "bodyfall", 50, 1) else revert_cast() return diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index aa361870a3d..4df4d7d146d 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -158,7 +158,7 @@ return M.set_species(/datum/species/skeleton, icon_update=0) - M.revive() + M.revive(full_heal = 1, admin_revive = 1) spooky_scaries |= M M << "You have been revived by [user.real_name]!" M << "They are your master now, assist them even if it costs you your new life!" diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index e05c4b5fe5a..0ea426b4aee 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -82,28 +82,23 @@ /obj/machinery/computer/aifixer/Topic(href, href_list) if(..()) return - if (href_list["fix"]) - src.active = 1 - while (src.occupier.health < 100) - src.occupier.adjustOxyLoss(-1, 0) - src.occupier.adjustFireLoss(-1, 0) - src.occupier.adjustToxLoss(-1, 0) - src.occupier.adjustBruteLoss(-1, 0) - src.occupier.updatehealth() - if (src.occupier.health >= 0 && src.occupier.stat == 2) - src.occupier.stat = CONSCIOUS - src.occupier.adjust_blindness(-1) - src.occupier.lying = 0 - dead_mob_list -= src.occupier - living_mob_list += src.occupier - src.updateUsrDialog() + if(href_list["fix"]) + active = 1 + while (occupier.health < 100) + occupier.adjustOxyLoss(-1, 0) + occupier.adjustFireLoss(-1, 0) + occupier.adjustToxLoss(-1, 0) + occupier.adjustBruteLoss(-1, 0) + occupier.updatehealth() + if(occupier.health >= 0 && occupier.stat == DEAD) + occupier.revive() + updateUsrDialog() update_icon() sleep(10) - src.active = 0 - src.add_fingerprint(usr) - src.updateUsrDialog() + active = 0 + add_fingerprint(usr) + updateUsrDialog() update_icon() - return /obj/machinery/computer/aifixer/update_icon() @@ -130,7 +125,7 @@ if(stat & (NOPOWER|BROKEN)) user << "[src] is offline and cannot take an AI at this time!" return - AI.loc = src + AI.forceMove(src) occupier = AI AI.control_disabled = 1 AI.radio_enabled = 0 diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index fe31b39395a..20254a8318b 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -133,7 +133,7 @@ victim.drop_r_hand() victim.drop_l_hand() victim.put_in_hands(chainsaw) - + victim.reagents.add_reagent("adminordrazine",25) victim.client.color = pure_red @@ -154,7 +154,7 @@ if(!victim.client || !istype(victim)) return victim << "You feel great!" - victim.revive() + victim.revive(full_heal = 1, admin_revive = 1) /obj/effect/mine/pickup/speed name = "Yellow Orb" diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index a891a8c9350..0739c9a8b6d 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -87,15 +87,7 @@ if(ghost.mind && ghost.mind.current == R) R.key = ghost.key - R.notify_ai(1) - - R.stat = UNCONSCIOUS - R.update_stat() - if(R.camera && !R.wires.is_cut(WIRE_CAMERA)) - R.camera.toggle_cam(R,0) - - dead_mob_list -= R //please never forget this ever kthx - living_mob_list += R + R.revive() return 1 diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 1ade32a2a99..dce70f51d29 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -511,12 +511,7 @@ H.adjustBruteLoss((mobhealth - halfwaycritdeath) * (total_brute / overall_damage), 0) user.visible_message("[req_defib ? "[defib]" : "[src]"] pings: Resuscitation successful.") playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0) - H.stat = UNCONSCIOUS - H.updatehealth() - H.update_sight() - H.reload_fullscreen() - dead_mob_list -= H - living_mob_list |= list(H) + H.revive() H.emote("gasp") if(tplus > tloss) H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100)))) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 32615dd8fdc..324543903fb 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1487,7 +1487,7 @@ usr << "This can only be used on instances of type /mob/living" return - L.revive() + L.revive(full_heal = 1, admin_revive = 1) message_admins("Admin [key_name_admin(usr)] healed / revived [key_name_admin(L)]!") log_admin("[key_name(usr)] healed / Revived [key_name(L)]") diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 25d3d42a9cd..a20b103316c 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -454,7 +454,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!istype(M)) alert("Cannot revive a ghost") return - M.revive() + M.revive(full_heal = 1, admin_revive = 1) log_admin("[key_name(usr)] healed / revived [key_name(M)]") message_admins("Admin [key_name_admin(usr)] healed / revived [key_name_admin(M)]!") diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index 3e88792809f..eea7426018b 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -234,7 +234,7 @@ C.name = "Cookie of Fate" if(12) //Healing - user.revive() + user.revive(full_heal = 1, admin_revive = 1) if(13) //Mad Dosh var/turf/Start = get_turf(src) diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index 6b9c7b55932..4a744ef7100 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -160,7 +160,7 @@ C << "Death is not your end!" spawn(rand(80,120)) - C.revive() + C.revive(full_heal = 1, admin_revive = 1) C << "You have regenerated." C.visible_message("[usr] appears to wake from the dead, having healed all wounds.") C.update_canmove() diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index fb398e88f45..58d7bc80aa7 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -771,7 +771,7 @@ var/mob/living/simple_animal/M = target if(M.stat == DEAD) M.faction = list("neutral") - M.revive() + M.revive(full_heal = 1, admin_revive = 1) if(istype(target, /mob/living/simple_animal/hostile)) var/mob/living/simple_animal/hostile/H = M if(malfunctioning) diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 912c000ebba..a9ef5f416b0 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -61,7 +61,7 @@ newbrain.brainmob = null brainmob.loc = src brainmob.container = src - if(!newbrain.damaged_brain) // the brain organ hasn't beaten to death. + if(!newbrain.damaged_brain) // the brain organ hasn't been beaten to death. brainmob.stat = CONSCIOUS //we manually revive the brain mob dead_mob_list -= brainmob living_mob_list += brainmob diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index 2878b8d755f..f9bad528026 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -51,3 +51,8 @@ /mob/living/carbon/brain/update_damage_hud() return //no red circles for brain + +/mob/living/carbon/brain/can_be_revived() + . = 1 + if(!container || health <= config.health_threshold_dead) + return 0 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 962c0c47323..90a165abc9a 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -14,7 +14,6 @@ /mob/living/carbon/updatehealth() ..() med_hud_set_health() - med_hud_set_status() /mob/living/carbon/Destroy() for(var/atom/movable/guts in internal_organs) @@ -154,16 +153,18 @@ if(health >= 0) if(lying) - AdjustSleeping(-5) M.visible_message("[M] shakes [src] trying to get \him up!", \ "You shake [src] trying to get \him up!") else M.visible_message("[M] hugs [src] to make \him feel better!", \ "You hug [src] to make \him feel better!") - + AdjustSleeping(-5) AdjustParalysis(-3) AdjustStunned(-3) AdjustWeakened(-3) + if(resting) + resting = 0 + update_canmove() playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) @@ -677,62 +678,6 @@ var/const/GALOSHES_DONT_HELP = 4 if(wear_mask) . += wear_mask.tint -/mob/living/carbon/revive() - setToxLoss(0) - setOxyLoss(0) - setCloneLoss(0) - setBrainLoss(0) - setStaminaLoss(0) - SetParalysis(0) - SetStunned(0) - SetWeakened(0) - SetSleeping(0) - radiation = 0 - nutrition = NUTRITION_LEVEL_FED + 50 - bodytemperature = 310 - disabilities = 0 - ear_deaf = 0 - ear_damage = 0 - hallucination = 0 - heal_overall_damage(1000, 1000) - ExtinguishMob() - fire_stacks = 0 - suiciding = 0 - handcuffed = initial(handcuffed) - for(var/obj/item/weapon/restraints/R in contents) //actually remove cuffs from inventory - qdel(R) - update_handcuffed() - if(reagents) - for(var/datum/reagent/R in reagents.reagent_list) - reagents.clear_reagents() - reagents.addiction_list = list() - for(var/datum/disease/D in viruses) - D.cure(0) - var/obj/item/organ/internal/brain/BR = getorgan(/obj/item/organ/internal/brain) - if(BR) //can't revive if the mob has no brain - if(stat == DEAD) - dead_mob_list -= src - living_mob_list += src - stat = CONSCIOUS - BR.damaged_brain = 0 //if the brain itself is damaged we heal it - set_blindness(0) - set_blurriness(0) - set_eye_damage(0) - if(ishuman(src)) - var/mob/living/carbon/human/human_mob = src - human_mob.restore_blood() - human_mob.remove_all_embedded_objects() - updatehealth() - update_fire() - if(dna) - for(var/datum/mutation/human/HM in dna.mutations) - if(HM.quality != POSITIVE) - dna.remove_mutation(HM.name) - update_sight() - reload_fullscreen() - update_canmove() - - //this handles hud updates /mob/living/carbon/update_damage_hud() @@ -833,6 +778,7 @@ var/const/GALOSHES_DONT_HELP = 4 update_canmove() update_damage_hud() update_health_hud() + med_hud_set_status() //called when we get cuffed/uncuffed /mob/living/carbon/proc/update_handcuffed() @@ -845,3 +791,30 @@ var/const/GALOSHES_DONT_HELP = 4 clear_alert("handcuffed") update_inv_handcuffed() update_hud_handcuffed() + +/mob/living/carbon/fully_heal(admin_revive = 0) + if(reagents) + reagents.clear_reagents() + var/obj/item/organ/internal/brain/B = getorgan(/obj/item/organ/internal/brain) + if(B) + B.damaged_brain = 0 + if(admin_revive) + handcuffed = initial(handcuffed) + for(var/obj/item/weapon/restraints/R in contents) //actually remove cuffs from inventory + qdel(R) + update_handcuffed() + if(reagents) + reagents.addiction_list = list() + + for(var/datum/disease/D in viruses) + D.cure(0) + if(dna) + for(var/datum/mutation/human/HM in dna.mutations) + if(HM.quality != POSITIVE) + dna.remove_mutation(HM.name) + ..() + +/mob/living/carbon/can_be_revived() + . = ..() + if(!getorgan(/obj/item/organ/internal/brain)) + return 0 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 11f5911c23c..94799020482 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -943,3 +943,8 @@ hud_used.healthdoll.overlays += image('icons/mob/screen_gen.dmi',"[L.name][icon_num]") else hud_used.healthdoll.icon_state = "healthdoll_DEAD" + +/mob/living/carbon/human/fully_heal(admin_revive = 0) + restore_blood() + remove_all_embedded_objects() + ..() \ No newline at end of file diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index f06d5f7fe8c..9db435ddfc8 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -456,38 +456,54 @@ Sorry Giacom. Please don't be mad :( if(updating_health) updatehealth() -/mob/living/proc/revive() - setToxLoss(0) - setOxyLoss(0) - setCloneLoss(0) +//proc used to ressuscitate a mob +/mob/living/proc/revive(full_heal = 0, admin_revive = 0) + if(full_heal) + fully_heal(admin_revive) + if(stat == DEAD && can_be_revived()) //in some cases you can't revive (e.g. no brain) + dead_mob_list -= src + living_mob_list += src + suiciding = 0 + stat = UNCONSCIOUS //the mob starts unconscious, + blind_eyes(1) + updatehealth() //then we check if the mob should wake up. + update_canmove() + update_sight() + reload_fullscreen() + . = 1 + +//proc used to completely heal a mob. +/mob/living/proc/fully_heal(admin_revive = 0) + setToxLoss(0, 0) + setOxyLoss(0, 0) + setCloneLoss(0, 0) setBrainLoss(0) - setStaminaLoss(0) - SetParalysis(0) - SetStunned(0) - SetWeakened(0) - SetSleeping(0) + setStaminaLoss(0, 0) + SetParalysis(0, 0) + SetStunned(0, 0) + SetWeakened(0, 0) + SetSleeping(0, 0) radiation = 0 nutrition = NUTRITION_LEVEL_FED + 50 bodytemperature = 310 disabilities = 0 + set_blindness(0) + set_blurriness(0) + set_eye_damage(0) ear_deaf = 0 ear_damage = 0 hallucination = 0 heal_overall_damage(1000, 1000) ExtinguishMob() fire_stacks = 0 - suiciding = 0 - if(stat == DEAD) - dead_mob_list -= src - living_mob_list += src - stat = CONSCIOUS - set_blindness(0) - set_blurriness(0) - set_eye_damage(0) updatehealth() - update_fire() - regenerate_icons() - reload_fullscreen() + + +//proc called by revive(), to check if we can actually ressuscitate the mob (we don't want to revive him and have him instantly die again) +/mob/living/proc/can_be_revived() + . = 1 + if(health <= config.health_threshold_dead) + return 0 /mob/living/proc/update_damage_overlays() return @@ -984,7 +1000,7 @@ Sorry Giacom. Please don't be mad :( overlay_fullscreen("blind", /obj/screen/fullscreen/blind) else if(eye_blind) var/blind_minimum = 0 - if(stat == UNCONSCIOUS || (disabilities & BLIND)) + if(stat != CONSCIOUS || (disabilities & BLIND)) blind_minimum = 1 eye_blind = max(eye_blind+amount, blind_minimum) if(!eye_blind) @@ -1000,7 +1016,7 @@ Sorry Giacom. Please don't be mad :( overlay_fullscreen("blind", /obj/screen/fullscreen/blind) else if(eye_blind) var/blind_minimum = 0 - if(stat == UNCONSCIOUS || (disabilities & BLIND)) + if(stat != CONSCIOUS || (disabilities & BLIND)) blind_minimum = 1 eye_blind = blind_minimum if(!eye_blind) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index fe19ba24ed9..8acc7f79de7 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -890,3 +890,8 @@ var/list/ai_list = list() AT.get_remote_view_fullscreens(src) else clear_fullscreen("remote_view", 0) + +/mob/living/silicon/ai/revive(full_heal = 0, admin_revive = 0) + if(..()) //successfully ressuscitated from death + icon_state = "ai" + . = 1 \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 75cf9b3816a..842842a37bf 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -64,7 +64,6 @@ if(!fire_res_on_core) health -= getFireLoss() update_stat() - diag_hud_set_status() diag_hud_set_health() /mob/living/silicon/ai/update_stat() @@ -74,6 +73,10 @@ if(health <= config.health_threshold_dead) death() return + else if(stat == UNCONSCIOUS) + stat = CONSCIOUS + adjust_blindness(-1) + diag_hud_set_status() /mob/living/silicon/ai/update_sight() see_invisible = initial(see_invisible) diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm index f9c7e78231d..4c01e8724d5 100644 --- a/code/modules/mob/living/silicon/death.dm +++ b/code/modules/mob/living/silicon/death.dm @@ -6,3 +6,9 @@ /mob/living/silicon/spawn_dust() new /obj/effect/decal/remains/robot(loc) + +/mob/living/silicon/death(gibbed) + diag_hud_set_status() + diag_hud_set_health() + update_health_hud() + ..() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index e8047312618..fb2e6646e18 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1188,9 +1188,6 @@ if(health < -maxHealth*0.5) if(uneq_module(module_state_1)) src << "CRITICAL ERROR: All modules OFFLINE." - diag_hud_set_health() - diag_hud_set_status() - update_health_hud() /mob/living/silicon/robot/update_sight() if(!client) @@ -1247,6 +1244,9 @@ adjust_blindness(-1) update_canmove() update_headlamp() + diag_hud_set_status() + diag_hud_set_health() + update_health_hud() /mob/living/silicon/robot/fully_replace_character_name(oldname, newname) ..() @@ -1264,3 +1264,12 @@ Stun(3) ..() +/mob/living/silicon/robot/revive(full_heal = 0, admin_revive = 0) + if(..()) //successfully ressuscitated from death + if(camera && !wires.is_cut(WIRE_CAMERA)) + camera.toggle_cam(src,0) + update_headlamp() + if(admin_revive) + locked = 1 + notify_ai(1) + . = 1 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 0406f09bb77..586236927e5 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -876,9 +876,10 @@ Pass a positive integer as an argument to override a bot's default speed. . = ..() bot_reset() -/mob/living/simple_animal/bot/revive() - ..() - update_icon() +/mob/living/simple_animal/bot/revive(full_heal = 0, admin_revive = 0) + if(..()) + update_icon() + . = 1 /mob/living/simple_animal/bot/ghost() if(stat != DEAD) // Only ghost if we're doing this while alive, the pAI probably isn't dead yet. diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 88af1143648..7011ce950e2 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -51,10 +51,6 @@ ..(gibbed) regenerate_icons() -/mob/living/simple_animal/pet/dog/corgi/revive() - ..() - regenerate_icons() - /mob/living/simple_animal/pet/dog/corgi/show_inv(mob/user) user.set_machine(src) if(user.stat) return diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index 88f079e76ee..58c5c241ccd 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -240,16 +240,7 @@ /mob/living/simple_animal/drone/experience_pressure_difference(pressure_difference, direction) return -/mob/living/simple_animal/drone/revive() +/mob/living/simple_animal/drone/fully_heal(admin_revive = 0) adjustBruteLoss(-getBruteLoss()) //Heal all brute damage - stat = CONSCIOUS - updatehealth() - icon_state = icon_living - if(stat == DEAD) - dead_mob_list -= src - living_mob_list += src - update_sight() - reload_fullscreen() - update_canmove() diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm index a8dbdc217f3..a68dcf7516c 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -34,7 +34,7 @@ return D.visible_message("[D] begins to reactivate [src].", "You begin to reactivate [src]...") if(do_after(user,30, 1, target = src)) - revive() + revive(full_heal = 1) D.visible_message("[D] reactivates [src]!", "You reactivate [src].") alert_drones(DRONE_NET_CONNECT) if(G) diff --git a/code/modules/mob/living/simple_animal/friendly/pet.dm b/code/modules/mob/living/simple_animal/friendly/pet.dm index cf69255362c..dd6bbd56bc5 100644 --- a/code/modules/mob/living/simple_animal/friendly/pet.dm +++ b/code/modules/mob/living/simple_animal/friendly/pet.dm @@ -34,9 +34,10 @@ pcollar = new(src) regenerate_icons() -/mob/living/simple_animal/pet/revive() - ..() - regenerate_icons() +/mob/living/simple_animal/pet/revive(full_heal = 0, admin_revive = 0) + if(..()) + regenerate_icons() + . = 1 /mob/living/simple_animal/pet/death(gibbed) ..(gibbed) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 5425ae179f9..42764c0d352 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -280,7 +280,7 @@ H.visible_message("[user] forces [H] to apply [src]... they quickly regenerate all injuries!") else user << "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments." - H.revive() + H.revive(fully_heal = 1) qdel(src) ..() @@ -364,9 +364,10 @@ return icon_state = "Goliath_preattack" -/mob/living/simple_animal/hostile/asteroid/goliath/revive() - anchored = 1 - ..() +/mob/living/simple_animal/hostile/asteroid/goliath/revive(full_heal = 0, admin_revive = 0) + if(..()) + anchored = 1 + . = 1 /mob/living/simple_animal/hostile/asteroid/goliath/death(gibbed) anchored = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index deeaa327f70..258b60e91a4 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -85,10 +85,11 @@ qdel(src) ..() -/mob/living/simple_animal/hostile/mushroom/revive() - ..() - icon_state = "mushroom_color" - UpdateMushroomCap() +/mob/living/simple_animal/hostile/mushroom/revive(full_heal = 0, admin_revive = 0) + if(..()) + icon_state = "mushroom_color" + UpdateMushroomCap() + . = 1 /mob/living/simple_animal/hostile/mushroom/death(gibbed) ..(gibbed) @@ -104,7 +105,7 @@ /mob/living/simple_animal/hostile/mushroom/proc/Recover() visible_message("[src] slowly begins to recover.") faint_ticker = 0 - revive() + revive(full_heal = 1) UpdateMushroomCap() recovery_cooldown = 1 spawn(300) diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm index 482c1f7934e..9d0f091fa37 100644 --- a/code/modules/mob/living/simple_animal/hostile/zombie.dm +++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm @@ -50,7 +50,7 @@ L.gib() visible_message("[src] tears [L] to pieces!") src << "You feast on [L], restoring your health!" - src.revive() + revive(full_heal = 1) /mob/living/simple_animal/hostile/zombie/death() ..() @@ -67,7 +67,7 @@ spawn(rand(800,1200)) if(src) visible_message("[src] staggers to their feet!") - src.revive() + revive(full_heal = 1) /mob/living/simple_animal/hostile/zombie/proc/Zombify(mob/living/carbon/human/H) H.set_species(/datum/species/zombie) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 88cda5f4ca9..8dbf0beae1b 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -104,8 +104,10 @@ if(status_flags & GODMODE) return if(stat != DEAD) - if(health < 1) + if(health <= 0) death() + else + stat = CONSCIOUS /mob/living/simple_animal/blind_eyes() return @@ -466,17 +468,22 @@ /mob/living/simple_animal/update_fire() return + /mob/living/simple_animal/IgniteMob() return + /mob/living/simple_animal/ExtinguishMob() return -/mob/living/simple_animal/revive() +/mob/living/simple_animal/revive(full_heal = 0, admin_revive = 0) + if(..()) //successfully ressuscitated from death + icon = initial(icon) + icon_state = icon_living + density = initial(density) + . = 1 + +/mob/living/simple_animal/fully_heal(admin_revive = 0) health = maxHealth - icon = initial(icon) - icon_state = icon_living - density = initial(density) - update_canmove() ..() /mob/living/simple_animal/proc/make_babies() // <3 <3 <3 diff --git a/code/modules/mob/living/simple_animal/slime/death.dm b/code/modules/mob/living/simple_animal/slime/death.dm index 0a20862a574..dca7d56c4e3 100644 --- a/code/modules/mob/living/simple_animal/slime/death.dm +++ b/code/modules/mob/living/simple_animal/slime/death.dm @@ -11,7 +11,7 @@ maxHealth = 150 var/datum/action/innate/slime/evolve/E = new E.Grant(src) - revive() + revive(full_heal = 1) regenerate_icons() number = rand(1, 1000) name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index e1e88439f09..ec6f2fee6d9 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -86,7 +86,7 @@ max_charges = 10 //10, 5, 5, 4 /obj/item/weapon/gun/magic/wand/resurrection/zap_self(mob/living/user) - user.revive() + user.revive(full_heal = 1) user << "You feel great!" charges-- ..() diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 875cb94586d..1a3dd84e13c 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -55,18 +55,15 @@ /obj/item/projectile/magic/resurrection/on_hit(mob/living/carbon/target) . = ..() if(ismob(target)) - var/old_stat = target.stat - target.revive() - target.suiciding = 0 - if(!target.ckey) - for(var/mob/dead/observer/ghost in player_list) - if(target.real_name == ghost.real_name) - ghost.reenter_corpse() - break - if(old_stat != DEAD) - target << "You feel great!" - else + if(target.revive(full_heal = 1)) + if(!target.ckey) + for(var/mob/dead/observer/ghost in player_list) + if(target.real_name == ghost.real_name) + ghost.reenter_corpse() + break target << "You rise with a start, you're alive!!!" + else if(target.stat != DEAD) + target << "You feel great!" /obj/item/projectile/magic/teleport name = "bolt of teleportation" diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 62a15602716..f00e7eb4062 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -707,13 +707,10 @@ spawn (100) //so the ghost has time to re-enter return else - M.adjustOxyLoss(-20) - M.adjustToxLoss(-20) - if(M.health > config.health_threshold_dead && M.getorgan(/obj/item/organ/internal/brain)) - M.stat = UNCONSCIOUS - M.blind_eyes(1) - dead_mob_list -= M - living_mob_list |= list(M) + M.adjustOxyLoss(-20, 0) + M.adjustToxLoss(-20, 0) + M.updatehealth() + if(M.revive()) M.emote("gasp") add_logs(M, M, "revived", src) ..()