mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
[READY]Aimable wizard lightning bolts (#23723)
* ZAP! * YOU DID NOT SEE THAT * YOU DI NOT SEE THAT 2 * object orientated pr * gdi * protection * object orientated pr v2 * REEEE * blacklists * Update magicarp.dm
This commit is contained in:
@@ -1112,7 +1112,7 @@
|
||||
special_role = null
|
||||
current << "<span class='userdanger'>Your infernal link has been severed! You are no longer a devil!</span>"
|
||||
RemoveSpell(/obj/effect/proc_holder/spell/targeted/infernal_jaunt)
|
||||
RemoveSpell(/obj/effect/proc_holder/spell/fireball/hellish)
|
||||
RemoveSpell(/obj/effect/proc_holder/spell/aimed/fireball/hellish)
|
||||
RemoveSpell(/obj/effect/proc_holder/spell/targeted/summon_contract)
|
||||
RemoveSpell(/obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork)
|
||||
RemoveSpell(/obj/effect/proc_holder/spell/targeted/conjure_item/violin)
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
switch(type)
|
||||
if("destruction")
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null))
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/fireball(null))
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball(null))
|
||||
M << "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball."
|
||||
if("bluespace")
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
|
||||
|
||||
@@ -310,7 +310,7 @@ var/global/list/lawlorify = list (
|
||||
|
||||
/datum/devilinfo/proc/give_base_spells(give_summon_contract = 0)
|
||||
remove_spells()
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/fireball/hellish(null))
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball/hellish(null))
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork(null))
|
||||
if(give_summon_contract)
|
||||
give_summon_contract()
|
||||
@@ -322,13 +322,13 @@ var/global/list/lawlorify = list (
|
||||
/datum/devilinfo/proc/give_lizard_spells()
|
||||
remove_spells()
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork(null))
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/fireball/hellish(null))
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball/hellish(null))
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/infernal_jaunt(null))
|
||||
|
||||
/datum/devilinfo/proc/give_true_spells()
|
||||
remove_spells()
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork/greater(null))
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/fireball/hellish(null))
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball/hellish(null))
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/infernal_jaunt(null))
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/sintouch(null))
|
||||
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
|
||||
/datum/spellbook_entry/fireball
|
||||
name = "Fireball"
|
||||
spell_type = /obj/effect/proc_holder/spell/fireball
|
||||
spell_type = /obj/effect/proc_holder/spell/aimed/fireball
|
||||
log_name = "FB"
|
||||
|
||||
/datum/spellbook_entry/rod_form
|
||||
@@ -222,10 +222,20 @@
|
||||
log_name = "LD"
|
||||
category = "Defensive"
|
||||
|
||||
/datum/spellbook_entry/teslablast
|
||||
name = "Tesla Blast"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/tesla
|
||||
log_name = "TB"
|
||||
|
||||
/datum/spellbook_entry/lightningbolt
|
||||
name = "Lightning Bolt"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/lightning
|
||||
spell_type = /obj/effect/proc_holder/spell/aimed/lightningbolt
|
||||
log_name = "LB"
|
||||
cost = 3
|
||||
|
||||
/datum/spellbook_entry/lightningbolt/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book) //return 1 on success
|
||||
. = ..()
|
||||
user.tesla_ignore = TRUE
|
||||
|
||||
/datum/spellbook_entry/infinite_guns
|
||||
name = "Lesser Summon Guns"
|
||||
@@ -778,7 +788,7 @@
|
||||
return
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/fireball
|
||||
spell = /obj/effect/proc_holder/spell/fireball
|
||||
spell = /obj/effect/proc_holder/spell/aimed/fireball
|
||||
spellname = "fireball"
|
||||
icon_state ="bookfireball"
|
||||
desc = "This book feels warm to the touch."
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
|
||||
wizmind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt)
|
||||
wizmind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile)
|
||||
wizmind.AddSpell(new /obj/effect/proc_holder/spell/fireball)
|
||||
wizmind.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball)
|
||||
|
||||
current_wizard = wizbody
|
||||
|
||||
|
||||
@@ -37,9 +37,12 @@
|
||||
projectilesound = 'sound/weapons/emitter.ogg'
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
|
||||
var/allowed_projectile_types = list(/obj/item/projectile/magic/change, /obj/item/projectile/magic/animate, /obj/item/projectile/magic/resurrection,
|
||||
/obj/item/projectile/magic/death, /obj/item/projectile/magic/teleport, /obj/item/projectile/magic/door, /obj/item/projectile/magic/aoe/fireball,
|
||||
/obj/item/projectile/magic/spellblade, /obj/item/projectile/magic/arcane_barrage)
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/ranged/New()
|
||||
projectiletype = pick(typesof(initial(projectiletype)))
|
||||
projectiletype = pick(allowed_projectile_types)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/ranged/chaos
|
||||
@@ -50,5 +53,5 @@
|
||||
health = 75
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/ranged/chaos/Shoot()
|
||||
projectiletype = pick(typesof(initial(projectiletype)))
|
||||
..()
|
||||
projectiletype = pick(allowed_projectile_types)
|
||||
..()
|
||||
|
||||
@@ -169,6 +169,8 @@
|
||||
..()
|
||||
|
||||
/mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, override = 0, tesla_shock = 0, illusion = 0)
|
||||
if(tesla_shock && tesla_ignore)
|
||||
return FALSE
|
||||
shock_damage *= siemens_coeff
|
||||
if(dna && dna.species)
|
||||
shock_damage *= dna.species.siemens_coeff
|
||||
|
||||
@@ -448,6 +448,8 @@
|
||||
if(S.siemens_coefficient <= 0)
|
||||
total_coeff -= 0.95
|
||||
siemens_coeff = total_coeff
|
||||
if(tesla_ignore)
|
||||
siemens_coeff = 0
|
||||
else if(!safety)
|
||||
var/gloves_siemens_coeff = 1
|
||||
if(gloves)
|
||||
|
||||
@@ -276,6 +276,8 @@
|
||||
|
||||
|
||||
/mob/living/proc/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0, illusion = 0)
|
||||
if(tesla_shock && tesla_ignore)
|
||||
return FALSE
|
||||
if(shock_damage > 0)
|
||||
if(!illusion)
|
||||
adjustFireLoss(shock_damage)
|
||||
|
||||
@@ -74,4 +74,5 @@
|
||||
|
||||
var/list/status_effects //a list of all status effects the mob has
|
||||
|
||||
var/list/implants = null
|
||||
var/list/implants = null
|
||||
var/tesla_ignore = FALSE
|
||||
@@ -526,7 +526,7 @@ Difficulty: Very Hard
|
||||
|
||||
/obj/machinery/anomalous_crystal/emitter/New()
|
||||
..()
|
||||
generated_projectile = pick(/obj/item/projectile/magic/fireball/infernal,/obj/item/projectile/magic/spellblade,
|
||||
generated_projectile = pick(/obj/item/projectile/magic/aoe/fireball/infernal,/obj/item/projectile/magic/aoe/lightning,/obj/item/projectile/magic/spellblade,
|
||||
/obj/item/projectile/bullet/meteorshot, /obj/item/projectile/beam/xray, /obj/item/projectile/colossus)
|
||||
|
||||
/obj/machinery/anomalous_crystal/emitter/ActivationReaction(mob/user, method)
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
loot = list(/obj/effect/mob_spawn/human/corpse/wizard,
|
||||
/obj/item/weapon/staff)
|
||||
|
||||
var/obj/effect/proc_holder/spell/fireball/fireball = null
|
||||
var/obj/effect/proc_holder/spell/aimed/fireball/fireball = null
|
||||
var/obj/effect/proc_holder/spell/targeted/turf_teleport/blink/blink = null
|
||||
var/obj/effect/proc_holder/spell/targeted/projectile/magic_missile/mm = null
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/wizard/New()
|
||||
..()
|
||||
fireball = new /obj/effect/proc_holder/spell/fireball
|
||||
fireball = new /obj/effect/proc_holder/spell/aimed/fireball
|
||||
fireball.clothes_req = 0
|
||||
fireball.human_req = 0
|
||||
fireball.player_lock = 0
|
||||
|
||||
@@ -292,7 +292,7 @@
|
||||
/obj/item/weapon/paper/contract/infernal/magic/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
|
||||
if(!istype(user) || !user.mind)
|
||||
return -1
|
||||
user.mind.AddSpell(new /obj/effect/proc_holder/spell/fireball(null))
|
||||
user.mind.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball(null))
|
||||
user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -203,7 +203,7 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
|
||||
else if(isliving(A))
|
||||
var/dist = get_dist(source, A)
|
||||
var/mob/living/L = A
|
||||
if(dist <= zap_range && (dist < closest_dist || !closest_mob) && L.stat != DEAD)
|
||||
if(dist <= zap_range && (dist < closest_dist || !closest_mob) && L.stat != DEAD && !L.tesla_ignore)
|
||||
closest_mob = L
|
||||
closest_atom = A
|
||||
closest_dist = dist
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
projectile_type = /obj/item/projectile/magic/door
|
||||
|
||||
/obj/item/ammo_casing/magic/fireball
|
||||
projectile_type = /obj/item/projectile/magic/fireball
|
||||
projectile_type = /obj/item/projectile/magic/aoe/fireball
|
||||
|
||||
/obj/item/ammo_casing/magic/chaos
|
||||
projectile_type = /obj/item/projectile/magic
|
||||
@@ -35,7 +35,6 @@
|
||||
projectile_type = /obj/item/projectile/magic/arcane_barrage
|
||||
|
||||
/obj/item/ammo_casing/magic/chaos/newshot()
|
||||
projectile_type = pick(typesof(/obj/item/projectile/magic))
|
||||
..()
|
||||
|
||||
/obj/item/ammo_casing/magic/honk
|
||||
|
||||
@@ -38,6 +38,13 @@
|
||||
max_charges = 10
|
||||
recharge_rate = 2
|
||||
no_den_usage = 1
|
||||
var/allowed_projectile_types = list(/obj/item/projectile/magic/change, /obj/item/projectile/magic/animate, /obj/item/projectile/magic/resurrection,
|
||||
/obj/item/projectile/magic/death, /obj/item/projectile/magic/teleport, /obj/item/projectile/magic/door, /obj/item/projectile/magic/aoe/fireball,
|
||||
/obj/item/projectile/magic/spellblade, /obj/item/projectile/magic/arcane_barrage)
|
||||
|
||||
/obj/item/weapon/gun/magic/staff/chaos/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, message = 1, params, zone_override, bonus_spread = 0)
|
||||
chambered.projectile_type = pick(allowed_projectile_types)
|
||||
. = ..(target, user, message, params, zone_override, bonus_spread)
|
||||
|
||||
/obj/item/weapon/gun/magic/staff/door
|
||||
name = "staff of door creation"
|
||||
|
||||
@@ -17,53 +17,6 @@
|
||||
var/mob/M = target
|
||||
M.death(0)
|
||||
|
||||
/obj/item/projectile/magic/fireball
|
||||
name = "bolt of fireball"
|
||||
icon_state = "fireball"
|
||||
damage = 10
|
||||
damage_type = BRUTE
|
||||
nodamage = 0
|
||||
|
||||
//explosion values
|
||||
var/exp_heavy = 0
|
||||
var/exp_light = 2
|
||||
var/exp_flash = 3
|
||||
var/exp_fire = 2
|
||||
|
||||
/obj/item/projectile/magic/fireball/Range()
|
||||
var/turf/T1 = get_step(src,turn(dir, -45))
|
||||
var/turf/T2 = get_step(src,turn(dir, 45))
|
||||
var/turf/T3 = get_step(src,dir)
|
||||
var/mob/living/L = locate(/mob/living) in T1 //if there's a mob alive in our front right diagonal, we hit it.
|
||||
if(L && L.stat != DEAD)
|
||||
Bump(L,1) //Magic Bullet #teachthecontroversy
|
||||
return
|
||||
L = locate(/mob/living) in T2
|
||||
if(L && L.stat != DEAD)
|
||||
Bump(L,1)
|
||||
return
|
||||
L = locate(/mob/living) in T3
|
||||
if(L && L.stat != DEAD)
|
||||
Bump(L,1)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/projectile/magic/fireball/on_hit(target)
|
||||
. = ..()
|
||||
var/turf/T = get_turf(target)
|
||||
explosion(T, -1, exp_heavy, exp_light, exp_flash, 0, flame_range = exp_fire)
|
||||
if(ismob(target)) //multiple flavors of pain
|
||||
var/mob/living/M = target
|
||||
M.take_overall_damage(0,10) //between this 10 burn, the 10 brute, the explosion brute, and the onfire burn, your at about 65 damage if you stop drop and roll immediately
|
||||
|
||||
/obj/item/projectile/magic/fireball/infernal
|
||||
name = "infernal fireball"
|
||||
exp_heavy = -1
|
||||
exp_light = -1
|
||||
exp_flash = 4
|
||||
exp_fire= 5
|
||||
|
||||
|
||||
/obj/item/projectile/magic/resurrection
|
||||
name = "bolt of resurrection"
|
||||
icon_state = "ion"
|
||||
@@ -387,3 +340,85 @@
|
||||
nodamage = 0
|
||||
armour_penetration = 0
|
||||
flag = "magic"
|
||||
|
||||
/obj/item/projectile/magic/aoe
|
||||
name = "Area Bolt"
|
||||
desc = "What the fuck does this do?!"
|
||||
damage = 0
|
||||
var/proxdet = TRUE
|
||||
|
||||
/obj/item/projectile/magic/aoe/Range()
|
||||
if(proxdet)
|
||||
var/turf/T1 = get_step(src,turn(dir, -45))
|
||||
var/turf/T2 = get_step(src,turn(dir, 45))
|
||||
var/turf/T3 = get_step(src,dir)
|
||||
var/mob/living/L = locate(/mob/living) in T1 //if there's a mob alive in our front right diagonal, we hit it.
|
||||
if(L && L.stat != DEAD)
|
||||
Bump(L,1) //Magic Bullet #teachthecontroversy
|
||||
return
|
||||
L = locate(/mob/living) in T2
|
||||
if(L && L.stat != DEAD)
|
||||
Bump(L,1)
|
||||
return
|
||||
L = locate(/mob/living) in T3
|
||||
if(L && L.stat != DEAD)
|
||||
Bump(L,1)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/projectile/magic/aoe/lightning
|
||||
name = "lightning bolt"
|
||||
icon_state = "tesla_projectile" //Better sprites are REALLY needed and appreciated!~
|
||||
damage = 15
|
||||
damage_type = BURN
|
||||
nodamage = 0
|
||||
speed = 0.3
|
||||
flag = "magic"
|
||||
|
||||
var/tesla_power = 20000
|
||||
var/tesla_range = 15
|
||||
var/tesla_boom = FALSE
|
||||
var/chain
|
||||
var/mob/living/caster
|
||||
|
||||
/obj/item/projectile/magic/aoe/lightning/fire(setAngle)
|
||||
if(caster)
|
||||
chain = caster.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY)
|
||||
..()
|
||||
|
||||
/obj/item/projectile/magic/aoe/lightning/on_hit(target)
|
||||
. = ..()
|
||||
tesla_zap(src, tesla_range, tesla_power, tesla_boom)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/projectile/magic/aoe/lightning/Destroy()
|
||||
qdel(chain)
|
||||
. = ..()
|
||||
|
||||
/obj/item/projectile/magic/aoe/fireball
|
||||
name = "bolt of fireball"
|
||||
icon_state = "fireball"
|
||||
damage = 10
|
||||
damage_type = BRUTE
|
||||
nodamage = 0
|
||||
|
||||
//explosion values
|
||||
var/exp_heavy = 0
|
||||
var/exp_light = 2
|
||||
var/exp_flash = 3
|
||||
var/exp_fire = 2
|
||||
|
||||
/obj/item/projectile/magic/aoe/fireball/on_hit(target)
|
||||
. = ..()
|
||||
var/turf/T = get_turf(target)
|
||||
explosion(T, -1, exp_heavy, exp_light, exp_flash, 0, flame_range = exp_fire)
|
||||
if(ismob(target)) //multiple flavors of pain
|
||||
var/mob/living/M = target
|
||||
M.take_overall_damage(0,10) //between this 10 burn, the 10 brute, the explosion brute, and the onfire burn, your at about 65 damage if you stop drop and roll immediately
|
||||
|
||||
/obj/item/projectile/magic/aoe/fireball/infernal
|
||||
name = "infernal fireball"
|
||||
exp_heavy = -1
|
||||
exp_light = -1
|
||||
exp_flash = 4
|
||||
exp_fire= 5
|
||||
|
||||
@@ -344,7 +344,7 @@
|
||||
if(MT)
|
||||
visible_message("<span class='danger'>[src] dangerously overheats, launching a flaming fuel orb!</span>")
|
||||
investigate_log("Experimentor has launched a <font color='red'>fireball</font> at [M]!", "experimentor")
|
||||
var/obj/item/projectile/magic/fireball/FB = new /obj/item/projectile/magic/fireball(start)
|
||||
var/obj/item/projectile/magic/aoe/fireball/FB = new /obj/item/projectile/magic/aoe/fireball(start)
|
||||
FB.original = MT
|
||||
FB.current = start
|
||||
FB.yo = MT.y - start.y
|
||||
|
||||
105
code/modules/spells/spell_types/aimed.dm
Normal file
105
code/modules/spells/spell_types/aimed.dm
Normal file
@@ -0,0 +1,105 @@
|
||||
|
||||
/obj/effect/proc_holder/spell/aimed
|
||||
name = "aimed projectile spell"
|
||||
var/projectile_type = /obj/item/projectile/magic/teleport
|
||||
var/deactive_msg = "You discharge your projectile..."
|
||||
var/active_msg = "You charge your projectile!"
|
||||
var/base_icon_state = "projectile"
|
||||
var/active_icon_state = "projectile"
|
||||
|
||||
/obj/effect/proc_holder/spell/aimed/Click()
|
||||
var/mob/living/user = usr
|
||||
if(!istype(user))
|
||||
return
|
||||
var/msg
|
||||
if(!can_cast(user))
|
||||
msg = "<span class='warning'>You can no longer cast [name]!</span>"
|
||||
remove_ranged_ability(msg)
|
||||
return
|
||||
if(active)
|
||||
msg = "<span class='notice'>[deactive_msg]</span>"
|
||||
remove_ranged_ability(msg)
|
||||
else
|
||||
msg = "<span class='notice'>[active_msg]<B>Left-click to shoot it at a target!</B></span>"
|
||||
add_ranged_ability(user, msg, TRUE)
|
||||
|
||||
/obj/effect/proc_holder/spell/aimed/update_icon()
|
||||
if(!action)
|
||||
return
|
||||
action.button_icon_state = "[base_icon_state][active]"
|
||||
action.UpdateButtonIcon()
|
||||
|
||||
/obj/effect/proc_holder/spell/aimed/InterceptClickOn(mob/living/caller, params, atom/target)
|
||||
if(..())
|
||||
return FALSE
|
||||
if(!cast_check(0, ranged_ability_user))
|
||||
remove_ranged_ability()
|
||||
return FALSE
|
||||
var/list/targets = list(target)
|
||||
perform(targets,user = ranged_ability_user)
|
||||
return TRUE
|
||||
|
||||
/obj/effect/proc_holder/spell/aimed/cast(list/targets, mob/living/user)
|
||||
var/target = targets[1]
|
||||
var/turf/T = user.loc
|
||||
var/turf/U = get_step(user, user.dir) // Get the tile infront of the move, based on their direction
|
||||
if(!isturf(U) || !isturf(T))
|
||||
return FALSE
|
||||
fire_projectile(user, target)
|
||||
user.newtonian_move(get_dir(U, T))
|
||||
remove_ranged_ability() //Auto-disable the ability once successfully performed
|
||||
return TRUE
|
||||
|
||||
/obj/effect/proc_holder/spell/aimed/proc/fire_projectile(mob/living/user, atom/target)
|
||||
var/obj/item/projectile/P = new projectile_type(user.loc)
|
||||
P.current = get_turf(user)
|
||||
P.preparePixelProjectile(target, get_turf(target), user)
|
||||
P.fire()
|
||||
return TRUE
|
||||
|
||||
/obj/effect/proc_holder/spell/aimed/lightningbolt
|
||||
name = "Lightning Bolt"
|
||||
desc = "Fire a high powered lightning bolt at your foes!"
|
||||
school = "evocation"
|
||||
charge_max = 200
|
||||
clothes_req = 1
|
||||
invocation = "UN'LTD P'WAH"
|
||||
invocation_type = "shout"
|
||||
cooldown_min = 30
|
||||
active_icon_state = "lightning"
|
||||
base_icon_state = "lightning"
|
||||
sound = 'sound/magic/lightningbolt.ogg'
|
||||
active = FALSE
|
||||
var/tesla_range = 15
|
||||
var/tesla_power = 20000
|
||||
var/tesla_boom = FALSE
|
||||
active_msg = "You energize your hand with arcane lightning!"
|
||||
deactive_msg = "You let the energy flow out of your hands back into yourself..."
|
||||
|
||||
/obj/effect/proc_holder/spell/aimed/lightningbolt/fire_projectile(mob/living/user, atom/target)
|
||||
var/obj/item/projectile/magic/aoe/lightning/P = new /obj/item/projectile/magic/aoe/lightning(user.loc)
|
||||
P.current = get_turf(user)
|
||||
P.preparePixelProjectile(target, get_turf(target), user)
|
||||
P.tesla_power = tesla_power
|
||||
P.tesla_range = tesla_range
|
||||
P.tesla_boom = tesla_boom
|
||||
P.fire()
|
||||
return TRUE
|
||||
|
||||
/obj/effect/proc_holder/spell/aimed/fireball
|
||||
name = "Fireball"
|
||||
desc = "This spell fires a fireball at a target and does not require wizard garb."
|
||||
school = "evocation"
|
||||
charge_max = 60
|
||||
clothes_req = 0
|
||||
invocation = "ONI SOMA"
|
||||
invocation_type = "shout"
|
||||
range = 20
|
||||
cooldown_min = 20 //10 deciseconds reduction per rank
|
||||
projectile_type = /obj/item/projectile/magic/aoe/fireball
|
||||
base_icon_state = "fireball"
|
||||
action_icon_state = "fireball0"
|
||||
sound = "sound/magic/Fireball.ogg"
|
||||
active_msg = "You prepare to cast your fireball spell!"
|
||||
deactive_msg = "You extinguish your fireball... for now."
|
||||
active = FALSE
|
||||
@@ -69,7 +69,7 @@
|
||||
user << "<span class='notice'>[C] seems to not be sentient. You cannot summon a contract for [C.p_them()].</span>"
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/fireball/hellish
|
||||
/obj/effect/proc_holder/spell/aimed/fireball/hellish
|
||||
name = "Hellfire"
|
||||
desc = "This spell launches hellfire at the target."
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
invocation_type = "shout"
|
||||
range = 2
|
||||
|
||||
fireball_type = /obj/item/projectile/magic/fireball/infernal
|
||||
projectile_type = /obj/item/projectile/magic/aoe/fireball/infernal
|
||||
|
||||
action_background_icon_state = "bg_demon"
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/effect/proc_holder/spell/targeted/lightning
|
||||
name = "Lightning Bolt"
|
||||
desc = "Charges up and throws a lightning bolt at nearby enemies. Classic."
|
||||
/obj/effect/proc_holder/spell/targeted/tesla
|
||||
name = "Tesla Blast"
|
||||
desc = "Blast lightning at your foes!"
|
||||
charge_type = "recharge"
|
||||
charge_max = 300
|
||||
clothes_req = 1
|
||||
@@ -16,12 +16,12 @@
|
||||
|
||||
action_icon_state = "lightning"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/lightning/Click()
|
||||
/obj/effect/proc_holder/spell/targeted/tesla/Click()
|
||||
if(!ready && cast_check())
|
||||
StartChargeup()
|
||||
return 1
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/lightning/proc/StartChargeup(mob/user = usr)
|
||||
/obj/effect/proc_holder/spell/targeted/tesla/proc/StartChargeup(mob/user = usr)
|
||||
ready = 1
|
||||
user << "<span class='notice'>You start gathering the power.</span>"
|
||||
Snd = new/sound('sound/magic/lightning_chargeup.ogg',channel = 7)
|
||||
@@ -36,18 +36,18 @@
|
||||
else
|
||||
revert_cast(user, 0)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr)
|
||||
/obj/effect/proc_holder/spell/targeted/tesla/proc/Reset(mob/user = usr)
|
||||
ready = 0
|
||||
if(halo)
|
||||
user.overlays.Remove(halo)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/lightning/revert_cast(mob/user = usr, message = 1)
|
||||
/obj/effect/proc_holder/spell/targeted/tesla/revert_cast(mob/user = usr, message = 1)
|
||||
if(message)
|
||||
user << "<span class='notice'>No target found in range.</span>"
|
||||
Reset(user)
|
||||
..()
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/lightning/cast(list/targets, mob/user = usr)
|
||||
/obj/effect/proc_holder/spell/targeted/tesla/cast(list/targets, mob/user = usr)
|
||||
ready = 0
|
||||
var/mob/living/carbon/target = targets[1]
|
||||
Snd=sound(null, repeat = 0, wait = 1, channel = Snd.channel) //byond, why you suck?
|
||||
@@ -63,7 +63,7 @@
|
||||
Bolt(user,target,30,5,user)
|
||||
Reset(user)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/lightning/proc/Bolt(mob/origin,mob/target,bolt_energy,bounces,mob/user = usr)
|
||||
/obj/effect/proc_holder/spell/targeted/tesla/proc/Bolt(mob/origin,mob/target,bolt_energy,bounces,mob/user = usr)
|
||||
origin.Beam(target,icon_state="lightning[rand(1,12)]",time=5)
|
||||
var/mob/living/carbon/current = target
|
||||
if(bounces < 1)
|
||||
@@ -81,4 +81,4 @@
|
||||
return
|
||||
var/mob/living/next = pick(possible_targets)
|
||||
if(next)
|
||||
Bolt(current,next,max((bolt_energy-5),5),bounces-1,user)
|
||||
Bolt(current,next,max((bolt_energy-5),5),bounces-1,user)
|
||||
|
||||
@@ -227,78 +227,6 @@
|
||||
mutations = list(BLINDMUT)
|
||||
duration = 300
|
||||
sound="sound/magic/Blind.ogg"
|
||||
|
||||
/obj/effect/proc_holder/spell/fireball
|
||||
name = "Fireball"
|
||||
desc = "This spell fires a fireball at a target and does not require wizard garb."
|
||||
|
||||
school = "evocation"
|
||||
charge_max = 60
|
||||
clothes_req = 0
|
||||
invocation = "ONI SOMA"
|
||||
invocation_type = "shout"
|
||||
range = 20
|
||||
cooldown_min = 20 //10 deciseconds reduction per rank
|
||||
var/fireball_type = /obj/item/projectile/magic/fireball
|
||||
action_icon_state = "fireball0"
|
||||
sound = "sound/magic/Fireball.ogg"
|
||||
|
||||
active = FALSE
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/fireball/Click()
|
||||
var/mob/living/user = usr
|
||||
if(!istype(user))
|
||||
return
|
||||
|
||||
var/msg
|
||||
|
||||
if(!can_cast(user))
|
||||
msg = "<span class='warning'>You can no longer cast Fireball.</span>"
|
||||
remove_ranged_ability(msg)
|
||||
return
|
||||
|
||||
if(active)
|
||||
msg = "<span class='notice'>You extinguish your fireball...for now.</span>"
|
||||
remove_ranged_ability(msg)
|
||||
else
|
||||
msg = "<span class='notice'>Your prepare to cast your fireball spell! <B>Left-click to cast at a target!</B></span>"
|
||||
add_ranged_ability(user, msg, TRUE)
|
||||
|
||||
/obj/effect/proc_holder/spell/fireball/update_icon()
|
||||
if(!action)
|
||||
return
|
||||
action.button_icon_state = "fireball[active]"
|
||||
action.UpdateButtonIcon()
|
||||
|
||||
/obj/effect/proc_holder/spell/fireball/InterceptClickOn(mob/living/caller, params, atom/target)
|
||||
if(..())
|
||||
return FALSE
|
||||
|
||||
if(!cast_check(0, ranged_ability_user))
|
||||
remove_ranged_ability()
|
||||
return FALSE
|
||||
|
||||
var/list/targets = list(target)
|
||||
perform(targets,user = ranged_ability_user)
|
||||
|
||||
return TRUE
|
||||
|
||||
/obj/effect/proc_holder/spell/fireball/cast(list/targets, mob/living/user)
|
||||
var/target = targets[1] //There is only ever one target for fireball
|
||||
var/turf/T = user.loc
|
||||
var/turf/U = get_step(user, user.dir) // Get the tile infront of the move, based on their direction
|
||||
if(!isturf(U) || !isturf(T))
|
||||
return 0
|
||||
|
||||
var/obj/item/projectile/magic/fireball/FB = new fireball_type(user.loc)
|
||||
FB.current = get_turf(user)
|
||||
FB.preparePixelProjectile(target, get_turf(target), user)
|
||||
FB.fire()
|
||||
user.newtonian_move(get_dir(U, T))
|
||||
remove_ranged_ability() //Auto-disable the ability once successfully performed
|
||||
return 1
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/repulse
|
||||
name = "Repulse"
|
||||
desc = "This spell throws everything around the user away."
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 167 KiB After Width: | Height: | Size: 166 KiB |
@@ -1911,6 +1911,7 @@
|
||||
#include "code\modules\shuttle\white_ship.dm"
|
||||
#include "code\modules\space_transition\space_transition.dm"
|
||||
#include "code\modules\spells\spell.dm"
|
||||
#include "code\modules\spells\spell_types\aimed.dm"
|
||||
#include "code\modules\spells\spell_types\area_teleport.dm"
|
||||
#include "code\modules\spells\spell_types\barnyard.dm"
|
||||
#include "code\modules\spells\spell_types\bloodcrawl.dm"
|
||||
|
||||
Reference in New Issue
Block a user