mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 10:12:45 +00:00
Adds ability to sort the spells section of the catalog into categories. The categories available are 'All', 'Offensive', 'Defensive', 'Utility', and 'Support'. Removes preset section on catalog as it was unused. Projectile spells now have a sound when fired. Haste lasts five seconds instead of three. Repel Missiles lasts for five minutes instead of two. All healing spells work five times as fast, healing in five seconds instead of twenty five seconds. The amount of instability and healing done has been multiplied to remain consistent. Passwall can now be used on more than just walls, if there's something dense on the same tile. Force Missile is now 25% cheaper to cast, and has a cooldown of .5 seconds instead of one second, and does 5 more damage. Beam's damage is increased by 10, and energy cost decreased by 25%. Lightning's warm-up time is now one second instead of two. Overload now costs 10% of total energy instead of 15%, and damage scaled with 4% of their current energy reserves, and 5% with the Scepter, instead of 3%/4%. Additionally, instability per shot is lowered to 12 from 15. Track now costs 25 points instead of 30 in the catalog, because roundness. Fire Aura should look more impressive without a Scepter. Fixes bug where shooting Lightning made you motionless for twenty seconds.
216 lines
7.9 KiB
Plaintext
216 lines
7.9 KiB
Plaintext
/mob/living
|
|
var/instability = 0
|
|
var/last_instability_event = null // most recent world.time that something bad happened due to instability.
|
|
|
|
// Proc: adjust_instability()
|
|
// Parameters: 0
|
|
// Description: Does nothing, because inheritence.
|
|
/mob/living/proc/adjust_instability()
|
|
return
|
|
|
|
// 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
|
|
// Description: Sets the HUD icon to the correct state.
|
|
/mob/living/carbon/human/proc/instability_update_hud()
|
|
if(client && hud_used)
|
|
switch(instability)
|
|
if(0 to 10)
|
|
wiz_instability_display.icon_state = "instability-1"
|
|
if(11 to 30)
|
|
wiz_instability_display.icon_state = "instability0"
|
|
if(31 to 50)
|
|
wiz_instability_display.icon_state = "instability1"
|
|
if(51 to 100)
|
|
wiz_instability_display.icon_state = "instability2"
|
|
if(101 to 200)
|
|
wiz_instability_display.icon_state = "instability3"
|
|
|
|
// Proc: Life()
|
|
// Parameters: 0
|
|
// Description: Makes instability tick along with Life().
|
|
/mob/living/carbon/human/Life()
|
|
. = ..()
|
|
handle_instability()
|
|
|
|
// Proc: handle_instability()
|
|
// 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()
|
|
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()
|
|
switch(instability)
|
|
if(1 to 10)
|
|
adjust_instability(-2)
|
|
if(11 to 20)
|
|
adjust_instability(-4)
|
|
if(21 to 30)
|
|
adjust_instability(-6)
|
|
if(31 to 40)
|
|
adjust_instability(-8)
|
|
if(41 to 50)
|
|
adjust_instability(-10)
|
|
if(51 to 100)
|
|
adjust_instability(-20)
|
|
if(101 to 200)
|
|
adjust_instability(-40)
|
|
|
|
/*
|
|
[16:18:08] <PsiOmegaDelta> Sparks
|
|
[16:18:10] <PsiOmegaDelta> Wormholes
|
|
[16:18:16] <PsiOmegaDelta> Random spells firing off on their own
|
|
[16:18:22] <PsiOmegaDelta> The possibilities are endless
|
|
[16:19:00] <PsiOmegaDelta> Random objects phasing into reality, only to disappear again
|
|
[16:19:05] <PsiOmegaDelta> Things briefly duplicating
|
|
[16:20:56] <PsiOmegaDelta> Glass cracking, eventually breaking
|
|
*/
|
|
// Proc: instability_effects()
|
|
// 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()
|
|
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)
|
|
// var/datum/effect/effect/system/spark_spread/spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
|
// spark_system.set_up(5, 0, get_turf(src))
|
|
// spark_system.attach(src)
|
|
sparks.start()
|
|
visible_message("<span class='warning'>Electrical sparks manifest from nowhere around \the [src]!</span>")
|
|
qdel(sparks)
|
|
if(1)
|
|
return
|
|
|
|
if(31 to 50) //Moderate
|
|
rng = rand(0,8)
|
|
switch(rng)
|
|
if(0)
|
|
apply_effect(instability * 0.5, IRRADIATE)
|
|
if(1)
|
|
return
|
|
// visible_message("<span class='warning'>\The [src] suddenly collapses!</span>",
|
|
// "<span class='danger'>You suddenly feel very weak, and you fall down!</span>")
|
|
// Weaken(instability * 0.1)
|
|
if(2)
|
|
if(can_feel_pain())
|
|
apply_effect(instability * 0.5, AGONY)
|
|
src << "<span class='danger'>You feel a sharp pain!</span>"
|
|
if(3)
|
|
apply_effect(instability * 0.5, EYE_BLUR)
|
|
src << "<span class='danger'>Your eyes start to get cloudy!</span>"
|
|
if(4)
|
|
electrocute_act(instability * 0.3, "unstable energies")
|
|
if(5)
|
|
adjustFireLoss(instability * 0.2) //10 burn @ 50 instability
|
|
src << "<span class='danger'>You feel your skin burn!</span>"
|
|
if(6)
|
|
adjustBruteLoss(instability * 0.2) //10 brute @ 50 instability
|
|
src << "<span class='danger'>You feel a sharp pain as an unseen force harms your body!</span>"
|
|
if(7)
|
|
adjustToxLoss(instability * 0.2) //10 tox @ 50 instability
|
|
if(8)
|
|
safe_blink(src, range = 6)
|
|
src << "<span class='warning'>You're teleported against your will!</span>"
|
|
|
|
if(51 to 100) //Severe
|
|
rng = rand(0,8)
|
|
switch(rng)
|
|
if(0)
|
|
apply_effect(instability * 0.7, IRRADIATE)
|
|
if(1)
|
|
// visible_message("<span class='warning'>\The [src] suddenly collapses!</span>",
|
|
// "<span class='danger'>You suddenly feel very light-headed, and faint!</span>")
|
|
// Paralyse(instability * 0.1)
|
|
return
|
|
if(2)
|
|
if(can_feel_pain())
|
|
apply_effect(instability * 0.7, AGONY)
|
|
src << "<span class='danger'>You feel an extremly angonizing pain from all over your body!</span>"
|
|
if(3)
|
|
apply_effect(instability * 0.5, EYE_BLUR)
|
|
src << "<span class='danger'>Your eyes start to get cloudy!</span>"
|
|
if(4)
|
|
electrocute_act(instability * 0.5, "extremely unstable energies")
|
|
if(5)
|
|
fire_act()
|
|
src << "<span class='danger'>You spontaneously combust!</span>"
|
|
if(6)
|
|
adjustCloneLoss(instability * 0.05) //5 cloneloss @ 100 instability
|
|
src << "<span class='danger'>You feel your body slowly degenerate.</span>"
|
|
if(7)
|
|
adjustToxLoss(instability * 0.25) //25 tox @ 100 instability
|
|
|
|
if(101 to 200) //Lethal
|
|
rng = rand(0,8)
|
|
switch(rng)
|
|
if(0)
|
|
apply_effect(instability, IRRADIATE)
|
|
if(1)
|
|
visible_message("<span class='warning'>\The [src] suddenly collapses!</span>",
|
|
"<span class='danger'>You suddenly feel very light-headed, and faint!</span>")
|
|
Paralyse(instability * 0.1)
|
|
if(2)
|
|
if(can_feel_pain())
|
|
apply_effect(instability, AGONY)
|
|
src << "<span class='danger'>You feel an extremly angonizing pain from all over your body!</span>"
|
|
if(3)
|
|
apply_effect(instability, EYE_BLUR)
|
|
src << "<span class='danger'>Your eyes start to get cloudy!</span>"
|
|
if(4)
|
|
electrocute_act(instability, "extremely unstable energies")
|
|
if(5)
|
|
fire_act()
|
|
src << "<span class='danger'>You spontaneously combust!</span>"
|
|
if(6)
|
|
adjustCloneLoss(instability * 0.10) //5 cloneloss @ 100 instability
|
|
src << "<span class='danger'>You feel your body slowly degenerate.</span>"
|
|
if(7)
|
|
adjustToxLoss(instability * 0.40) //25 tox @ 100 instability
|
|
|
|
/mob/living/carbon/human/proc/radiate_instability()
|
|
var/distance = round(sqrt(instability / 2))
|
|
if(instability <= 30)
|
|
distance = 0
|
|
if(distance)
|
|
for(var/mob/living/carbon/human/H in range(src, distance) )
|
|
if(H == src) // This instability is radiating away from them, so don't include them.
|
|
continue
|
|
var/radius = max(get_dist(H, src), 1)
|
|
// People next to the source take a third of the instability. Further distance decreases the amount absorbed.
|
|
var/outgoing_instability = (instability / 3) * ( 1 / (radius**2) )
|
|
|
|
// Energy armor like from the AMI RIG can protect from this.
|
|
var/armor = getarmor(null, "energy")
|
|
var/armor_factor = abs( (armor - 100) / 100)
|
|
outgoing_instability = outgoing_instability * armor_factor
|
|
H.adjust_instability(outgoing_instability)
|
|
|
|
set_light(distance, distance * 2, l_color = "#C26DDE")
|