Adds Upgraded Cybernetic Heart

This commit is contained in:
Fox McCloud
2019-02-25 01:15:53 -05:00
parent d1aeb7068f
commit b8a9f127bf
9 changed files with 153 additions and 12 deletions
+5
View File
@@ -147,6 +147,7 @@
if(reagents.has_reagent("teslium"))
shock_damage *= 1.5 //If the mob has teslium in their body, shocks are 50% more damaging!
take_overall_damage(0,shock_damage, TRUE, used_weapon = "Electrocution")
shock_internal_organs(shock_damage)
visible_message(
"<span class='danger'>[src] was shocked by \the [source]!</span>", \
"<span class='userdanger'>You feel a powerful shock coursing through your body!</span>", \
@@ -1116,3 +1117,7 @@ so that different stomachs can handle things in different ways VB*/
if(I.flags_inv & HIDEMASK || forced)
update_inv_wear_mask()
update_inv_head()
/mob/living/carbon/proc/shock_internal_organs(intensity)
for(var/obj/item/organ/O in internal_organs)
O.shock_organ(intensity)
@@ -522,6 +522,16 @@
build_path = /obj/item/organ/internal/heart/cybernetic
category = list("Medical")
/datum/design/cybernetic_heart_u
name = "Upgraded Cybernetic Heart"
desc = "An upgraded cybernetic heart."
id = "cybernetic_heart_u"
req_tech = list("biotech" = 5, "materials" = 5, "engineering" = 5)
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500)
build_path = /obj/item/organ/internal/heart/cybernetic/upgraded
category = list("Medical")
/datum/design/cybernetic_lungs
name = "Cybernetic Lungs"
desc = "A pair of cybernetic lungs."
+9 -10
View File
@@ -33,9 +33,8 @@
..()
to_chat(user, "<span class='info'>[src] is assembled in the [parent_organ == "r_arm" ? "right" : "left"] arm configuration. You can use a screwdriver to reassemble it.</span>")
/obj/item/organ/internal/cyberimp/arm/attackby(obj/item/W, mob/user, params)
..()
if(isscrewdriver(W))
/obj/item/organ/internal/cyberimp/arm/attackby(obj/item/I, mob/user, params)
if(isscrewdriver(I))
if(parent_organ == "r_arm")
parent_organ = "l_arm"
else
@@ -43,8 +42,8 @@
slot = parent_organ + "_device"
to_chat(user, "<span class='notice'>You modify [src] to be installed on the [parent_organ == "r_arm" ? "right" : "left"] arm.</span>")
update_icon()
else if(istype(W, /obj/item/card/emag))
emag_act()
else
return ..()
/obj/item/organ/internal/cyberimp/arm/remove(mob/living/carbon/M, special = 0)
Retract()
@@ -126,7 +125,7 @@
// You can emag the arm-mounted implant by activating it while holding emag in it's hand.
var/arm_slot = (parent_organ == "r_arm" ? slot_r_hand : slot_l_hand)
if(istype(owner.get_item_by_slot(arm_slot), /obj/item/card/emag) && emag_act())
if(istype(owner.get_item_by_slot(arm_slot), /obj/item/card/emag) && emag_act(owner))
return
if(!holder || (holder in src))
@@ -205,12 +204,12 @@
/obj/item/organ/internal/cyberimp/arm/toolset/l
parent_organ = "l_arm"
/obj/item/organ/internal/cyberimp/arm/toolset/emag_act()
/obj/item/organ/internal/cyberimp/arm/toolset/emag_act(mob/user)
if(!(locate(/obj/item/kitchen/knife/combat/cyborg) in items_list))
to_chat(usr, "<span class='notice'>You unlock [src]'s integrated knife!</span>")
to_chat(user, "<span class='notice'>You unlock [src]'s integrated knife!</span>")
items_list += new /obj/item/kitchen/knife/combat/cyborg(src)
return 1
return 0
return TRUE
return FALSE
/obj/item/organ/internal/cyberimp/arm/esword
name = "arm-mounted energy blade"
+102 -1
View File
@@ -147,4 +147,105 @@
icon_base = "heart-c"
dead_icon = "heart-c-off"
origin_tech = "biotech=5"
status = ORGAN_ROBOT
status = ORGAN_ROBOT
/obj/item/organ/internal/heart/cybernetic/upgraded
name = "upgraded cybernetic heart"
desc = "A more advanced version of a cybernetic heart. Grants the user additional stamina and heart stability, but the electronics are vulnerable to shock."
icon_state = "heart-c-u-on"
icon_base = "heart-c-u"
dead_icon = "heart-c-u-off"
origin_tech = "biotech=6"
var/emagged = FALSE
var/attempted_restart = FALSE
/obj/item/organ/internal/heart/cybernetic/upgraded/on_life()
if(!ishuman(owner))
return
if(!(status & ORGAN_DEAD) && !attempted_restart && !beating)
to_chat(owner, "<span class='warning'>Your [name] detects a cardiac event and attempts to return to its normal rhythm!</span>")
if(prob(20) && emagged)
attempted_restart = TRUE
Restart()
addtimer(CALLBACK(src, .proc/message_to_owner, owner, "<span class='warning'>Your [name] returns to its normal rhythm!</span>"), 30)
addtimer(CALLBACK(src, .proc/recharge), 200)
else if(prob(10))
attempted_restart = TRUE
Restart()
addtimer(CALLBACK(src, .proc/message_to_owner, owner, "<span class='warning'>Your [name] returns to its normal rhythm!</span>"), 30)
addtimer(CALLBACK(src, .proc/recharge), 300)
else
attempted_restart = TRUE
if(emagged)
addtimer(CALLBACK(src, .proc/recharge), 200)
else
addtimer(CALLBACK(src, .proc/recharge), 300)
addtimer(CALLBACK(src, .proc/message_to_owner, owner, "<span class='warning'>Your [name] fails to return to its normal rhythm!</span>"), 30)
if(!(status & ORGAN_DEAD))
var/boost = emagged ? 2 : 1
owner.AdjustDrowsy(-4 * boost)
owner.AdjustParalysis(-1 * boost)
owner.AdjustStunned(-1 * boost)
owner.AdjustWeakened(-1 * boost)
owner.SetSleeping(0)
owner.adjustStaminaLoss(-1 * boost)
/obj/item/organ/internal/heart/cybernetic/upgraded/proc/message_to_owner(mob/M, message)
to_chat(M, message)
/obj/item/organ/internal/heart/cybernetic/upgraded/proc/recharge()
attempted_restart = FALSE
/obj/item/organ/internal/heart/cybernetic/upgraded/emag_act(mob/user)
if(!emagged)
to_chat(user, "<span class='warning'>You disable the safeties on [src]</span>")
emagged = TRUE
else
to_chat(user, "<span class='warning'>You re-enable the safeties on [src]</span>")
emagged = FALSE
/obj/item/organ/internal/heart/cybernetic/upgraded/emp_act(severity)
..()
if(emp_proof)
return
necrotize()
/obj/item/organ/internal/heart/cybernetic/upgraded/shock_organ(intensity)
if(!ishuman(owner))
return
intensity = min(intensity, 100)
var/numHigh = round(intensity / 5)
var/numMid = round(intensity / 10)
var/numLow = round(intensity / 20)
if(emagged && !(status & ORGAN_DEAD))
if(prob(numHigh))
to_chat(owner, "<span class='warning'>Your [name] spasms violently!</span>")
owner.adjustBruteLoss(numHigh)
if(prob(numHigh))
to_chat(owner, "<span class='warning'>Your [name] shocks you painfully!</span>")
owner.adjustFireLoss(numHigh)
if(prob(numMid))
to_chat(owner, "<span class='warning'>Your [name] lurches awkwardly!</span>")
Stop()
if(prob(numMid))
to_chat(owner, "<span class='danger'>Your [name] stops beating!</span>")
Stop()
if(prob(numLow))
to_chat(owner, "<span class='danger'>Your [name] shuts down!</span>")
necrotize()
else if(!emagged && !(status & ORGAN_DEAD))
if(prob(numMid))
to_chat(owner, "<span class='warning'>Your [name] spasms violently!</span>")
owner.adjustBruteLoss(numMid)
if(prob(numMid))
to_chat(owner, "<span class='warning'>Your [name] shocks you painfully!</span>")
owner.adjustFireLoss(numMid)
if(prob(numLow))
to_chat(owner, "<span class='warning'>Your [name] lurches awkwardly!</span>")
Stop()
+17 -1
View File
@@ -63,6 +63,15 @@
if(species_override)
dna.species = new species_override
/obj/item/organ/attackby(obj/item/I, mob/user, params)
if(is_robotic() && istype(I, /obj/item/stack/nanopaste))
var/obj/item/stack/nanopaste/nano = I
nano.use(1)
rejuvenate()
to_chat(user, "<span class='notice'>You repair the damage on [src].</span>")
return
return ..()
/obj/item/organ/proc/set_dna(var/datum/dna/new_dna)
if(new_dna)
dna = new_dna.Clone()
@@ -138,7 +147,10 @@
/obj/item/organ/examine(mob/user)
..(user)
if(status & ORGAN_DEAD)
to_chat(user, "<span class='notice'>The decay has set in.</span>")
if(!is_robotic())
to_chat(user, "<span class='notice'>The decay has set in.</span>")
else
to_chat(user, "<span class='notice'>It looks in need of repairs.</span>")
/obj/item/organ/proc/handle_germ_effects()
//** Handle the effects of infections
@@ -171,6 +183,7 @@
/obj/item/organ/proc/rejuvenate()
damage = 0
germ_level = 0
surgeryize()
if(is_robotic()) //Robotic organs stay robotic.
status = ORGAN_ROBOT
else
@@ -269,6 +282,9 @@
if(2)
receive_damage(7, 1)
/obj/item/organ/proc/shock_organ(intensity)
return
/obj/item/organ/proc/remove(var/mob/living/user,special = 0)
if(!istype(owner))
return
@@ -262,6 +262,7 @@ This function completely restores a damaged organ to perfect condition.
*/
/obj/item/organ/external/rejuvenate()
damage_state = "00"
surgeryize()
if(is_robotic()) //Robotic organs stay robotic.
status = ORGAN_ROBOT
else