Technomancer Golem (#12072)

This commit is contained in:
Geeves
2021-07-21 14:19:32 +02:00
committed by GitHub
parent d2406f79d3
commit d6ff9dc7f7
24 changed files with 302 additions and 100 deletions

View File

@@ -176,35 +176,8 @@ emp_act
return FALSE
/mob/living/carbon/human/emp_act(severity)
if(isipc(src))
var/obj/item/organ/internal/surge/s = src.internal_organs_by_name["surge"]
if(!isnull(s))
if(s.surge_left >= 1)
playsound(src.loc, 'sound/magic/LightningShock.ogg', 25, 1)
s.surge_left -= 1
if(s.surge_left)
visible_message("<span class='warning'>[src] was not affected by EMP pulse.</span>", "<span class='warning'>Warning: EMP detected, integrated surge prevention module activated. There are [s.surge_left] preventions left.</span>")
else
s.broken = TRUE
s.icon_state = "surge_ipc_broken"
visible_message("<span class='warning'>[src] was not affected by EMP pulse.</span>", "<span class='warning'>Warning: EMP detected, integrated surge prevention module activated. The surge prevention module is fried, replacement recommended.</span>")
return TRUE
else if(s.surge_left == 0.5)
to_chat(src, "<span class='danger'>Warning: EMP detected, integrated surge prevention module is damaged and was unable to fully protect from EMP. Half of the damage taken. Replacement recommended.</span>")
for(var/obj/O in src)
if(!O)
continue
O.emp_act(severity * 2) // EMP act takes reverse numbers
for(var/obj/item/organ/external/O in organs)
O.emp_act(severity)
for(var/obj/item/organ/I in O.internal_organs)
if(I.robotic == ROBOTIC_NONE)
continue
I.emp_act(severity * 2) // EMP act takes reverse numbers
return TRUE
else
to_chat(src, "<span class='danger'>Warning: EMP detected, integrated surge prevention module is fried and unable to protect from EMP. Replacement recommended.</span>")
if(species.handle_emp_act(src, severity))
return // blocks the EMP
for(var/obj/O in src)
O.emp_act(severity)
..()

View File

@@ -36,24 +36,7 @@
if (hydration < (max_hydration * 0.1))
tally++
if(istype(buckled_to, /obj/structure/bed/chair/wheelchair))
for(var/organ_name in list(BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM))
var/obj/item/organ/external/E = get_organ(organ_name)
if(!E || E.is_stump())
tally += 4
else if(E.status & ORGAN_SPLINTED)
tally += 0.5
else if(E.status & ORGAN_BROKEN)
tally += 1.5
else
for(var/organ_name in list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG))
var/obj/item/organ/external/E = get_organ(organ_name)
if(!E || E.is_stump())
tally += 4
else if((E.status & ORGAN_BROKEN) || (E.tendon_status() & TENDON_CUT))
tally += 1.5
else if((E.status & ORGAN_SPLINTED) || (E.tendon_status() & TENDON_BRUISED))
tally += 0.5
tally += species.handle_movement_tally(src)
if (can_feel_pain())
if(shock_stage >= 10)

View File

@@ -83,39 +83,7 @@
if (istype(buckled_to, /obj/structure/bed))
return
var/static/support_limbs = list(
BP_L_LEG = BP_R_LEG,
BP_L_FOOT = BP_R_FOOT
)
var/has_opposite_limb = FALSE
for(var/limb_tag in list(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT))
var/obj/item/organ/external/E = organs_by_name[limb_tag]
if(!E || (E.status & (ORGAN_MUTATED|ORGAN_DEAD)) || E.is_stump()) //should just be !E.is_usable() here but dislocation screws that up.
has_opposite_limb = get_organ(support_limbs[limb_tag])
if(!has_opposite_limb)
stance_damage += 10 //No walking for you with no supporting limb, buddy.
break
else
stance_damage += 2
else if (E.is_malfunctioning())
//malfunctioning only happens intermittently so treat it as a missing limb when it procs
stance_damage += 2
if(prob(10))
visible_message(SPAN_WARNING("\The [src]'s [E.name] [pick("twitches", "shudders")] and sparks!"))
spark(src, 5)
else if (E.is_broken() || !E.is_usable())
stance_damage += 1
else if (E.is_dislocated())
stance_damage += 0.5
// Canes and crutches help you stand (if the latter is ever added)
// One cane mitigates a broken leg+foot, or a missing foot.
// No double caning allowed, sorry. Canes also don't work if you're missing a functioning pair of feet or legs.
if(has_opposite_limb)
var/obj/item/cane/C = get_type_in_hands(/obj/item/cane)
if(C?.can_support)
stance_damage -=2
stance_damage = species.handle_stance_damage(src)
//Standing is poor.
if(stance_damage >= 4 || (stance_damage >= 2 && prob(5)))

