Protean Death Handler

This commit is contained in:
BlackMajor
2022-05-08 00:27:17 +12:00
parent 232c0c5806
commit 921c3f602a
6 changed files with 120 additions and 37 deletions
@@ -185,6 +185,8 @@ datum/riding/simple_mob/protean_blob/handle_vehicle_layer()
humanform.species.Stat(humanform)
/mob/living/simple_mob/protean_blob/updatehealth()
if(humanform.nano_dead_check(src))
return
if(!humanform)
return ..()
@@ -196,7 +198,7 @@ datum/riding/simple_mob/protean_blob/handle_vehicle_layer()
//Alive, becoming dead
if((stat < DEAD) && (health <= 0))
death()
humanform.death()
nutrition = humanform.nutrition
@@ -338,6 +340,7 @@ datum/riding/simple_mob/protean_blob/handle_vehicle_layer()
target.forceMove(vore_selected)
to_chat(target,"<span class='warning'>\The [src] quickly engulfs you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!</span>")
/* Don't need this block anymore since our Prots have hands
/mob/living/simple_mob/protean_blob/attack_target(var/atom/A)
if(refactory && istype(A,/obj/item/stack/material))
var/obj/item/stack/material/S = A
@@ -367,6 +370,7 @@ datum/riding/simple_mob/protean_blob/handle_vehicle_layer()
I.forceMove(vore_selected)
else
return ..()
*/
/mob/living/simple_mob/protean_blob/attackby(var/obj/item/O, var/mob/user)
if(refactory && istype(O,/obj/item/stack/material))
@@ -408,9 +412,7 @@ var/global/list/disallowed_protean_accessories = list(
// Helpers - Unsafe, WILL perform change.
/mob/living/carbon/human/proc/nano_intoblob(force)
if(loc == /obj/item/weapon/rig/protean)
return
if(!force && !isturf(loc))
if(!force && !isturf(loc) && !loc == /obj/item/weapon/rig/protean)
to_chat(src,"<span class='warning'>You can't change forms while inside something.</span>")
return
@@ -23,60 +23,63 @@
/obj/item/organ/external/arm/unbreakable/nano
robotic = ORGAN_NANOFORM
encased = FALSE
max_damage = 100
max_damage = 65
min_broken_damage = 1000 //Please
vital = FALSE
model = "protean"
/obj/item/organ/external/arm/right/unbreakable/nano
robotic = ORGAN_NANOFORM
encased = FALSE
max_damage = 100
max_damage = 65
min_broken_damage = 1000
vital = FALSE
model = "protean"
/obj/item/organ/external/leg/unbreakable/nano
robotic = ORGAN_NANOFORM
encased = FALSE
max_damage = 100
max_damage = 65
min_broken_damage = 1000
vital = FALSE
model = "protean"
/obj/item/organ/external/leg/right/unbreakable/nano
robotic = ORGAN_NANOFORM
encased = FALSE
max_damage = 100
max_damage = 65
min_broken_damage = 1000
vital = FALSE
model = "protean"
/obj/item/organ/external/hand/unbreakable/nano
robotic = ORGAN_NANOFORM
encased = FALSE
max_damage = 100
max_damage = 65
min_broken_damage = 1000
vital = FALSE
model = "protean"
/obj/item/organ/external/hand/right/unbreakable/nano
robotic = ORGAN_NANOFORM
encased = FALSE
max_damage = 100
max_damage = 65
min_broken_damage = 1000
vital = FALSE
model = "protean"
/obj/item/organ/external/foot/unbreakable/nano
robotic = ORGAN_NANOFORM
encased = FALSE
max_damage = 100
max_damage = 65
min_broken_damage = 1000
vital = FALSE
model = "protean"
/obj/item/organ/external/foot/right/unbreakable/nano
robotic = ORGAN_NANOFORM
encased = FALSE
max_damage = 100
max_damage = 65
min_broken_damage = 1000
vital = FALSE
model = "protean"
/obj/item/organ/external/head/unbreakable/nano/disfigure()
return //No way to repair disfigured prots
// // // Internal Organs
/obj/item/organ/internal/nano
robotic = ORGAN_ROBOT
@@ -12,6 +12,9 @@
var/mob/living/caller = src
if(temporary_form)
caller = temporary_form
if(nano_dead_check(caller))
to_chat(caller, "<span class='warning'>You need to be repaired first before you can act!</span>")
return
if(stat)
to_chat(caller,"<span class='warning'>You must be awake and standing to perform this action!</span>")
return
@@ -206,6 +209,9 @@
var/mob/living/caller = src
if(temporary_form)
caller = temporary_form
if(nano_dead_check(caller))
to_chat(caller, "<span class='warning'>You need to be repaired first before you can act!</span>")
return
var/obj/item/organ/internal/nano/refactory/refactory = nano_get_refactory()
//Missing the organ that does this
@@ -245,17 +251,24 @@
////
// Blob Form
////
/mob/living/carbon/human/proc/nano_blobform()
/mob/living/carbon/human/proc/nano_blobform(var/forced)
set name = "Toggle Blobform"
set desc = "Switch between amorphous and humanoid forms."
set category = "Abilities"
set hidden = 1
if(nano_dead_check(src))
return
if(forced)
if(temporary_form)
nano_outofblob(temporary_form, forced)
else
nano_intoblob(forced)
return
var/atom/movable/to_locate = temporary_form || src
if(!isturf(to_locate.loc))
if(!isturf(to_locate.loc) && !forced)
to_chat(to_locate,"<span class='warning'>You need more space to perform this action!</span>")
return
//Blob form
if(temporary_form)
if(temporary_form.stat)
@@ -294,16 +307,19 @@
////
// Rig Transform
////
/mob/living/carbon/human/proc/nano_rig_transform()
/mob/living/carbon/human/proc/nano_rig_transform(var/forced)
set name = "Modify Form - Hardsuit"
set desc = "Allows a protean to retract its mass into its hardsuit module at will."
set category = "Abilities"
set hidden = 1
if(!temporary_form) //If you're human, force you into blob form before rig'ing
nano_blobform()
spawn(2)
if(nano_dead_check(src))
to_chat(temporary_form, "<span class='warning'>You need to be repaired first before you can act!</span>")
return
if(!temporary_form) //If you're human, force you into blob form before rig'ing
nano_blobform(forced)
spawn(2)
if(istype(src.species, /datum/species/protean))
var/datum/species/protean/S = src.species
@@ -323,7 +339,7 @@
S.OurRig.Moved()
P.has_hands = 1
else //We're not in our own RIG
if(P.stat || P.resting)
if(P.stat || P.resting && !forced)
to_chat(P,"<span class='warning'>You can only do this while not stunned.</span>")
else
if(P.l_hand)
@@ -373,6 +389,8 @@
var/mob/living/caller = src
var/mob/living/carbon/human/target
var/datum/species/protean/S = src.species
if(nano_dead_check(src))
return
if(temporary_form)
caller = temporary_form
if(caller.loc == S.OurRig)
@@ -427,7 +445,18 @@
/mob/living/carbon/human/nano_get_refactory()
return ..(locate(/obj/item/organ/internal/nano/refactory) in internal_organs)
//I hate this whole bit but I want proteans to be able to "die" and still be "alive" in their blob as a suit
/mob/living/carbon/human/proc/nano_dead_check(var/mob/living/caller)
if(istype(src.species, /datum/species/protean))
var/datum/species/protean/S = src.species
if(S.pseudodead)
return 1
return 0
/mob/living/carbon/human/proc/nano_set_dead(var/num)
if(istype(src.species, /datum/species/protean))
var/datum/species/protean/S = src.species
S.pseudodead = num
/// /// /// Ability objects for stat panel
/obj/effect/protean_ability
@@ -24,6 +24,7 @@
offline_vision_restriction = 0
open = 1
cell_type = /obj/item/weapon/cell/protean
var/dead = 0
/obj/item/weapon/rig/protean/relaymove(mob/user, var/direction)
if(user.stat || user.stunned)
@@ -340,6 +341,16 @@
for(var/obj/item/rig_module/module in installed_modules)
if(module.accepts_item(W,user)) //Item is handled in this proc
return
if(dead)
if(istype(W, /obj/item/stack/material/plasteel))
var/obj/item/stack/material/plasteel/PL = W
if(PL.get_amount() < 5)
to_chat(user, "<span class='warning'>You need five sheets of plasteel to reconstruct this Protean.</span>")
return
if(PL.use(5))
to_chat(user, "<span class='notice'>You feed plasteel to the Protean, they will be able to reconstitute now.</span>")
make_alive(myprotean)
return
if(rig_storage)
var/obj/item/weapon/storage/backpack = rig_storage
if(backpack.can_be_inserted(W, 1))
@@ -349,6 +360,35 @@
AssimilateBag(user,0,W)
..()
/obj/item/weapon/rig/protean/proc/make_alive(var/mob/living/simple_mob/protean_blob/P)
var/mob/living/carbon/human/H
var/datum/species/protean/S
if(P.humanform)
H = P.humanform
H.setToxLoss(0)
H.setOxyLoss(0)
H.setCloneLoss(0)
H.setBrainLoss(0)
H.SetParalysis(0)
H.SetStunned(0)
H.SetWeakened(0)
H.blinded = 0
H.SetBlinded(0)
H.eye_blurry = 0
H.ear_deaf = 0
H.ear_damage = 0
H.heal_overall_damage(H.getBruteLoss(), H.getFireLoss(), 1)
dead_mob_list.Remove(H)
living_mob_list += H
H.tod = null
H.timeofdeath = 0
H.set_stat(CONSCIOUS)
if(istype(H.species, /datum/species/protean))
S = H.species
S.pseudodead = 0
dead = 0
to_chat(P, "<span class='notice'>You've been fed the necessary plasteel to reconstitute your form, you can act again!</span>")
/obj/item/weapon/rig/protean/take_hit(damage, source, is_emp=0)
return //We don't do that here
@@ -29,18 +29,19 @@
male_scream_sound = null
female_scream_sound = null
virus_immune = 1
blood_volume = 0
min_age = 18
max_age = 200
oxy_mod = 0
radiation_mod = 0 //Can't be assed with fandangling rad protections while blob formed/suited
virus_immune = 1
blood_volume = 0
min_age = 18
max_age = 200
oxy_mod = 0
radiation_mod = 0 //Can't be assed with fandangling rad protections while blob formed/suited
darksight = 10
siemens_coefficient = 2
emp_dmg_mod = 1.4
hazard_low_pressure = -1 //Space doesn't bother them
hazard_high_pressure = INFINITY //consistency
//Cold/heat does affect them, but it's done in special ways below - //No it isn't?
cold_level_1 = -INFINITY
cold_level_2 = -INFINITY
cold_level_3 = -INFINITY
@@ -112,6 +113,8 @@
var/blob_appearance = "puddle2"
var/pseudodead = 0
/datum/species/protean/New()
..()
if(!LAZYLEN(abilities))
@@ -174,14 +177,20 @@
/datum/species/protean/handle_death(var/mob/living/carbon/human/H)
if(!H)
return // Iono!
return //No body?
var/mob/temp = H
if(H.temporary_form)
H.forceMove(H.temporary_form.drop_location())
H.ckey = H.temporary_form.ckey
QDEL_NULL(H.temporary_form)
to_chat(H, "<span class='warning'>You died as a Protean. Please sit out of the round for at least 5 or 10 minutes before respawning, to represent the time it would take to ship a new-you to the station, depending on how you died.</span>")
temp = H.temporary_form
playsound(temp, 'modular_chomp/sound/voice/borg_deathsound.ogg', 50, 1)
temp.visible_message("<b>[temp.name]</b> shudders and retreats inwards, coalescing into a single core componant!")
to_chat(temp, "<span class='warning'>You've died as a Protean! While dead, you will be locked to your core RIG control module until you can be repaired. You will need to be fed 5 sheets of plasteel in order to reshape yourself.</span>")
if(H.temporary_form)
if(!istype(H.temporary_form.loc, /obj/item/weapon/rig/protean))
H.nano_rig_transform(1)
else
H.nano_rig_transform(1)
OurRig.dead = 1
pseudodead = 1
/datum/species/protean/handle_environment_special(var/mob/living/carbon/human/H)
if((H.getActualBruteLoss() + H.getActualFireLoss()) > H.maxHealth*0.5 && isturf(H.loc)) //So, only if we're not a blob (we're in nullspace) or in someone (or a locker, really, but whatever)
@@ -317,8 +326,9 @@ CHOMP Removal end*/
material_name = MAT_STEEL
/datum/modifier/protean/steel/tick()
holder.adjustBruteLoss(-1,include_robo = TRUE) //Modified by species resistances
holder.adjustFireLoss(-1,include_robo = TRUE) //Modified by species resistances
holder.adjustBruteLoss(-1,include_robo = TRUE)
holder.adjustFireLoss(-1,include_robo = TRUE)
holder.adjustToxLoss(-1)
var/mob/living/carbon/human/H = holder
for(var/obj/item/organ/O as anything in H.internal_organs)
// Fix internal damage
@@ -328,7 +338,6 @@ CHOMP Removal end*/
else if(O.status & ORGAN_DEAD)
O.status &= ~ORGAN_DEAD //Unset dead if we repaired it entirely
// PAN Card
/obj/item/clothing/accessory/permit/nanotech
name = "\improper P.A.N. card"