mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-26 01:52:15 +00:00
Technomancer Golem (#12072)
This commit is contained in:
@@ -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)
|
||||
..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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")
|
||||
)
|
||||
@@ -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
|
||||
@@ -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 = ""
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user