View File

@@ -310,3 +310,6 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy/mannequin)
/mob/living/carbon/human/adamantine_golem/Initialize(mapload)
. = ..(mapload, SPECIES_GOLEM_ADAMANTINE)
/mob/living/carbon/human/technomancer_golem/Initialize(mapload)
. = ..(mapload, SPECIES_GOLEM_TECHOMANCER)

View File

@@ -704,4 +704,68 @@
/datum/species/proc/get_species(var/reference, var/mob/living/carbon/human/H, var/records)
if(reference)
return src
return name
return name
// prevents EMP damage if return it returns TRUE
/datum/species/proc/handle_emp_act(var/mob/living/carbon/human/H, var/severity)
return FALSE
/datum/species/proc/handle_movement_tally(var/mob/living/carbon/human/H)
var/tally = 0
if(istype(H.buckled_to, /obj/structure/bed/chair/wheelchair))
for(var/organ_name in list(BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM))
var/obj/item/organ/external/E = H.get_organ(organ_name)
if(!E || E.is_stump())
tally += 4
else if(E.status & ORGAN_SPLINTED)
tally += 0.5
else if(E.status & ORGAN_BROKEN)
tally += 1.5
else
for(var/organ_name in list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG))
var/obj/item/organ/external/E = H.get_organ(organ_name)
if(!E || E.is_stump())
tally += 4
else if((E.status & ORGAN_BROKEN) || (E.tendon_status() & TENDON_CUT))
tally += 1.5
else if((E.status & ORGAN_SPLINTED) || (E.tendon_status() & TENDON_BRUISED))
tally += 0.5
return tally
/datum/species/proc/handle_stance_damage(var/mob/living/carbon/human/H, var/damage_only = FALSE)
var/static/support_limbs = list(
BP_L_LEG = BP_R_LEG,
BP_L_FOOT = BP_R_FOOT
)
var/has_opposite_limb = FALSE
var/stance_damage = 0
for(var/limb_tag in list(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT))
var/obj/item/organ/external/E = H.organs_by_name[limb_tag]
if(!E || (E.status & (ORGAN_MUTATED|ORGAN_DEAD)) || E.is_stump()) //should just be !E.is_usable() here but dislocation screws that up.
has_opposite_limb = H.get_organ(support_limbs[limb_tag])
if(!has_opposite_limb)
stance_damage += 10 //No walking for you with no supporting limb, buddy.
break
else
stance_damage += 2
else if (E.is_malfunctioning())
//malfunctioning only happens intermittently so treat it as a missing limb when it procs
stance_damage += 2
if(!damage_only && prob(10))
H.visible_message(SPAN_WARNING("\The [H]'s [E.name] [pick("twitches", "shudders")] and sparks!"))
spark(H, 5)
else if (E.is_broken() || !E.is_usable())
stance_damage += 1
else if (E.is_dislocated())
stance_damage += 0.5
// Canes and crutches help you stand (if the latter is ever added)
// One cane mitigates a broken leg+foot, or a missing foot.
// No double caning allowed, sorry. Canes also don't work if you're missing a functioning pair of feet or legs.
if(has_opposite_limb)
var/obj/item/cane/C = H.get_type_in_hands(/obj/item/cane)
if(C?.can_support)
stance_damage -=2
return stance_damage

View File

@@ -99,3 +99,15 @@
/datum/hud_data/construct
has_hydration = FALSE
has_nutrition = FALSE
/datum/hud_data/technomancer_golem
has_hydration = FALSE
has_nutrition = FALSE
gear = list(
"l_ear" = list("loc" = ui_shoes, "name" = "left ear", "slot" = slot_l_ear, "state" = "l_ear", "toggle" = 1),
"back" = list("loc" = ui_back, "name" = "back", "slot" = slot_back, "state" = "back", "slot_type" = /obj/screen/inventory/back),
"id" = list("loc" = ui_id, "name" = "id", "slot" = slot_wear_id, "state" = "id"),
"storage1" = list("loc" = ui_storage1, "name" = "left pocket", "slot" = slot_l_store, "state" = "pocket"),
"storage2" = list("loc" = ui_storage2, "name" = "right pocket", "slot" = slot_r_store, "state" = "pocket")
)

View File

