mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-25 13:07:46 +01:00
Ports TG staff of storms / updates sprites (#21566)
* Ports TG staff of storms / updates sprites * I *said* it *doesn't* work in SPACE! * Update legion_loot.dm * requested changes * icons fixed
This commit is contained in:
@@ -201,11 +201,10 @@
|
||||
/obj/item/lava_staff
|
||||
name = "staff of lava"
|
||||
desc = "The power of fire and rocks in your hands!"
|
||||
icon_state = "staffofstorms"
|
||||
item_state = "staffofstorms"
|
||||
icon_state = "lavastaff"
|
||||
item_state = "lavastaff"
|
||||
icon = 'icons/obj/guns/magic.dmi'
|
||||
slot_flags = SLOT_BACK
|
||||
item_state = "staffofstorms"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
force = 25
|
||||
damtype = BURN
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/staff/storm
|
||||
/obj/item/storm_staff
|
||||
name = "staff of storms"
|
||||
desc = "An ancient staff retrieved from the remains of Legion. The wind stirs as you move it."
|
||||
icon_state = "staffofstorms"
|
||||
@@ -8,16 +8,27 @@
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
force = 25
|
||||
damtype = BURN
|
||||
hitsound = 'sound/weapons/sear.ogg'
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
needs_permit = TRUE
|
||||
var/storm_type = /datum/weather/ash_storm
|
||||
var/storm_cooldown = 0
|
||||
var/max_thunder_charges = 3
|
||||
var/thunder_charges = 3
|
||||
var/thunder_charge_time = 15 SECONDS
|
||||
var/static/list/excluded_areas = list(/area/space)
|
||||
///This is a list of turfs currently being targeted.
|
||||
var/list/targeted_turfs = list()
|
||||
|
||||
/obj/item/staff/storm/attack_self(mob/user)
|
||||
if(storm_cooldown > world.time)
|
||||
to_chat(user, "<span class='warning'>The staff is still recharging!</span>")
|
||||
return
|
||||
/obj/item/storm_staff/Destroy()
|
||||
targeted_turfs = null
|
||||
return ..()
|
||||
|
||||
/obj/item/storm_staff/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>It has [thunder_charges] charges remaining.</span>"
|
||||
. += "<span class='notice'>Use it in hand to dispel storms.</span>"
|
||||
. += "<span class='notice'>Use it on targets to summon thunderbolts from the sky.</span>"
|
||||
. += "<span class='notice'>The thunderbolts are boosted if in an area with weather effects.</span>"
|
||||
|
||||
/obj/item/storm_staff/attack_self(mob/user)
|
||||
var/area/user_area = get_area(user)
|
||||
var/turf/user_turf = get_turf(user)
|
||||
if(!user_area || !user_turf)
|
||||
@@ -39,16 +50,81 @@
|
||||
"<span class='notice'>You hold [src] skyward, dispelling the storm!</span>")
|
||||
playsound(user, 'sound/magic/staff_change.ogg', 200, 0)
|
||||
A.wind_down()
|
||||
return
|
||||
else
|
||||
A = new storm_type(list(user_turf.z))
|
||||
A.name = "staff storm"
|
||||
A.area_type = user_area.type
|
||||
A.telegraph_duration = 100
|
||||
A.end_duration = 100
|
||||
var/old_color = user.color
|
||||
user.color = list(340/255, 240/255, 0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0)
|
||||
var/old_transform = user.transform
|
||||
user.transform *= 1.2
|
||||
animate(user, color = old_color, transform = old_transform, time = 1 SECONDS)
|
||||
|
||||
user.visible_message("<span class='warning'>[user] holds [src] skywards as red lightning crackles into the sky!</span>", \
|
||||
"<span class='notice'>You hold [src] skyward, calling down a terrible storm!</span>")
|
||||
playsound(user, 'sound/magic/staff_change.ogg', 200, 0)
|
||||
A.telegraph()
|
||||
storm_cooldown = world.time + 200
|
||||
/obj/item/storm_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
. = ..()
|
||||
if(!thunder_charges)
|
||||
to_chat(user, "<span class='warning'>The staff needs to recharge.</span>")
|
||||
return
|
||||
var/turf/target_turf = get_turf(target)
|
||||
var/area/target_area = get_area(target)
|
||||
var/area/user_area = get_area(user)
|
||||
if(!target_turf || !target_area || (is_type_in_list(target_area, excluded_areas)) || !user_area || (is_type_in_list(user_area, excluded_areas)))
|
||||
to_chat(user, "<span class='warning'>The staff will not work here.</span>")
|
||||
return
|
||||
if(target_turf in targeted_turfs)
|
||||
to_chat(user, "<span class='warning'>That SPOT is already being shocked!</span>")
|
||||
return
|
||||
if(HAS_TRAIT(user, TRAIT_PACIFISM))
|
||||
to_chat(user, "<span class='warning'>You don't want to hurt anyone!</span>")
|
||||
return
|
||||
var/power_boosted = FALSE
|
||||
for(var/V in SSweather.processing)
|
||||
var/datum/weather/W = V
|
||||
if((target_turf.z in W.impacted_z_levels) && W.area_type == target_area.type)
|
||||
power_boosted = TRUE
|
||||
break
|
||||
playsound(src, 'sound/magic/lightningshock.ogg', 10, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0)
|
||||
targeted_turfs += target_turf
|
||||
to_chat(user, "<span class='warning'>You aim at [target_turf]!</span>")
|
||||
new /obj/effect/temp_visual/thunderbolt_targeting(target_turf)
|
||||
addtimer(CALLBACK(src, PROC_REF(throw_thunderbolt), target_turf, power_boosted), 1.5 SECONDS)
|
||||
thunder_charges--
|
||||
addtimer(CALLBACK(src, PROC_REF(recharge)), thunder_charge_time)
|
||||
|
||||
/obj/item/storm_staff/proc/recharge(mob/user)
|
||||
thunder_charges = min(thunder_charges + 1, max_thunder_charges)
|
||||
playsound(src, 'sound/magic/charge.ogg', 10, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0)
|
||||
|
||||
/obj/item/storm_staff/proc/throw_thunderbolt(turf/target, boosted)
|
||||
targeted_turfs -= target
|
||||
new /obj/effect/temp_visual/thunderbolt(target)
|
||||
var/list/affected_turfs = list(target)
|
||||
if(boosted)
|
||||
for(var/direction in GLOB.alldirs)
|
||||
var/turf_to_add = get_step(target, direction)
|
||||
if(!turf_to_add)
|
||||
continue
|
||||
affected_turfs += turf_to_add
|
||||
for(var/turf/T as anything in affected_turfs)
|
||||
new /obj/effect/temp_visual/electricity(T)
|
||||
for(var/mob/living/hit_mob in T)
|
||||
to_chat(hit_mob, "<span class='userdanger'>You've been struck by lightning!</span>")
|
||||
hit_mob.electrocute_act(15 * (isanimal(hit_mob) ? 3 : 1) * (T == target ? 2 : 1) * (boosted ? 2 : 1), src, flags = SHOCK_TESLA|SHOCK_NOSTUN)
|
||||
|
||||
for(var/obj/hit_thing in T)
|
||||
hit_thing.take_damage(20, BURN, ENERGY, FALSE)
|
||||
playsound(target, 'sound/magic/lightningbolt.ogg', 100, TRUE)
|
||||
target.visible_message("<span class='danger'>A thunderbolt strikes [target]!</span>")
|
||||
explosion(target, -1, -1, light_impact_range = (boosted ? 1 : 0), flame_range = (boosted ? 2 : 1), silent = TRUE)
|
||||
|
||||
|
||||
/obj/effect/temp_visual/thunderbolt_targeting
|
||||
icon_state = "target_circle"
|
||||
layer = BELOW_MOB_LAYER
|
||||
light_range = 1
|
||||
duration = 2 SECONDS
|
||||
|
||||
/obj/effect/temp_visual/thunderbolt
|
||||
icon_state = "thunderbolt"
|
||||
icon = 'icons/effects/32x96.dmi'
|
||||
duration = 0.6 SECONDS
|
||||
|
||||
/obj/effect/temp_visual/electricity
|
||||
icon_state = "electricity3"
|
||||
duration = 0.5 SECONDS
|
||||
|
||||
Reference in New Issue
Block a user