From 0d140349b38e6e4c5c7a0f873bb33f6b3cf7be83 Mon Sep 17 00:00:00 2001 From: Neerti Date: Tue, 4 Oct 2016 21:09:15 -0400 Subject: [PATCH] Technomancer Bug Fixes & Tweaks Cores can now be locked and unlocked by a verb. Locked cores cannot be removed by anyone. Cores automatically unlock if the wearer dies or otherwise stops existing for some reason. Healing spells now induce a flat instability cost on the healer instead of it being split between healer and healed. The amount healed is greatly increased if used on someone besides the healer. Mend Organs is now called Great Mend Wounds, and now heals broken bones, IB, eye damage, and blood loss in addition to internal organs. Radiating instability (the purple glow) now gives a warning to people afflicted. Instability discounts should start applying correctly for specific cores. Instability now affects all living mobs and not just humans. This includes borgs and simple animals. Phase shift now adds ongoing instability while hiding inside the rift. Projectile spells should be logged now. Wards last forever, and should not die in vacuum now. Restoration aura is now green colored and not blue. Simple mobs and cyborgs are now harmed by lightning. --- code/game/gamemodes/technomancer/core_obj.dm | 12 +- code/game/gamemodes/technomancer/equipment.dm | 1 + .../gamemodes/technomancer/instability.dm | 105 +++++++++++++++--- .../technomancer/spells/aspect_aura.dm | 6 +- .../technomancer/spells/audible_deception.dm | 4 +- .../technomancer/spells/aura/biomed_aura.dm | 12 +- .../technomancer/spells/aura/fire_aura.dm | 2 +- .../technomancer/spells/aura/frost_aura.dm | 2 +- .../technomancer/spells/aura/shock_aura.dm | 2 +- .../technomancer/spells/aura/unstable_aura.dm | 2 +- .../gamemodes/technomancer/spells/control.dm | 4 +- .../technomancer/spells/flame_tongue.dm | 4 +- .../technomancer/spells/insert/mend_burns.dm | 11 +- .../technomancer/spells/insert/mend_metal.dm | 9 +- .../technomancer/spells/insert/mend_organs.dm | 40 +++++-- .../technomancer/spells/insert/mend_wires.dm | 12 +- .../technomancer/spells/insert/mend_wounds.dm | 6 +- .../technomancer/spells/insert/purify.dm | 13 +-- .../technomancer/spells/instability_tap.dm | 4 +- .../technomancer/spells/mark_recall.dm | 4 +- .../technomancer/spells/oxygenate.dm | 4 +- .../technomancer/spells/phase_shift.dm | 6 + .../spells/projectile/overload.dm | 2 +- .../spells/projectile/projectile.dm | 10 +- .../gamemodes/technomancer/spells/radiance.dm | 2 +- .../technomancer/spells/resurrect.dm | 6 +- .../technomancer/spells/shared_burden.dm | 2 +- .../technomancer/spells/spawner/darkness.dm | 2 +- .../technomancer/spells/spawner/fire_blast.dm | 2 +- .../technomancer/spells/spawner/pulsar.dm | 2 +- .../technomancer/spells/summon/summon.dm | 21 ++-- .../technomancer/spells/summon/summon_ward.dm | 19 +++- .../technomancer/spells/warp_strike.dm | 2 +- code/modules/mob/living/silicon/robot/life.dm | 1 + code/modules/mob/living/silicon/silicon.dm | 9 +- .../mob/living/simple_animal/simple_animal.dm | 17 ++- 36 files changed, 248 insertions(+), 114 deletions(-) diff --git a/code/game/gamemodes/technomancer/core_obj.dm b/code/game/gamemodes/technomancer/core_obj.dm index 48c45f3f068..fc89f5ce69f 100644 --- a/code/game/gamemodes/technomancer/core_obj.dm +++ b/code/game/gamemodes/technomancer/core_obj.dm @@ -86,6 +86,8 @@ if(wearer && wearer.mind) if(!(technomancers.is_antagonist(wearer.mind))) // In case someone tries to wear a stolen core. wearer.adjust_instability(20) + if(!wearer || wearer.stat == DEAD) // Unlock if we're dead or not worn. + canremove = TRUE /obj/item/weapon/technomancer_core/proc/regenerate() energy = min(max(energy + regen_rate, 0), max_energy) @@ -287,4 +289,12 @@ /obj/item/weapon/technomancer_core/summoner/pay_dues() if(summoned_mobs.len) - pay_energy( round(summoned_mobs.len) ) \ No newline at end of file + pay_energy( round(summoned_mobs.len) ) + +/obj/item/weapon/technomancer_core/verb/toggle_lock() + set name = "Toggle Core Lock" + set category = "Object" + set desc = "Toggles the locking mechanism on your manipulation core." + + canremove = !canremove + to_chat(usr, "You [canremove ? "de" : ""]activate the locking mechanism on \the [src].") \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/equipment.dm b/code/game/gamemodes/technomancer/equipment.dm index 54cae5670e2..97978086b3d 100644 --- a/code/game/gamemodes/technomancer/equipment.dm +++ b/code/game/gamemodes/technomancer/equipment.dm @@ -139,6 +139,7 @@ icon = 'icons/obj/technomancer.dmi' icon_state = "scepter" force = 15 + slot_flags = SLOT_BELT /obj/item/weapon/scepter/attack_self(mob/living/carbon/human/user) var/obj/item/item_to_test = user.get_other_hand(src) diff --git a/code/game/gamemodes/technomancer/instability.dm b/code/game/gamemodes/technomancer/instability.dm index 0de94cba7a4..8f9eebeb170 100644 --- a/code/game/gamemodes/technomancer/instability.dm +++ b/code/game/gamemodes/technomancer/instability.dm @@ -5,15 +5,15 @@ // Proc: adjust_instability() // Parameters: 0 // Description: Does nothing, because inheritence. -/mob/living/proc/adjust_instability() - return +/mob/living/proc/adjust_instability(var/amount) + instability = min(max(instability + amount, 0), 200) // Proc: adjust_instability() // Parameters: 1 (amount - how much instability to give) // Description: Adds or subtracks instability to the mob, then updates the hud. /mob/living/carbon/human/adjust_instability(var/amount) - instability = min(max(instability + amount, 0), 200) instability_update_hud() + ..() // Proc: instability_update_hud() // Parameters: 0 @@ -35,7 +35,7 @@ // Proc: Life() // Parameters: 0 // Description: Makes instability tick along with Life(). -/mob/living/carbon/human/Life() +/mob/living/Life() . = ..() handle_instability() @@ -43,9 +43,8 @@ // Parameters: 0 // Description: Makes instability decay. instability_effects() handles the bad effects for having instability. It will also hold back // from causing bad effects more than one every ten seconds, to prevent sudden death from angry RNG. -/mob/living/carbon/human/proc/handle_instability() +/mob/living/proc/handle_instability() instability = round(Clamp(instability, 0, 200)) - instability_update_hud() //This should cushon against really bad luck. if(instability && last_instability_event < (world.time - 10 SECONDS) && prob(20)) instability_effects() @@ -65,6 +64,10 @@ if(101 to 200) adjust_instability(-40) +/mob/living/carbon/human/handle_instability() + ..() + instability_update_hud() + /* [16:18:08] Sparks [16:18:10] Wormholes @@ -78,17 +81,85 @@ // Parameters: 0 // Description: Does a variety of bad effects to the entity holding onto the instability, with more severe effects occuring if they have // a lot of instability. -/mob/living/carbon/human/proc/instability_effects() +/mob/living/proc/instability_effects() + last_instability_event = world.time + spawn(1) + var/image/instability_flash = image('icons/obj/spells.dmi',"instability") + overlays |= instability_flash + sleep(4) + overlays.Remove(instability_flash) + qdel(instability_flash) + radiate_instability() + +/mob/living/silicon/instability_effects() if(instability) var/rng = 0 - last_instability_event = world.time - spawn(1) - var/image/instability_flash = image('icons/obj/spells.dmi',"instability") - overlays |= instability_flash - sleep(4) - overlays.Remove(instability_flash) - qdel(instability_flash) - radiate_instability() + ..() + switch(instability) + if(1 to 10) //Harmless + return + if(11 to 30) //Minor + rng = rand(0,1) + switch(rng) + if(0) + var/datum/effect/effect/system/spark_spread/sparks = PoolOrNew(/datum/effect/effect/system/spark_spread) + sparks.set_up(5, 0, src) + sparks.attach(loc) + sparks.start() + visible_message("Electrical sparks manifest from nowhere around \the [src]!") + qdel(sparks) + if(1) + return + + if(31 to 50) //Moderate + rng = rand(0,4) + switch(rng) + if(0) + electrocute_act(instability * 0.3, "unstable energies") + if(1) + adjustFireLoss(instability * 0.15) //7.5 burn @ 50 instability + src << "Your chassis alerts you to overheating from an unknown external force!" + if(2) + adjustBruteLoss(instability * 0.15) //7.5 brute @ 50 instability + src << "Your chassis makes the sound of metal groaning!" + if(3) + safe_blink(src, range = 6) + src << "You're teleported against your will!" + if(4) + emp_act(2) + + if(51 to 100) //Severe + rng = rand(0,3) + switch(rng) + if(0) + electrocute_act(instability * 0.5, "extremely unstable energies") + if(1) + emp_act(2) + if(2) + adjustFireLoss(instability * 0.3) //30 burn @ 100 instability + src << "Your chassis alerts you to extreme overheating from an unknown external force!" + if(3) + adjustBruteLoss(instability * 0.3) //30 brute @ 100 instability + src << "Your chassis makes the sound of metal groaning and tearing!" + + if(101 to 200) //Lethal + rng = rand(0,4) + switch(rng) + if(0) + electrocute_act(instability, "extremely unstable energies") + if(1) + emp_act(1) + if(2) + adjustFireLoss(instability * 0.4) //40 burn @ 100 instability + src << "Your chassis alerts you to extreme overheating from an unknown external force!" + if(3) + adjustBruteLoss(instability * 0.4) //40 brute @ 100 instability + src << "Your chassis makes the sound of metal groaning and tearing!" + +/mob/living/carbon/human/instability_effects() + if(instability) + var/rng = 0 + ..() switch(instability) if(1 to 10) //Harmless return @@ -194,7 +265,7 @@ if(7) adjustToxLoss(instability * 0.40) //25 tox @ 100 instability -/mob/living/carbon/human/proc/radiate_instability() +/mob/living/proc/radiate_instability() var/distance = round(sqrt(instability / 2)) if(instability <= 30) distance = 0 @@ -210,6 +281,8 @@ var/armor = getarmor(null, "energy") var/armor_factor = abs( (armor - 100) / 100) outgoing_instability = outgoing_instability * armor_factor + if(outgoing_instability) + to_chat(H, "The purple glow makes you feel strange...") H.adjust_instability(outgoing_instability) set_light(distance, distance * 2, l_color = "#C26DDE") diff --git a/code/game/gamemodes/technomancer/spells/aspect_aura.dm b/code/game/gamemodes/technomancer/spells/aspect_aura.dm index 36b2a7c344e..577f356229f 100644 --- a/code/game/gamemodes/technomancer/spells/aspect_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aspect_aura.dm @@ -73,7 +73,7 @@ var/turf/location = get_turf(H) location.hotspot_expose(1000, 50, 1) - owner.adjust_instability(1) + adjust_instability(1) /obj/item/weapon/spell/aura/frost name = "chilling aura" @@ -95,7 +95,7 @@ var/turf/location = get_turf(H) location.hotspot_expose(1, 50, 1) - owner.adjust_instability(1) + adjust_instability(1) @@ -128,7 +128,7 @@ for(var/mob/living/L in mobs_to_heal) L.adjustBruteLoss(-5) L.adjustFireLoss(-5) - owner.adjust_instability(2) + adjust_instability(2) /obj/item/weapon/spell/aura/biomed/on_use_cast(mob/living/user) heal_allies_only = !heal_allies_only diff --git a/code/game/gamemodes/technomancer/spells/audible_deception.dm b/code/game/gamemodes/technomancer/spells/audible_deception.dm index 17a1d9db209..832714f2028 100644 --- a/code/game/gamemodes/technomancer/spells/audible_deception.dm +++ b/code/game/gamemodes/technomancer/spells/audible_deception.dm @@ -76,10 +76,10 @@ var/turf/T = get_turf(hit_atom) if(selected_sound && pay_energy(200)) playsound(T, selected_sound, 80, 1, -1) - owner.adjust_instability(1) + adjust_instability(1) // Air Horn time. if(selected_sound == 'sound/items/AirHorn.ogg' && pay_energy(3800)) - owner.adjust_instability(49) // Pay for your sins. + adjust_instability(49) // Pay for your sins. for(var/mob/living/carbon/M in ohearers(6, T)) if(M.get_ear_protection() >= 2) continue diff --git a/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm b/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm index 024002814e4..7eee612b8f6 100644 --- a/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm @@ -12,7 +12,7 @@ icon_state = "generic" cast_methods = null aspect = ASPECT_BIOMED - glow_color = "#0000FF" + glow_color = "#33CC33" var/regen_tick = 0 var/heal_allies_only = 1 @@ -23,16 +23,16 @@ if(regen_tick % 5 == 0) var/list/nearby_mobs = range(4,owner) var/list/mobs_to_heal = list() - if(heal_allies_only) - for(var/mob/living/L in nearby_mobs) + for(var/mob/living/L in nearby_mobs) + if(heal_allies_only) if(is_ally(L)) mobs_to_heal |= L - else - mobs_to_heal = nearby_mobs //Heal everyone! + else + mobs_to_heal |= L // Heal everyone! for(var/mob/living/L in mobs_to_heal) L.adjustBruteLoss(-2) L.adjustFireLoss(-2) - owner.adjust_instability(2) + adjust_instability(2) /obj/item/weapon/spell/aura/biomed/on_use_cast(mob/living/user) heal_allies_only = !heal_allies_only diff --git a/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm b/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm index 5e1028192b6..431828ed548 100644 --- a/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm @@ -47,4 +47,4 @@ T.hotspot_expose(1000, 50, 1) T.create_fire(fire_power) - owner.adjust_instability(1) \ No newline at end of file + adjust_instability(1) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm b/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm index 610702646df..4ed1a469c17 100644 --- a/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm @@ -36,4 +36,4 @@ var/cold_factor = abs(protection - 1) H.bodytemperature = max( (H.bodytemperature - temp_change) * cold_factor, temp_cap) - owner.adjust_instability(1) \ No newline at end of file + adjust_instability(1) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm b/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm index 70ae416ec04..b4c6027d9dd 100644 --- a/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm @@ -39,4 +39,4 @@ L.electrocute_act(power, src, 1.0, BP_TORSO) - owner.adjust_instability(3) \ No newline at end of file + adjust_instability(3) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm b/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm index 15aae46ad32..726e7d87b16 100644 --- a/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm @@ -40,4 +40,4 @@ L << "You feel almost like you're melting from the inside!" - owner.adjust_instability(2) \ No newline at end of file + adjust_instability(2) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/control.dm b/code/game/gamemodes/technomancer/spells/control.dm index 17fb821d357..0cee9a93508 100644 --- a/code/game/gamemodes/technomancer/spells/control.dm +++ b/code/game/gamemodes/technomancer/spells/control.dm @@ -150,7 +150,7 @@ attack \the [L]." //This is to stop someone from controlling beepsky and getting him to stun someone 5 times a second. user.setClickCooldown(8) - owner.adjust_instability(controlled_mobs.len) + adjust_instability(controlled_mobs.len) else if(isturf(hit_atom)) var/turf/T = hit_atom @@ -159,7 +159,7 @@ return 0 if(pay_energy(50 * controlled_mobs.len)) move_all(T) - owner.adjust_instability(controlled_mobs.len) + adjust_instability(controlled_mobs.len) user << "You command your [controlled_mobs.len > 1 ? "entities" : "[controlled_mobs[1]]"] to move \ towards \the [T]." diff --git a/code/game/gamemodes/technomancer/spells/flame_tongue.dm b/code/game/gamemodes/technomancer/spells/flame_tongue.dm index 923cde0b9de..79e613aa0f1 100644 --- a/code/game/gamemodes/technomancer/spells/flame_tongue.dm +++ b/code/game/gamemodes/technomancer/spells/flame_tongue.dm @@ -46,7 +46,7 @@ visible_message("\The [user] reaches out towards \the [L] with the flaming hand, and they ignite!") L << "You ignite!" L.fire_act() - owner.adjust_instability(12) + adjust_instability(12) else //This is needed in order for the welder to work, and works similarly to grippers. welder.loc = user @@ -54,7 +54,7 @@ if(!resolved && welder && hit_atom) if(pay_energy(500)) welder.attack(hit_atom, user, def_zone) - owner.adjust_instability(4) + adjust_instability(4) if(welder && user && (welder.loc == user)) welder.loc = src else diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_burns.dm b/code/game/gamemodes/technomancer/spells/insert/mend_burns.dm index 6588f1617f9..ff6d3dfdd66 100644 --- a/code/game/gamemodes/technomancer/spells/insert/mend_burns.dm +++ b/code/game/gamemodes/technomancer/spells/insert/mend_burns.dm @@ -1,7 +1,6 @@ /datum/technomancer/spell/mend_burns name = "Mend Burns" - desc = "Heals minor burns, such as from exposure to flame, electric shock, or lasers. \ - Instability is split between the target and technomancer, if seperate." + desc = "Heals minor burns, such as from exposure to flame, electric shock, or lasers." cost = 50 obj_path = /obj/item/weapon/spell/insert/mend_burns ability_icon_state = "tech_mendburns" @@ -20,10 +19,10 @@ spawn(1) if(ishuman(host)) var/mob/living/carbon/human/H = host + var/heal_power = host == origin ? 10 : 30 + origin.adjust_instability(10) for(var/i = 0, i<5,i++) if(H) - H.adjustFireLoss(-5) - H.adjust_instability(2.5) - origin.adjust_instability(2.5) - sleep(10) + H.adjustFireLoss(-heal_power / 5) + sleep(1 SECOND) on_expire() \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_metal.dm b/code/game/gamemodes/technomancer/spells/insert/mend_metal.dm index 7ad6976b54b..5b3f1bdc2b6 100644 --- a/code/game/gamemodes/technomancer/spells/insert/mend_metal.dm +++ b/code/game/gamemodes/technomancer/spells/insert/mend_metal.dm @@ -1,6 +1,6 @@ /datum/technomancer/spell/mend_metal name = "Mend Metal" - desc = "Restores integrity to external robotic components. Instability is split between the target and technomancer, if seperate." + desc = "Restores integrity to external robotic components." cost = 50 obj_path = /obj/item/weapon/spell/insert/mend_metal ability_icon_state = "tech_mendwounds" @@ -19,14 +19,13 @@ spawn(1) if(ishuman(host)) var/mob/living/carbon/human/H = host + var/heal_power = host == origin ? 10 : 30 + origin.adjust_instability(10) for(var/i = 0, i<5,i++) if(H) for(var/obj/item/organ/external/O in H.organs) if(O.robotic < ORGAN_ROBOT) // Robot parts only. continue - O.heal_damage(5, 0, internal = 1, robo_repair = 1) - - H.adjust_instability(2.5) - origin.adjust_instability(2.5) + O.heal_damage(heal_power / 5, 0, internal = 1, robo_repair = 1) sleep(1 SECOND) on_expire() \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm b/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm index a43bb7611d8..294393cbb40 100644 --- a/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm +++ b/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm @@ -1,15 +1,15 @@ /datum/technomancer/spell/mend_organs - name = "Mend Organs" - desc = "Heals the target's internal organs, both organic and robotic. Instability is split between the target \ - and technomancer, if seperate." - cost = 50 + name = "Great Mend Wounds" + desc = "Greatly heals the target's wounds, both external and internal. Restores internal organs to functioning states, even if \ + robotic, reforms bones, patches internal bleeding, and restores missing blood." + cost = 100 obj_path = /obj/item/weapon/spell/insert/mend_organs ability_icon_state = "tech_mendwounds" category = SUPPORT_SPELLS /obj/item/weapon/spell/insert/mend_organs - name = "mend organs" - desc = "Now nobody will ever need surgery." + name = "great mend wounds" + desc = "A walking medbay is now you!" icon_state = "mend_wounds" cast_methods = CAST_MELEE aspect = ASPECT_BIOMED @@ -20,13 +20,33 @@ spawn(1) if(ishuman(host)) var/mob/living/carbon/human/H = host + var/heal_power = host == origin ? 2 : 5 + origin.adjust_instability(15) + for(var/i = 0, i<5,i++) if(H) for(var/obj/item/organ/O in H.internal_organs) - if(O.damage > 0) - O.damage = max(O.damage - 1, 0) + if(O.damage > 0) // Fix internal damage + O.damage = max(O.damage - (heal_power / 5), 0) + if(O.damage <= 5 && O.organ_tag == O_EYES) // Fix eyes + H.sdisabilities &= ~BLIND + + for(var/obj/item/organ/external/O in H.organs) // Fix limbs + if(!O.robotic < ORGAN_ROBOT) // No robot parts for this. + continue + O.heal_damage(0, heal_power / 5, internal = 1, robo_repair = 0) + + for(var/obj/item/organ/E in H.bad_external_organs) // Fix bones + var/obj/item/organ/external/affected = E + if((affected.damage < affected.min_broken_damage * config.organ_health_multiplier) && (affected.status & ORGAN_BROKEN)) + affected.status &= ~ORGAN_BROKEN + + for(var/datum/wound/W in affected.wounds) // Fix IB + if(istype(W, /datum/wound/internal_bleeding)) + affected.wounds -= W + affected.update_damages() + + H.restore_blood() // Fix bloodloss - H.adjust_instability(2.5) - origin.adjust_instability(2.5) sleep(1 SECOND) on_expire() \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_wires.dm b/code/game/gamemodes/technomancer/spells/insert/mend_wires.dm index fbafb7c0447..089a02152c0 100644 --- a/code/game/gamemodes/technomancer/spells/insert/mend_wires.dm +++ b/code/game/gamemodes/technomancer/spells/insert/mend_wires.dm @@ -1,7 +1,6 @@ /datum/technomancer/spell/mend_wires name = "Mend Wires" - desc = "Binds the internal wiring of robotic limbs and components over time. \ - Instability is split between the target and technomancer, if seperate." + desc = "Binds the internal wiring of robotic limbs and components over time." cost = 50 obj_path = /obj/item/weapon/spell/insert/mend_wires ability_icon_state = "tech_mendwounds" @@ -20,14 +19,13 @@ spawn(1) if(ishuman(host)) var/mob/living/carbon/human/H = host + var/heal_power = host == origin ? 10 : 30 + origin.adjust_instability(10) for(var/i = 0, i<5,i++) if(H) for(var/obj/item/organ/external/O in H.organs) if(O.robotic < ORGAN_ROBOT) // Robot parts only. continue - O.heal_damage(0, 5, internal = 1, robo_repair = 1) - - H.adjust_instability(2.5) - origin.adjust_instability(2.5) - sleep(10) + O.heal_damage(0, heal_power / 5, internal = 1, robo_repair = 1) + sleep(1 SECOND) on_expire() \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm b/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm index c1c507b5528..60e334cb390 100644 --- a/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm +++ b/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm @@ -20,10 +20,10 @@ spawn(1) if(ishuman(host)) var/mob/living/carbon/human/H = host + var/heal_power = host == origin ? 10 : 30 + origin.adjust_instability(10) for(var/i = 0, i<5,i++) if(H) - H.adjustBruteLoss(-5) - H.adjust_instability(2.5) - origin.adjust_instability(2.5) + H.adjustBruteLoss(-heal_power / 5) sleep(1 SECOND) on_expire() diff --git a/code/game/gamemodes/technomancer/spells/insert/purify.dm b/code/game/gamemodes/technomancer/spells/insert/purify.dm index 7ca94f78e61..dc0003f8028 100644 --- a/code/game/gamemodes/technomancer/spells/insert/purify.dm +++ b/code/game/gamemodes/technomancer/spells/insert/purify.dm @@ -1,7 +1,6 @@ /datum/technomancer/spell/purify name = "Purify" - desc = "Clenses the body of harmful impurities, such as toxins, radiation, viruses, genetic damage, and such. \ - Instability is split between the target and technomancer, if seperate." + desc = "Clenses the body of harmful impurities, such as toxins, radiation, viruses, genetic damage, and such." cost = 25 obj_path = /obj/item/weapon/spell/insert/purify ability_icon_state = "tech_purify" @@ -24,12 +23,12 @@ H.disabilities = 0 // for(var/datum/disease/D in H.viruses) // D.cure() + var/heal_power = host == origin ? 10 : 30 + origin.adjust_instability(10) for(var/i = 0, i<5,i++) if(H) - H.adjustToxLoss(-5) - H.adjustCloneLoss(-5) - H.radiation = max(host.radiation - 10, 0) - H.adjust_instability(2.5) - origin.adjust_instability(2.5) + H.adjustToxLoss(-heal_power / 5) + H.adjustCloneLoss(-heal_power / 5) + H.radiation = max(host.radiation - ( (heal_power * 2) / 5), 0) sleep(1 SECOND) on_expire() diff --git a/code/game/gamemodes/technomancer/spells/instability_tap.dm b/code/game/gamemodes/technomancer/spells/instability_tap.dm index 8ad52f3b3f1..ea1e9ff2e46 100644 --- a/code/game/gamemodes/technomancer/spells/instability_tap.dm +++ b/code/game/gamemodes/technomancer/spells/instability_tap.dm @@ -20,8 +20,8 @@ /obj/item/weapon/spell/instability_tap/on_use_cast(mob/user) if(check_for_scepter()) core.give_energy(7500) - owner.adjust_instability(40) + adjust_instability(40) else core.give_energy(5000) - owner.adjust_instability(50) + adjust_instability(50) qdel(src) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/mark_recall.dm b/code/game/gamemodes/technomancer/spells/mark_recall.dm index 528b8600946..e47b62c031b 100644 --- a/code/game/gamemodes/technomancer/spells/mark_recall.dm +++ b/code/game/gamemodes/technomancer/spells/mark_recall.dm @@ -37,7 +37,7 @@ else mark_spell_ref.forceMove(get_turf(user)) user << "Your mark is moved from its old position to \the [get_turf(user)] under you." - owner.adjust_instability(5) + adjust_instability(5) return 1 else user << "You can't afford the energy cost!" @@ -99,7 +99,7 @@ playsound(old_turf, 'sound/effects/sparks2.ogg', 50, 1) - owner.adjust_instability(25) + adjust_instability(25) qdel(src) return 1 else diff --git a/code/game/gamemodes/technomancer/spells/oxygenate.dm b/code/game/gamemodes/technomancer/spells/oxygenate.dm index f1edc635c15..67451c8c39f 100644 --- a/code/game/gamemodes/technomancer/spells/oxygenate.dm +++ b/code/game/gamemodes/technomancer/spells/oxygenate.dm @@ -20,7 +20,7 @@ var/mob/living/carbon/human/H = hit_atom if(pay_energy(1500)) H.adjustOxyLoss(-35) - owner.adjust_instability(10) + adjust_instability(10) return else if(isturf(hit_atom)) var/turf/T = hit_atom @@ -28,4 +28,4 @@ T.assume_gas("oxygen", 200) T.assume_gas("nitrogen", 800) playsound(src.loc, 'sound/effects/spray.ogg', 50, 1, -3) - owner.adjust_instability(10) \ No newline at end of file + adjust_instability(10) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/phase_shift.dm b/code/game/gamemodes/technomancer/spells/phase_shift.dm index a571d6789d3..02cbb6e2bfb 100644 --- a/code/game/gamemodes/technomancer/spells/phase_shift.dm +++ b/code/game/gamemodes/technomancer/spells/phase_shift.dm @@ -15,6 +15,7 @@ /obj/item/weapon/spell/phase_shift/New() ..() set_light(3, 2, l_color = "#FA58F4") + processing_objects |= src /obj/effect/phase_shift name = "rift" @@ -32,8 +33,13 @@ /obj/effect/phase_shift/Destroy() for(var/atom/movable/AM in contents) //Eject everything out. AM.forceMove(get_turf(src)) + processing_objects -= src ..() +/obj/effect/phase_shift/process() + for(var/mob/living/L in contents) + L.adjust_instability(2) + /obj/effect/phase_shift/relaymove(mob/user as mob) if(user.stat) return diff --git a/code/game/gamemodes/technomancer/spells/projectile/overload.dm b/code/game/gamemodes/technomancer/spells/projectile/overload.dm index 90bf50e7d6b..de4506924d1 100644 --- a/code/game/gamemodes/technomancer/spells/projectile/overload.dm +++ b/code/game/gamemodes/technomancer/spells/projectile/overload.dm @@ -36,7 +36,7 @@ P.damage = round(energy_before_firing * 0.004) // 4% of their current energy pool. else P.damage = round(energy_before_firing * 0.003) // 3% of their current energy pool. - owner.adjust_instability(instability_per_shot) + adjust_instability(instability_per_shot) return 1 diff --git a/code/game/gamemodes/technomancer/spells/projectile/projectile.dm b/code/game/gamemodes/technomancer/spells/projectile/projectile.dm index ea2f0db4e32..3c9fe6017c4 100644 --- a/code/game/gamemodes/technomancer/spells/projectile/projectile.dm +++ b/code/game/gamemodes/technomancer/spells/projectile/projectile.dm @@ -13,9 +13,10 @@ if(set_up(hit_atom, user)) var/obj/item/projectile/new_projectile = new spell_projectile(get_turf(user)) new_projectile.launch(hit_atom) + log_and_message_admins("has casted [src] at \the [hit_atom].") if(fire_sound) playsound(get_turf(src), fire_sound, 75, 1) - owner.adjust_instability(instability_per_shot) + adjust_instability(instability_per_shot) return 1 return 0 @@ -28,5 +29,8 @@ user.Stun(pre_shot_delay / 10) sleep(pre_shot_delay) qdel(target_image) - return 1 - return 0 \ No newline at end of file + if(owner) + return TRUE + return FALSE // We got dropped before the firing occured. + return TRUE // No delay, no need to check. + return FALSE \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/radiance.dm b/code/game/gamemodes/technomancer/spells/radiance.dm index 7cd76941221..d94b0641974 100644 --- a/code/game/gamemodes/technomancer/spells/radiance.dm +++ b/code/game/gamemodes/technomancer/spells/radiance.dm @@ -42,4 +42,4 @@ var/radius = max(get_dist(L, src), 1) var/rads = (power / 10) * ( 1 / (radius**2) ) L.apply_effect(rads, IRRADIATE) - owner.adjust_instability(2) + adjust_instability(2) diff --git a/code/game/gamemodes/technomancer/spells/resurrect.dm b/code/game/gamemodes/technomancer/spells/resurrect.dm index dcdcbb1f187..8d7eca33935 100644 --- a/code/game/gamemodes/technomancer/spells/resurrect.dm +++ b/code/game/gamemodes/technomancer/spells/resurrect.dm @@ -37,7 +37,7 @@ dead_mob_list -= SM living_mob_list += SM SM.icon_state = SM.icon_living - owner.adjust_instability(30) + adjust_instability(30) else if(ishuman(L)) var/mob/living/carbon/human/H = L @@ -57,7 +57,7 @@ H.timeofdeath = null visible_message("\The [H]'s eyes open!") user << "It's alive!" - owner.adjust_instability(100) + adjust_instability(100) else user << "The body of \the [H] doesn't seem to respond, perhaps you could try again?" - owner.adjust_instability(10) \ No newline at end of file + adjust_instability(10) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/shared_burden.dm b/code/game/gamemodes/technomancer/spells/shared_burden.dm index 95523d99ff7..7c3e7447a81 100644 --- a/code/game/gamemodes/technomancer/spells/shared_burden.dm +++ b/code/game/gamemodes/technomancer/spells/shared_burden.dm @@ -24,5 +24,5 @@ if(pay_energy(500)) var/instability_to_drain = min(H.instability, 25) user << "You draw instability away from \the [H] and towards you." - owner.adjust_instability(instability_to_drain) + adjust_instability(instability_to_drain) H.adjust_instability(-instability_to_drain) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/spawner/darkness.dm b/code/game/gamemodes/technomancer/spells/spawner/darkness.dm index ecb18b34815..eafb167dd42 100644 --- a/code/game/gamemodes/technomancer/spells/spawner/darkness.dm +++ b/code/game/gamemodes/technomancer/spells/spawner/darkness.dm @@ -15,7 +15,7 @@ /obj/item/weapon/spell/spawner/darkness/on_ranged_cast(atom/hit_atom, mob/user) if(pay_energy(500)) - owner.adjust_instability(4) + adjust_instability(4) ..() /obj/item/weapon/spell/spawner/darkness/New() diff --git a/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm b/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm index 50ed504b40a..1890bfd320b 100644 --- a/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm +++ b/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm @@ -16,7 +16,7 @@ /obj/item/weapon/spell/spawner/fire_blast/on_ranged_cast(atom/hit_atom, mob/user) if(pay_energy(2000)) - owner.adjust_instability(12) + adjust_instability(12) ..() // Makes the booms happen. /obj/effect/temporary_effect/fire_blast diff --git a/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm b/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm index c1b016116af..78711b29424 100644 --- a/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm +++ b/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm @@ -19,7 +19,7 @@ /obj/item/weapon/spell/spawner/pulsar/on_ranged_cast(atom/hit_atom, mob/user) if(pay_energy(4000)) - owner.adjust_instability(8) + adjust_instability(8) ..() /obj/item/weapon/spell/spawner/pulsar/on_throw_cast(atom/hit_atom, mob/user) diff --git a/code/game/gamemodes/technomancer/spells/summon/summon.dm b/code/game/gamemodes/technomancer/spells/summon/summon.dm index 4565dcd816c..01321c8cb0f 100644 --- a/code/game/gamemodes/technomancer/spells/summon/summon.dm +++ b/code/game/gamemodes/technomancer/spells/summon/summon.dm @@ -19,16 +19,17 @@ E.icon_state = "anom" sleep(5 SECONDS) qdel(E) - var/mob/living/L = new summoned_mob_type(T) - core.summoned_mobs |= L - L.summoned = 1 - var/image/summon_underlay = image('icons/obj/objects.dmi',"anom") - summon_underlay.alpha = 127 - L.underlays |= summon_underlay - on_summon(L) - user << "You've successfully teleported \a [L] to you!" - visible_message("\A [L] appears from no-where!") - user.adjust_instability(instability_cost) + if(owner) // We might've been dropped. + var/mob/living/L = new summoned_mob_type(T) + core.summoned_mobs |= L + L.summoned = 1 + var/image/summon_underlay = image('icons/obj/objects.dmi',"anom") + summon_underlay.alpha = 127 + L.underlays |= summon_underlay + on_summon(L) + user << "You've successfully teleported \a [L] to you!" + visible_message("\A [L] appears from no-where!") + user.adjust_instability(instability_cost) /obj/item/weapon/spell/summon/on_use_cast(mob/living/user) if(summon_options.len) diff --git a/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm b/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm index e4154eddf2d..f6b6b87dfe0 100644 --- a/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm +++ b/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm @@ -32,15 +32,24 @@ response_help = "pets the" response_disarm = "swats away" response_harm = "punches" + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + maxbodytemp = 0 + unsuitable_atoms_damage = 0 + heat_damage_per_tick = 0 + cold_damage_per_tick = 0 + var/true_sight = 0 // If true, detects more than what the Technomancer normally can't. var/mob/living/carbon/human/creator = null var/list/seen_mobs = list() -/mob/living/simple_animal/ward/New() - ..() - spawn(6 MINUTES) - expire() - /mob/living/simple_animal/ward/death() if(creator) creator << "Your ward inside [get_area(src)] was killed!" diff --git a/code/game/gamemodes/technomancer/spells/warp_strike.dm b/code/game/gamemodes/technomancer/spells/warp_strike.dm index 11b3ba032e6..539277031f0 100644 --- a/code/game/gamemodes/technomancer/spells/warp_strike.dm +++ b/code/game/gamemodes/technomancer/spells/warp_strike.dm @@ -49,7 +49,7 @@ var/new_dir = get_dir(user, chosen_target) user.dir = new_dir sparks.start() - owner.adjust_instability(12) + adjust_instability(12) //Finally, we handle striking the victim with whatever's in the user's offhand. var/obj/item/I = user.get_inactive_hand() diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 26fe14d7d1d..9dacf9924c4 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -11,6 +11,7 @@ clamp_values() handle_regular_status_updates() handle_actions() + handle_instability() if(client) handle_regular_hud_updates() diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index ef6b1c7872b..d2bd9210bbe 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -76,17 +76,16 @@ return //immune /mob/living/silicon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0) - - if (istype(source, /obj/machinery/containment_field)) + if(shock_damage > 0) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(5, 1, loc) s.start() shock_damage *= 0.75 //take reduced damage take_overall_damage(0, shock_damage) - visible_message("\red [src] was shocked by \the [source]!", \ - "\red Energy pulse detected, system damaged!", \ - "\red You hear an electrical crack") + visible_message("[src] was shocked by \the [source]!", \ + "Energy pulse detected, system damaged!", \ + "You hear an electrical crack.") if(prob(20)) Stun(2) return diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 3971b90df5a..ae9622d3050 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -398,6 +398,9 @@ /mob/living/simple_animal/adjustBruteLoss(damage) health = Clamp(health - damage, 0, maxHealth) +/mob/living/simple_animal/adjustFireLoss(damage) + health = Clamp(health - damage, 0, maxHealth) + /mob/living/simple_animal/proc/SA_attackable(target_mob) if (isliving(target_mob)) var/mob/living/L = target_mob @@ -636,4 +639,16 @@ if(!target_mob || enroute) spawn(10) if(!src.stat) - horde() \ No newline at end of file + horde() + +/mob/living/simple_animal/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/def_zone = null) + shock_damage *= siemens_coeff + if (shock_damage < 1) + return 0 + + adjustFireLoss(shock_damage) + playsound(loc, "sparks", 50, 1, -1) + + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, loc) + s.start() \ No newline at end of file