@@ -863,3 +863,79 @@ var/global/list/golem_types = list(SPECIES_GOLEM_COAL,
heat_level_3 = T0C+1538
golem_designation = "Adamantine"
/datum/species/golem/technomancer
name = SPECIES_GOLEM_TECHOMANCER
short_name = "tgo"
name_plural = "technomancer golems"
icobase = 'icons/mob/human_races/golem/r_techno.dmi'
deform = 'icons/mob/human_races/golem/r_techno.dmi'
default_genders = list(NEUTER)
selectable_pronouns = list(NEUTER)
brute_mod = 0.4
burn_mod = 0.2
flags = NO_BREATHE | NO_PAIN | NO_ARTERIES | NO_SCAN | NO_POISON
inherent_verbs = list(/mob/living/carbon/human/proc/breath_of_life)
blood_color = "#33CCFF"
has_limbs = list(
BP_CHEST = list("path" = /obj/item/organ/external/chest/unbreakable/techno_golem),
BP_GROIN = list("path" = /obj/item/organ/external/groin/techno_golem),
BP_HEAD = list("path" = /obj/item/organ/external/head/unbreakable/techno_golem),
BP_L_ARM = list("path" = /obj/item/organ/external/arm/unbreakable/techno_golem),
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/unbreakable/techno_golem),
BP_L_HAND = list("path" = /obj/item/organ/external/hand/unbreakable/techno_golem),
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/unbreakable/techno_golem)
)
meat_type = /obj/item/anomaly_core
remains_type = /obj/item/ectoplasm
hud_type = /datum/hud_data/technomancer_golem
golem_designation = "Technomancer"
/datum/species/golem/technomancer/handle_post_spawn(mob/living/carbon/human/H)
. = ..()
for(var/obj/item/organ/external/E as anything in H.organs)
E.status |= ORGAN_ASSISTED
/datum/species/golem/technomancer/handle_movement_tally(var/mob/living/carbon/human/H)
var/tally = 0
if(istype(H.buckled_to, /obj/structure/bed/chair/wheelchair))
for(var/organ_name in list(BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM))
var/obj/item/organ/external/E = H.get_organ(organ_name)
if(!E || E.is_stump())
tally += 4
else if(E.status & ORGAN_SPLINTED)
tally += 0.5
else if(E.status & ORGAN_BROKEN)
tally += 1.5
else
var/obj/item/organ/external/E = H.get_organ(BP_GROIN)
if(!E || E.is_stump())
tally += 8
else if((E.status & ORGAN_BROKEN) || (E.tendon_status() & TENDON_CUT))
tally += 4
else if((E.status & ORGAN_SPLINTED) || (E.tendon_status() & TENDON_BRUISED))
tally += 2
return tally
/datum/species/golem/technomancer/handle_stance_damage(var/mob/living/carbon/human/H, var/damage_only = FALSE)
var/stance_damage = 0
var/obj/item/organ/external/E = H.organs_by_name[BP_GROIN]
if(!E || !E.is_usable())
stance_damage += 10
else if (E.is_broken())
stance_damage += 3
return stance_damage
/datum/species/golem/technomancer/handle_emp_act(mob/living/carbon/human/H, var/severity)
H.apply_damage(75 * (4 - severity)) // their brute_mod means damage needs to be high
return TRUE

View File

@@ -137,6 +137,23 @@
H.bodytemperature += cost * sprint_temperature_factor
return TRUE
/datum/species/machine/handle_emp_act(mob/living/carbon/human/H, var/severity)
var/obj/item/organ/internal/surge/S = H.internal_organs_by_name["surge"]
if(!isnull(S))
if(S.surge_left >= 1)
playsound(H.loc, 'sound/magic/LightningShock.ogg', 25, 1)
S.surge_left -= 1
if(S.surge_left)
to_chat(H, SPAN_WARNING("Warning: EMP detected, integrated surge prevention module activated. There are [S.surge_left] preventions left."))
else
S.broken = TRUE
S.icon_state = "surge_ipc_broken"
to_chat(H, SPAN_DANGER("Warning: EMP detected, integrated surge prevention module activated. The surge prevention module is fried, replacement recommended."))
return TRUE
else
to_chat(src, SPAN_DANGER("Warning: EMP detected, integrated surge prevention module is fried and unable to protect from EMP. Replacement recommended."))
return FALSE
/datum/species/machine/handle_death(var/mob/living/carbon/human/H)
..()
H.f_style = ""

View File

@@ -1149,12 +1149,7 @@ proc/is_blind(A)
return
/mob/living/carbon/human/needs_wheelchair()
var/stance_damage = 0
for(var/limb_tag in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT))
var/obj/item/organ/external/E = organs_by_name[limb_tag]
if(!E || !E.is_usable())
stance_damage += 2
return stance_damage >= 4
return species.handle_stance_damage(src, TRUE) >= 4
/mob/living/carbon/human/proc/equip_wheelchair()
var/obj/structure/bed/chair/wheelchair/W = new(get_turf(src))