mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-23 03:57:48 +01:00
Finishes thunderstorms.
This commit is contained in:
@@ -61,5 +61,6 @@
|
||||
pixel_x = -32
|
||||
|
||||
/obj/effect/temporary_effect/lightning_strike/initialize()
|
||||
icon_state += rand(1,2) // To have two variants of lightning sprites.
|
||||
icon_state += "[rand(1,2)]" // To have two variants of lightning sprites.
|
||||
animate(src, alpha = 0, time = time_to_die - 1)
|
||||
. = ..()
|
||||
@@ -52,12 +52,12 @@
|
||||
animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING)
|
||||
|
||||
// Used when the tree gets hurt.
|
||||
/obj/structure/flora/tree/proc/adjust_health(var/amount, var/is_ranged = FALSE)
|
||||
/obj/structure/flora/tree/proc/adjust_health(var/amount, var/damage_wood = FALSE)
|
||||
if(is_stump)
|
||||
return
|
||||
|
||||
// Bullets and lasers ruin some of the wood
|
||||
if(is_ranged && product_amount > 0)
|
||||
if(damage_wood && product_amount > 0)
|
||||
var/wood = initial(product_amount)
|
||||
product_amount -= round(wood * (abs(amount)/max_health))
|
||||
|
||||
@@ -90,12 +90,16 @@
|
||||
set_light(0)
|
||||
|
||||
/obj/structure/flora/tree/ex_act(var/severity)
|
||||
adjust_health(-(max_health / severity))
|
||||
adjust_health(-(max_health / severity), TRUE)
|
||||
|
||||
/obj/structure/flora/tree/bullet_act(var/obj/item/projectile/Proj)
|
||||
if(Proj.get_structure_damage())
|
||||
adjust_health(-Proj.get_structure_damage(), TRUE)
|
||||
|
||||
/obj/structure/flora/tree/tesla_act(power, explosive)
|
||||
adjust_health(-power / 100, TRUE) // Kills most trees in one lightning strike.
|
||||
..()
|
||||
|
||||
/obj/structure/flora/tree/get_description_interaction()
|
||||
var/list/results = list()
|
||||
|
||||
|
||||
@@ -130,6 +130,9 @@
|
||||
if ("mechstep") soundin = pick('sound/mecha/mechstep1.ogg', 'sound/mecha/mechstep2.ogg')
|
||||
if ("geiger") soundin = pick('sound/items/geiger1.ogg', 'sound/items/geiger2.ogg', 'sound/items/geiger3.ogg', 'sound/items/geiger4.ogg', 'sound/items/geiger5.ogg')
|
||||
if ("geiger_weak") soundin = pick('sound/items/geiger_weak1.ogg', 'sound/items/geiger_weak2.ogg', 'sound/items/geiger_weak3.ogg', 'sound/items/geiger_weak4.ogg')
|
||||
if ("thunder") soundin = pick('sound/effects/thunder/thunder1.ogg', 'sound/effects/thunder/thunder2.ogg', 'sound/effects/thunder/thunder3.ogg', 'sound/effects/thunder/thunder4.ogg',
|
||||
'sound/effects/thunder/thunder5.ogg', 'sound/effects/thunder/thunder6.ogg', 'sound/effects/thunder/thunder7.ogg', 'sound/effects/thunder/thunder8.ogg', 'sound/effects/thunder/thunder9.ogg',
|
||||
'sound/effects/thunder/thunder10.ogg')
|
||||
return soundin
|
||||
|
||||
//Are these even used?
|
||||
|
||||
@@ -133,7 +133,8 @@ var/list/admin_verbs_fun = list(
|
||||
/client/proc/roll_dices,
|
||||
/datum/admins/proc/call_supply_drop,
|
||||
/datum/admins/proc/call_drop_pod,
|
||||
/client/proc/smite
|
||||
/client/proc/smite,
|
||||
/client/proc/admin_lightning_strike
|
||||
)
|
||||
|
||||
var/list/admin_verbs_spawn = list(
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
/client/proc/admin_lightning_strike()
|
||||
set name = "Lightning Stirke"
|
||||
set desc = "Causes lightning to strike on your tile. This will hurt things on or nearby it severely."
|
||||
set category = "Fun"
|
||||
|
||||
if(!check_rights(R_FUN))
|
||||
return
|
||||
|
||||
var/result = alert(src, "Really strike your tile with lightning?", "Confirm Badmin" , "No", "Yes (Cosmetic)", "Yes (Real)")
|
||||
|
||||
if(result == "No")
|
||||
return
|
||||
|
||||
lightning_strike(get_turf(usr), result == "Yes (Cosmetic)")
|
||||
|
||||
#define LIGHTNING_REDIRECT_RANGE 28 // How far in tiles certain things draw lightning from.
|
||||
#define LIGHTNING_ZAP_RANGE 3 // How far the tesla effect zaps, as well as the bad effects from a direct strike.
|
||||
#define LIGHTNING_POWER 20000 // How much 'zap' is in a strike, used for tesla_zap().
|
||||
|
||||
// The real lightning proc.
|
||||
// This is global until I can figure out a better place for it.
|
||||
// T is the turf that is being struck. If cosmetic is true, the lightning won't actually hurt anything.
|
||||
/proc/lightning_strike(turf/T, cosmetic = FALSE)
|
||||
// First, visuals.
|
||||
|
||||
// Do a lightning flash for the whole planet, if the turf belongs to a planet.
|
||||
var/datum/planet/P = null
|
||||
P = SSplanets.z_to_planet[T.z]
|
||||
if(P)
|
||||
var/datum/weather_holder/holder = P.weather_holder
|
||||
flick("lightning_flash", holder.special_visuals)
|
||||
|
||||
// Before we do the other visuals, we need to see if something is going to hijack our intended target.
|
||||
var/obj/machinery/power/grounding_rod/ground = null // Most of the bad effects of lightning will get negated if a grounding rod is nearby.
|
||||
var/obj/machinery/power/tesla_coil/coil = null // However a tesla coil has higher priority and the strike will bounce.
|
||||
|
||||
for(var/obj/machinery/power/thing in range(LIGHTNING_REDIRECT_RANGE, T))
|
||||
if(istype(thing, /obj/machinery/power/tesla_coil))
|
||||
var/turf/simulated/coil_turf = get_turf(thing)
|
||||
if(istype(coil_turf) && thing.anchored && coil_turf.outdoors)
|
||||
coil = thing
|
||||
break
|
||||
|
||||
if(istype(thing, /obj/machinery/power/grounding_rod))
|
||||
var/turf/simulated/rod_turf = get_turf(thing)
|
||||
if(istype(rod_turf) && thing.anchored && rod_turf.outdoors)
|
||||
ground = thing
|
||||
|
||||
if(coil) // Coil gets highest priority.
|
||||
T = coil.loc
|
||||
else if(ground)
|
||||
T = ground.loc
|
||||
|
||||
// Now make the lightning strike sprite. It will fade and delete itself in a second.
|
||||
new /obj/effect/temporary_effect/lightning_strike(T)
|
||||
|
||||
// For those close up.
|
||||
playsound(T, 'sound/effects/lightningbolt.ogg', 100, 1)
|
||||
|
||||
// And for those far away. If the strike happens on a planet, everyone on the planet will hear it.
|
||||
// Otherwise only those on the current z-level will hear it.
|
||||
var/sound = get_sfx("thunder")
|
||||
for(var/mob/M in player_list)
|
||||
if((P && M.z in P.expected_z_levels) || M.z == T.z)
|
||||
M.playsound_local(get_turf(M), soundin = sound, vol = 70, vary = FALSE, is_global = TRUE)
|
||||
|
||||
if(cosmetic) // Everything beyond here involves potentially damaging things. If we don't want to do that, stop now.
|
||||
return
|
||||
|
||||
if(ground) // All is well.
|
||||
ground.tesla_act(LIGHTNING_POWER, FALSE)
|
||||
return
|
||||
|
||||
else if(coil) // Otherwise lets bounce off the tesla coil.
|
||||
coil.tesla_act(LIGHTNING_POWER, TRUE)
|
||||
|
||||
else // Striking the turf directly.
|
||||
tesla_zap(T, zap_range = LIGHTNING_ZAP_RANGE, power = LIGHTNING_POWER, explosive = FALSE, stun_mobs = TRUE)
|
||||
|
||||
// Some extra effects.
|
||||
// Some apply to those within zap range, others if they were a bit farther away.
|
||||
for(var/mob/living/L in view(5, T))
|
||||
if(get_dist(L, T) <= LIGHTNING_ZAP_RANGE) // They probably got zapped.
|
||||
// The actual damage/electrocution is handled by tesla_zap().
|
||||
L.Paralyse(5)
|
||||
L.stuttering += 20
|
||||
L.make_jittery(20)
|
||||
L.emp_act(1)
|
||||
to_chat(L, span("critical", "You've been struck by lightning!"))
|
||||
|
||||
// If a non-player simplemob was struck, inflict huge damage.
|
||||
// If the damage is fatal, the SA is turned to ash.
|
||||
if(istype(L, /mob/living/simple_animal) && !L.key)
|
||||
var/mob/living/simple_animal/SA = L
|
||||
SA.adjustFireLoss(200)
|
||||
SA.updatehealth()
|
||||
if(SA.health <= 0) // Might be best to check/give simple_mobs siemens when this gets ported to new mobs.
|
||||
SA.visible_message(span("critical", "\The [SA] disintegrates into ash!"))
|
||||
SA.ash()
|
||||
continue // No point deafening something that wont exist.
|
||||
|
||||
// Deafen them.
|
||||
if(L.get_ear_protection() < 2)
|
||||
L.AdjustSleeping(-100)
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
C.ear_deaf += 10
|
||||
to_chat(L, span("danger", "Lightning struck nearby, and the thunderclap is deafening!"))
|
||||
|
||||
#undef GROUNDING_ROD_RANGE
|
||||
#undef LIGHTNING_ZAP_RANGE
|
||||
#undef LIGHTNING_POWER
|
||||
@@ -312,32 +312,6 @@ datum/weather/sif
|
||||
var/turf/T = pick(holder.our_planet.planet_floors) // This has the chance to 'strike' the sky, but that might be a good thing, to scare reckless pilots.
|
||||
lightning_strike(T)
|
||||
|
||||
// This is global until I can figure out a better place for it.
|
||||
// T is the turf that is being struck. If cosmetic is true, the lightning won't actually hurt anything.
|
||||
/proc/lightning_strike(turf/T, cosmetic = FALSE)
|
||||
world << "Going to strike turf [T] ([T.x],[T.y],[T.z])."
|
||||
// First, visuals.
|
||||
// Do a lightning flash for the whole planet, if the turf belongs to a planet.
|
||||
var/datum/planet/P = null
|
||||
P = SSplanets.z_to_planet[T.z]
|
||||
if(P)
|
||||
world << "Planet [P] ([P.name]) is hopefully not null."
|
||||
var/datum/weather_holder/holder = P.weather_holder
|
||||
world << "Weather holder is hopefully not null."
|
||||
flick("lightning_flash", holder.special_visuals)
|
||||
|
||||
// Now make the lightning strike sprite. It will delete itself in a second.
|
||||
new /obj/effect/temporary_effect/lightning_strike(T)
|
||||
|
||||
// Todo: Thunder.
|
||||
|
||||
if(cosmetic) // Everything beyond here involves damaging things. If we don't want to do that, stop now.
|
||||
return
|
||||
|
||||
// Test verb
|
||||
/mob/verb/test_lightning()
|
||||
lightning_strike(get_turf(src))
|
||||
|
||||
/datum/weather/sif/hail
|
||||
name = "hail"
|
||||
icon_state = "hail"
|
||||
|
||||
@@ -93,5 +93,4 @@
|
||||
// This is for special effects for specific types of weather, such as lightning flashes in a storm.
|
||||
// It's a seperate object to allow the use of flick().
|
||||
/atom/movable/weather_visuals/special
|
||||
plane = PLANE_LIGHTING_ABOVE
|
||||
alpha = 127
|
||||
plane = PLANE_LIGHTING_ABOVE
|
||||
@@ -18,6 +18,9 @@
|
||||
var/last_zap = 0
|
||||
var/datum/wires/tesla_coil/wires = null
|
||||
|
||||
/obj/machinery/power/tesla_coil/pre_mapped
|
||||
anchored = TRUE
|
||||
|
||||
/obj/machinery/power/tesla_coil/New()
|
||||
..()
|
||||
wires = new(src)
|
||||
@@ -103,6 +106,9 @@
|
||||
can_buckle = TRUE
|
||||
buckle_lying = FALSE
|
||||
|
||||
/obj/machinery/power/grounding_rod/pre_mapped
|
||||
anchored = TRUE
|
||||
|
||||
/obj/machinery/power/grounding_rod/update_icon()
|
||||
if(panel_open)
|
||||
icon_state = "grounding_rod_open[anchored]"
|
||||
|
||||
@@ -45,7 +45,10 @@
|
||||
/obj/machinery/light/tesla_act(power, explosive = FALSE)
|
||||
if(explosive)
|
||||
explosion(loc, 0, 0, 0/*, flame_range = 5*/, adminlog = FALSE)
|
||||
qdel(src)
|
||||
qdel(src)
|
||||
return
|
||||
on = TRUE
|
||||
broken()
|
||||
|
||||
/obj/structure/closet/tesla_act(var/power)
|
||||
..() //extend the zap
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
@@ -1243,6 +1243,7 @@
|
||||
#include "code\modules\admin\verbs\dice.dm"
|
||||
#include "code\modules\admin\verbs\getlogs.dm"
|
||||
#include "code\modules\admin\verbs\grief_fixers.dm"
|
||||
#include "code\modules\admin\verbs\lightning_strike.dm"
|
||||
#include "code\modules\admin\verbs\map_template_loadverb.dm"
|
||||
#include "code\modules\admin\verbs\mapping.dm"
|
||||
#include "code\modules\admin\verbs\massmodvar.dm"
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user