diff --git a/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_blob.dm b/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_blob.dm index 842cbe9c4c..dfe5c14c1f 100644 --- a/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_blob.dm +++ b/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_blob.dm @@ -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,"\The [src] quickly engulfs you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") +/* 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,"You can't change forms while inside something.") return diff --git a/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_organs.dm b/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_organs.dm index 54174b54d5..445d581463 100644 --- a/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_organs.dm +++ b/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_organs.dm @@ -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 diff --git a/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_powers.dm b/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_powers.dm index 0c15c0d737..cca67ca871 100644 --- a/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_powers.dm +++ b/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_powers.dm @@ -12,6 +12,9 @@ var/mob/living/caller = src if(temporary_form) caller = temporary_form + if(nano_dead_check(caller)) + to_chat(caller, "You need to be repaired first before you can act!") + return if(stat) to_chat(caller,"You must be awake and standing to perform this action!") return @@ -206,6 +209,9 @@ var/mob/living/caller = src if(temporary_form) caller = temporary_form + if(nano_dead_check(caller)) + to_chat(caller, "You need to be repaired first before you can act!") + 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,"You need more space to perform this action!") 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, "You need to be repaired first before you can act!") + 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,"You can only do this while not stunned.") 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 diff --git a/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_rig.dm b/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_rig.dm index 79413cf142..a65480506a 100644 --- a/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_rig.dm +++ b/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_rig.dm @@ -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, "You need five sheets of plasteel to reconstruct this Protean.") + return + if(PL.use(5)) + to_chat(user, "You feed plasteel to the Protean, they will be able to reconstitute now.") + 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, "You've been fed the necessary plasteel to reconstitute your form, you can act again!") + /obj/item/weapon/rig/protean/take_hit(damage, source, is_emp=0) return //We don't do that here diff --git a/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_species.dm b/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_species.dm index 72bd99a3c4..fbcbf87828 100644 --- a/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_species.dm +++ b/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_species.dm @@ -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, "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.") + temp = H.temporary_form + playsound(temp, 'modular_chomp/sound/voice/borg_deathsound.ogg', 50, 1) + temp.visible_message("[temp.name] shudders and retreats inwards, coalescing into a single core componant!") + to_chat(temp, "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.") + 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" diff --git a/modular_chomp/icons/mob/species/protean/protean.dmi b/modular_chomp/icons/mob/species/protean/protean.dmi index 297432003c..075c3fb037 100644 Binary files a/modular_chomp/icons/mob/species/protean/protean.dmi and b/modular_chomp/icons/mob/species/protean/protean.dmi differ