mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 18:53:06 +00:00
Fix remaining reforming bugs
This commit is contained in:
@@ -15,7 +15,7 @@ SUBSYSTEM_DEF(mobs)
|
|||||||
var/list/currentrun = list()
|
var/list/currentrun = list()
|
||||||
var/log_extensively = FALSE
|
var/log_extensively = FALSE
|
||||||
var/list/timelog = list()
|
var/list/timelog = list()
|
||||||
|
|
||||||
var/slept_mobs = 0
|
var/slept_mobs = 0
|
||||||
var/list/process_z = list()
|
var/list/process_z = list()
|
||||||
|
|
||||||
@@ -43,7 +43,12 @@ SUBSYSTEM_DEF(mobs)
|
|||||||
else if(M.low_priority && !(M.loc && process_z[get_z(M)]))
|
else if(M.low_priority && !(M.loc && process_z[get_z(M)]))
|
||||||
slept_mobs++
|
slept_mobs++
|
||||||
continue
|
continue
|
||||||
|
//CHOMPEdit Start - Enable pausing mobs (For transformation, holding until reformation, etc.)
|
||||||
|
else if(!M.enabled)
|
||||||
|
slept_mobs++
|
||||||
|
continue
|
||||||
|
//CHOMPEdit End
|
||||||
|
|
||||||
M.Life(times_fired)
|
M.Life(times_fired)
|
||||||
|
|
||||||
if (MC_TICK_CHECK)
|
if (MC_TICK_CHECK)
|
||||||
@@ -58,14 +63,14 @@ SUBSYSTEM_DEF(mobs)
|
|||||||
log_world(msg)
|
log_world(msg)
|
||||||
return
|
return
|
||||||
msg += "Lists: currentrun: [currentrun.len], mob_list: [mob_list.len]\n"
|
msg += "Lists: currentrun: [currentrun.len], mob_list: [mob_list.len]\n"
|
||||||
|
|
||||||
if(!currentrun.len)
|
if(!currentrun.len)
|
||||||
msg += "!!The subsystem just finished the mob_list list, and currentrun is empty (or has never run).\n"
|
msg += "!!The subsystem just finished the mob_list list, and currentrun is empty (or has never run).\n"
|
||||||
msg += "!!The info below is the tail of mob_list instead of currentrun.\n"
|
msg += "!!The info below is the tail of mob_list instead of currentrun.\n"
|
||||||
|
|
||||||
var/datum/D = currentrun.len ? currentrun[currentrun.len] : mob_list[mob_list.len]
|
var/datum/D = currentrun.len ? currentrun[currentrun.len] : mob_list[mob_list.len]
|
||||||
msg += "Tail entry: [describeThis(D)] (this is likely the item AFTER the problem item)\n"
|
msg += "Tail entry: [describeThis(D)] (this is likely the item AFTER the problem item)\n"
|
||||||
|
|
||||||
var/position = mob_list.Find(D)
|
var/position = mob_list.Find(D)
|
||||||
if(!position)
|
if(!position)
|
||||||
msg += "Unable to find context of tail entry in mob_list list.\n"
|
msg += "Unable to find context of tail entry in mob_list list.\n"
|
||||||
@@ -90,4 +95,4 @@ SUBSYSTEM_DEF(mobs)
|
|||||||
|
|
||||||
/datum/controller/subsystem/mobs/critfail()
|
/datum/controller/subsystem/mobs/critfail()
|
||||||
..()
|
..()
|
||||||
log_recent()
|
log_recent()
|
||||||
|
|||||||
@@ -291,7 +291,7 @@
|
|||||||
|
|
||||||
/obj/item/weapon/shockpaddles/proc/can_revive(mob/living/carbon/human/H) //This is checked right before attempting to revive
|
/obj/item/weapon/shockpaddles/proc/can_revive(mob/living/carbon/human/H) //This is checked right before attempting to revive
|
||||||
var/obj/item/organ/internal/brain/brain = H.internal_organs_by_name[O_BRAIN]
|
var/obj/item/organ/internal/brain/brain = H.internal_organs_by_name[O_BRAIN]
|
||||||
if(H.should_have_organ(O_BRAIN) && (!brain || brain.defib_timer <= 0 ) )
|
if(H.should_have_organ(O_BRAIN) && (!brain || (istype(brain) && brain.defib_timer <= 0 ) ) ) //CHOMPEdit - Fix a runtime when brain is an MMI
|
||||||
return "buzzes, \"Resuscitation failed - Excessive neural degeneration. Further attempts futile.\""
|
return "buzzes, \"Resuscitation failed - Excessive neural degeneration. Further attempts futile.\""
|
||||||
|
|
||||||
H.updatehealth()
|
H.updatehealth()
|
||||||
|
|||||||
@@ -284,6 +284,10 @@
|
|||||||
return
|
return
|
||||||
if(OldLoc in contents)
|
if(OldLoc in contents)
|
||||||
return //Someone dropping something (or being stripdigested)
|
return //Someone dropping something (or being stripdigested)
|
||||||
|
//CHOMPEdit Start - Prevent reforming causing a lot of log spam/sounds
|
||||||
|
if(istype(OldLoc, /mob/observer) || istype(OldLoc, /obj/item/device/mmi))
|
||||||
|
return //Someone getting reformed most likely (And if not, uh... shouldn't happen anyways?)
|
||||||
|
//CHOMPEdit end
|
||||||
|
|
||||||
//Generic entered message
|
//Generic entered message
|
||||||
to_chat(owner,"<span class='notice'>[thing] slides into your [lowertext(name)].</span>")
|
to_chat(owner,"<span class='notice'>[thing] slides into your [lowertext(name)].</span>")
|
||||||
@@ -713,6 +717,7 @@
|
|||||||
//CHOMPEdit Start - Reverts TF on death. This fixes a bug with posibrains or similar, and also makes reforming easier.
|
//CHOMPEdit Start - Reverts TF on death. This fixes a bug with posibrains or similar, and also makes reforming easier.
|
||||||
if(M.tf_mob_holder && M.tf_mob_holder.loc == M)
|
if(M.tf_mob_holder && M.tf_mob_holder.loc == M)
|
||||||
M.tf_mob_holder.ckey = M.ckey
|
M.tf_mob_holder.ckey = M.ckey
|
||||||
|
M.tf_mob_holder.enabled = TRUE
|
||||||
M.tf_mob_holder.loc = M.loc
|
M.tf_mob_holder.loc = M.loc
|
||||||
M.tf_mob_holder.forceMove(M.loc)
|
M.tf_mob_holder.forceMove(M.loc)
|
||||||
QDEL_LIST_NULL(M.tf_mob_holder.vore_organs)
|
QDEL_LIST_NULL(M.tf_mob_holder.vore_organs)
|
||||||
@@ -732,7 +737,7 @@
|
|||||||
if(is_vore_predator(M))
|
if(is_vore_predator(M))
|
||||||
M.release_vore_contents(include_absorbed = TRUE, silent = TRUE)
|
M.release_vore_contents(include_absorbed = TRUE, silent = TRUE)
|
||||||
|
|
||||||
var/hasMMI = FALSE // CHOMPEdit - Adjust how MMI's are handled
|
var/obj/item/device/mmi/hasMMI // CHOMPEdit - Adjust how MMI's are handled
|
||||||
|
|
||||||
//Drop all items into the belly.
|
//Drop all items into the belly.
|
||||||
if(config.items_survive_digestion)
|
if(config.items_survive_digestion)
|
||||||
@@ -782,6 +787,7 @@
|
|||||||
R.mmi.brainmob.languages = R.languages
|
R.mmi.brainmob.languages = R.languages
|
||||||
R.mmi.brainmob.remove_language("Robot Talk")
|
R.mmi.brainmob.remove_language("Robot Talk")
|
||||||
hasMMI = R.mmi
|
hasMMI = R.mmi
|
||||||
|
M.mind.transfer_to(hasMMI.brainmob)
|
||||||
R.mmi = null
|
R.mmi = null
|
||||||
else if(!R.shell) // Shells don't have brainmobs in their MMIs.
|
else if(!R.shell) // Shells don't have brainmobs in their MMIs.
|
||||||
to_chat(R, "<span class='danger'>Oops! Something went very wrong, your MMI was unable to receive your mind. You have been ghosted. Please make a bug report so we can fix this bug.</span>")
|
to_chat(R, "<span class='danger'>Oops! Something went very wrong, your MMI was unable to receive your mind. You have been ghosted. Please make a bug report so we can fix this bug.</span>")
|
||||||
@@ -789,17 +795,17 @@
|
|||||||
qdel(R)
|
qdel(R)
|
||||||
return
|
return
|
||||||
|
|
||||||
if(hasMMI)
|
if(istype(hasMMI))
|
||||||
var/obj/item/device/mmi/MMI = hasMMI
|
hasMMI.body_backup = M
|
||||||
M.mind.transfer_to(MMI.brainmob)
|
M.enabled = FALSE
|
||||||
MMI.body_backup = M
|
M.forceMove(hasMMI)
|
||||||
M.forceMove(MMI)
|
|
||||||
else
|
else
|
||||||
//Another CHOMPEdit started here. I left the comment here, though obviously we're doing a lot more now as well.
|
//Another CHOMPEdit started here. I left the comment here, though obviously we're doing a lot more now as well.
|
||||||
var/mob/observer/G = M.ghostize(FALSE) //CHOMPEdit start. Make sure they're out, so we can copy attack logs and such.
|
var/mob/observer/G = M.ghostize(FALSE) //CHOMPEdit start. Make sure they're out, so we can copy attack logs and such.
|
||||||
if(G)
|
if(G)
|
||||||
G.forceMove(src)
|
G.forceMove(src)
|
||||||
G.body_backup = M
|
G.body_backup = M
|
||||||
|
M.enabled = FALSE
|
||||||
M.forceMove(G)
|
M.forceMove(G)
|
||||||
else
|
else
|
||||||
qdel(M)
|
qdel(M)
|
||||||
|
|||||||
@@ -815,7 +815,7 @@
|
|||||||
|
|
||||||
if(isobserver(target))
|
if(isobserver(target))
|
||||||
var/mob/observer/T = target
|
var/mob/observer/T = target
|
||||||
if(!ismob(T.body_backup) || prevent_respawns.Find(T.mind.name))
|
if(!ismob(T.body_backup) || prevent_respawns.Find(T.mind.name) || ispAI(T.body_backup))
|
||||||
to_chat(user,"<span class='warning'>They don't seem to be reformable!</span>")
|
to_chat(user,"<span class='warning'>They don't seem to be reformable!</span>")
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
@@ -826,16 +826,60 @@
|
|||||||
|
|
||||||
if(isliving(T.body_backup))
|
if(isliving(T.body_backup))
|
||||||
var/mob/living/body_backup = T.body_backup
|
var/mob/living/body_backup = T.body_backup
|
||||||
body_backup.revive()
|
if(ishuman(body_backup))
|
||||||
|
var/mob/living/carbon/human/H = body_backup
|
||||||
|
body_backup.adjustBruteLoss(-6)
|
||||||
|
body_backup.adjustFireLoss(-6)
|
||||||
|
body_backup.setOxyLoss(0)
|
||||||
|
if(H.isSynthetic())
|
||||||
|
H.adjustToxLoss(-H.getToxLoss())
|
||||||
|
else
|
||||||
|
H.adjustToxLoss(-6)
|
||||||
|
body_backup.adjustCloneLoss(-6)
|
||||||
|
body_backup.updatehealth()
|
||||||
|
// Now we do the check to see if we should revive...
|
||||||
|
var/should_proceed_with_revive = TRUE
|
||||||
|
var/obj/item/organ/internal/brain/brain = H.internal_organs_by_name[O_BRAIN]
|
||||||
|
should_proceed_with_revive &&= !H.should_have_organ(O_BRAIN) || (brain && (!istype(brain) || brain.defib_timer > 0))
|
||||||
|
if(!H.isSynthetic())
|
||||||
|
should_proceed_with_revive &&= !(HUSK in H.mutations) && H.can_defib
|
||||||
|
if(should_proceed_with_revive)
|
||||||
|
for(var/organ_tag in H.species.has_organ)
|
||||||
|
var/obj/item/organ/O = H.species.has_organ[organ_tag]
|
||||||
|
var/vital = initial(O.vital) //check for vital organs
|
||||||
|
if(vital)
|
||||||
|
O = H.internal_organs_by_name[organ_tag]
|
||||||
|
if(!O || O.damage > O.max_damage)
|
||||||
|
should_proceed_with_revive = FALSE
|
||||||
|
break
|
||||||
|
if(should_proceed_with_revive)
|
||||||
|
dead_mob_list.Remove(H)
|
||||||
|
if((H in living_mob_list) || (H in dead_mob_list))
|
||||||
|
WARNING("Mob [H] was defibbed but already in the living or dead list still!")
|
||||||
|
living_mob_list += H
|
||||||
|
|
||||||
|
H.timeofdeath = 0
|
||||||
|
H.set_stat(UNCONSCIOUS) //Life() can bring them back to consciousness if it needs to.
|
||||||
|
H.failed_last_breath = 0 //So mobs that died of oxyloss don't revive and have perpetual out of breath.
|
||||||
|
H.reload_fullscreen()
|
||||||
|
else
|
||||||
|
body_backup.revive()
|
||||||
body_backup.forceMove(T.loc)
|
body_backup.forceMove(T.loc)
|
||||||
|
body_backup.enabled = TRUE
|
||||||
body_backup.ajourn = 0
|
body_backup.ajourn = 0
|
||||||
body_backup.key = T.key
|
body_backup.key = T.key
|
||||||
body_backup.teleop = null
|
body_backup.teleop = null
|
||||||
T.body_backup = null
|
T.body_backup = null
|
||||||
host.vore_selected.release_specific_contents(T, TRUE)
|
host.vore_selected.release_specific_contents(T, TRUE)
|
||||||
|
if(istype(body_backup, /mob/living/simple_mob))
|
||||||
|
var/mob/living/simple_mob/sm = body_backup
|
||||||
|
if(sm.icon_rest && sm.resting)
|
||||||
|
sm.icon_state = sm.icon_rest
|
||||||
|
else
|
||||||
|
sm.icon_state = sm.icon_living
|
||||||
T.update_icon()
|
T.update_icon()
|
||||||
announce_ghost_joinleave(T.mind, 0, "They now occupy their body again.")
|
announce_ghost_joinleave(T.mind, 0, "They now occupy their body again.")
|
||||||
if(istype(target,/obj/item/device/mmi)) // A good bit of repeated code, sure, but... cleanest way to do this.
|
else if(istype(target,/obj/item/device/mmi)) // A good bit of repeated code, sure, but... cleanest way to do this.
|
||||||
var/obj/item/device/mmi/MMI = target
|
var/obj/item/device/mmi/MMI = target
|
||||||
if(!ismob(MMI.body_backup) || !MMI.brainmob.mind || prevent_respawns.Find(MMI.brainmob.mind.name))
|
if(!ismob(MMI.body_backup) || !MMI.brainmob.mind || prevent_respawns.Find(MMI.brainmob.mind.name))
|
||||||
to_chat(user,"<span class='warning'>They don't seem to be reformable!</span>")
|
to_chat(user,"<span class='warning'>They don't seem to be reformable!</span>")
|
||||||
@@ -847,19 +891,28 @@
|
|||||||
|
|
||||||
if(isliving(MMI.body_backup))
|
if(isliving(MMI.body_backup))
|
||||||
var/mob/living/body_backup = MMI.body_backup
|
var/mob/living/body_backup = MMI.body_backup
|
||||||
body_backup.revive()
|
body_backup.enabled = TRUE
|
||||||
body_backup.forceMove(MMI.loc)
|
body_backup.forceMove(MMI.loc)
|
||||||
body_backup.ajourn = 0
|
body_backup.ajourn = 0
|
||||||
body_backup.teleop = null
|
body_backup.teleop = null
|
||||||
//And now installing the MMI into the body...
|
//And now installing the MMI into the body...
|
||||||
if(isrobot(body_backup)) //Just do the reverse of getting the MMI pulled out in /obj/belly/proc/digestion_death
|
if(isrobot(body_backup)) //Just do the reverse of getting the MMI pulled out in /obj/belly/proc/digestion_death
|
||||||
var/mob/living/silicon/robot/R = body_backup
|
var/mob/living/silicon/robot/R = body_backup
|
||||||
|
R.revive()
|
||||||
MMI.brainmob.mind.transfer_to(R)
|
MMI.brainmob.mind.transfer_to(R)
|
||||||
MMI.loc = R
|
MMI.loc = R
|
||||||
R.mmi = MMI
|
R.mmi = MMI
|
||||||
R.mmi.brainmob.add_language("Robot Talk")
|
R.mmi.brainmob.add_language("Robot Talk")
|
||||||
else //reference /datum/surgery_step/robotics/install_mmi/end_step
|
else //reference /datum/surgery_step/robotics/install_mmi/end_step
|
||||||
var/obj/item/organ/internal/mmi_holder/holder = new(body_backup, 1)
|
var/obj/item/organ/internal/mmi_holder/holder
|
||||||
|
if(istype(MMI, /obj/item/device/mmi/digital/posibrain))
|
||||||
|
var/obj/item/organ/internal/mmi_holder/posibrain/holdertmp = new(body_backup, 1)
|
||||||
|
holder = holdertmp
|
||||||
|
else if(istype(MMI, /obj/item/device/mmi/digital/robot))
|
||||||
|
var/obj/item/organ/internal/mmi_holder/robot/holdertmp = new(body_backup, 1)
|
||||||
|
holder = holdertmp
|
||||||
|
else
|
||||||
|
holder = new(body_backup, 1)
|
||||||
body_backup.internal_organs_by_name["brain"] = holder
|
body_backup.internal_organs_by_name["brain"] = holder
|
||||||
MMI.loc = holder
|
MMI.loc = holder
|
||||||
holder.stored_mmi = MMI
|
holder.stored_mmi = MMI
|
||||||
@@ -869,6 +922,36 @@
|
|||||||
MMI.brainmob.mind.transfer_to(body_backup)
|
MMI.brainmob.mind.transfer_to(body_backup)
|
||||||
body_backup.languages = MMI.brainmob.languages
|
body_backup.languages = MMI.brainmob.languages
|
||||||
//You've hopefully already named yourself, so... not implementing that bit.
|
//You've hopefully already named yourself, so... not implementing that bit.
|
||||||
|
var/mob/living/carbon/human/H = body_backup
|
||||||
|
body_backup.adjustBruteLoss(-6, TRUE)
|
||||||
|
body_backup.adjustFireLoss(-6, TRUE)
|
||||||
|
body_backup.setOxyLoss(0)
|
||||||
|
H.adjustToxLoss(-H.getToxLoss())
|
||||||
|
body_backup.adjustCloneLoss(-6)
|
||||||
|
body_backup.updatehealth()
|
||||||
|
// Now we do the check to see if we should revive...
|
||||||
|
var/should_proceed_with_revive = TRUE
|
||||||
|
var/obj/item/organ/internal/brain/brain = H.internal_organs_by_name[O_BRAIN]
|
||||||
|
should_proceed_with_revive &&= !H.should_have_organ(O_BRAIN) || (brain && brain.defib_timer > 0 )
|
||||||
|
if(should_proceed_with_revive)
|
||||||
|
for(var/organ_tag in H.species.has_organ)
|
||||||
|
var/obj/item/organ/O = H.species.has_organ[organ_tag]
|
||||||
|
var/vital = initial(O.vital) //check for vital organs
|
||||||
|
if(vital)
|
||||||
|
O = H.internal_organs_by_name[organ_tag]
|
||||||
|
if(!O || O.damage > O.max_damage)
|
||||||
|
should_proceed_with_revive = FALSE
|
||||||
|
break
|
||||||
|
if(should_proceed_with_revive)
|
||||||
|
dead_mob_list.Remove(H)
|
||||||
|
if((H in living_mob_list) || (H in dead_mob_list))
|
||||||
|
WARNING("Mob [H] was defibbed but already in the living or dead list still!")
|
||||||
|
living_mob_list += H
|
||||||
|
|
||||||
|
H.timeofdeath = 0
|
||||||
|
H.set_stat(UNCONSCIOUS) //Life() can bring them back to consciousness if it needs to.
|
||||||
|
H.failed_last_breath = 0 //So mobs that died of oxyloss don't revive and have perpetual out of breath.
|
||||||
|
H.reload_fullscreen()
|
||||||
MMI.body_backup = null
|
MMI.body_backup = null
|
||||||
return TRUE
|
return TRUE
|
||||||
//CHOMPEdit End
|
//CHOMPEdit End
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
/mob
|
/mob
|
||||||
var/voice_freq = 42500 // Preference for character voice frequency
|
var/voice_freq = 42500 // Preference for character voice frequency
|
||||||
var/list/voice_sounds_list = list() // The sound list containing our voice sounds!
|
var/list/voice_sounds_list = list() // The sound list containing our voice sounds!
|
||||||
|
var/enabled = TRUE //Pauses a mob if disabled (Prevents life ticks from happening)
|
||||||
|
|||||||
Reference in New Issue
Block a user