mirror of
https://github.com/fulpstation/fulpstation.git
synced 2025-12-10 01:57:01 +00:00
Makes grounding rods consistent, changes the supermatters bolts a great deal. (#48472)
* Goof I will find you and I will berate you holy hell Calm and peaceful ahhhhh I swear goofs pc failing was the biggest tragedy in gaming Fixes some flags More touchups Now to squash Goofs PC failing was the biggest tragady in GAMING * Fixing some misspellings before the bee gets me * GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF * Full vehicle support * Changes some flags around, "fixes" some bugs, makes being shocked less insane * Makes spliting more reasonable, unfucks some shitty tesla code I copypasta'd into the sm, godspeed shitcode, none noticed you. * Removes my tesla_ignore_1 fix, another pr is up that should solve things, so we're just leaving it in for now, gonna have to deal with merge conflicts when it gets merged, but that won't be too bad * tfw * Nothing to see here folks * I'm a boomer
This commit is contained in:
@@ -38,6 +38,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
|
||||
/// Prevent clicking things below it on the same turf eg. doors/ fulltile windows
|
||||
#define PREVENT_CLICK_UNDER_1 (1<<11)
|
||||
#define HOLOGRAM_1 (1<<12)
|
||||
/// Prevents mobs from getting chainshocked by teslas and the supermatter
|
||||
#define SHOCKED_1 (1<<13)
|
||||
///Whether /atom/Initialize() has already run for the object
|
||||
#define INITIALIZED_1 (1<<14)
|
||||
/// was this spawned by an admin? used for stat tracking stuff.
|
||||
@@ -45,6 +47,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
|
||||
/// should not get harmed if this gets caught by an explosion?
|
||||
#define PREVENT_CONTENTS_EXPLOSION_1 (1<<16)
|
||||
|
||||
|
||||
//turf-only flags
|
||||
#define NOJAUNT_1 (1<<0)
|
||||
#define UNUSED_RESERVATION_TURF_1 (1<<1)
|
||||
@@ -94,14 +97,16 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
|
||||
#define FREEZE_PROOF (1<<7)
|
||||
|
||||
//tesla_zap
|
||||
#define TESLA_MACHINE_EXPLOSIVE (1<<0)
|
||||
#define TESLA_ALLOW_DUPLICATES (1<<1)
|
||||
#define TESLA_OBJ_DAMAGE (1<<2)
|
||||
#define TESLA_MOB_DAMAGE (1<<3)
|
||||
#define TESLA_MOB_STUN (1<<4)
|
||||
#define ZAP_MACHINE_EXPLOSIVE (1<<0)
|
||||
#define ZAP_ALLOW_DUPLICATES (1<<1)
|
||||
#define ZAP_OBJ_DAMAGE (1<<2)
|
||||
#define ZAP_MOB_DAMAGE (1<<3)
|
||||
#define ZAP_MOB_STUN (1<<4)
|
||||
#define ZAP_IS_TESLA (1<<5)
|
||||
|
||||
#define TESLA_DEFAULT_FLAGS ALL
|
||||
#define TESLA_FUSION_FLAGS TESLA_OBJ_DAMAGE | TESLA_MOB_DAMAGE | TESLA_MOB_STUN
|
||||
#define ZAP_DEFAULT_FLAGS ALL
|
||||
#define ZAP_FUSION_FLAGS ZAP_OBJ_DAMAGE | ZAP_MOB_DAMAGE | ZAP_MOB_STUN | ZAP_IS_TESLA
|
||||
#define ZAP_SUPERMATTER_FLAGS NONE
|
||||
|
||||
//EMP protection
|
||||
#define EMP_PROTECT_SELF (1<<0)
|
||||
|
||||
@@ -131,8 +131,9 @@ GLOBAL_LIST_INIT(bitfields, list(
|
||||
"NO_RUINS_1" = NO_RUINS_1,
|
||||
"PREVENT_CLICK_UNDER_1" = PREVENT_CLICK_UNDER_1,
|
||||
"HOLOGRAM_1" = HOLOGRAM_1,
|
||||
"SHOCKED_1" = SHOCKED_1,
|
||||
"INITIALIZED_1" = INITIALIZED_1,
|
||||
"ADMIN_SPAWNED_1" = ADMIN_SPAWNED_1,
|
||||
"ADMIN_SPAWNED_1" = ADMIN_SPAWNED_1
|
||||
),
|
||||
"clothing_flags" = list(
|
||||
"LAVAPROTECT" = LAVAPROTECT,
|
||||
@@ -148,12 +149,13 @@ GLOBAL_LIST_INIT(bitfields, list(
|
||||
"SNUG_FIT" = SNUG_FIT,
|
||||
"ANTI_TINFOIL_MANEUVER" = ANTI_TINFOIL_MANEUVER,
|
||||
),
|
||||
"tesla_flags" = list(
|
||||
"TESLA_MOB_DAMAGE" = TESLA_MOB_DAMAGE,
|
||||
"TESLA_OBJ_DAMAGE" = TESLA_OBJ_DAMAGE,
|
||||
"TESLA_MOB_STUN" = TESLA_MOB_STUN,
|
||||
"TESLA_ALLOW_DUPLICATES" = TESLA_ALLOW_DUPLICATES,
|
||||
"TESLA_MACHINE_EXPLOSIVE" = TESLA_MACHINE_EXPLOSIVE,
|
||||
"zap_flags" = list(
|
||||
"ZAP_MOB_DAMAGE" = ZAP_MOB_DAMAGE,
|
||||
"ZAP_OBJ_DAMAGE" = ZAP_OBJ_DAMAGE,
|
||||
"ZAP_MOB_STUN" = ZAP_MOB_STUN,
|
||||
"ZAP_ALLOW_DUPLICATES" = ZAP_ALLOW_DUPLICATES,
|
||||
"ZAP_MACHINE_EXPLOSIVE" = ZAP_MACHINE_EXPLOSIVE,
|
||||
"ZAP_IS_TESLA" = ZAP_IS_TESLA,
|
||||
),
|
||||
"smooth" = list(
|
||||
"SMOOTH_TRUE" = SMOOTH_TRUE,
|
||||
|
||||
@@ -146,3 +146,9 @@
|
||||
|
||||
/mob/living/carbon/CanSpreadAirborneDisease()
|
||||
return !((head && (head.flags_cover & HEADCOVERSMOUTH) && (head.armor.getRating("bio") >= 25)) || (wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH) && (wear_mask.armor.getRating("bio") >= 25)))
|
||||
|
||||
/mob/living/proc/set_shocked()
|
||||
flags_1 |= SHOCKED_1
|
||||
|
||||
/mob/living/proc/reset_shocked()
|
||||
flags_1 &= ~ SHOCKED_1
|
||||
|
||||
@@ -531,11 +531,11 @@ Class Procs:
|
||||
/obj/machinery/proc/can_be_overridden()
|
||||
. = 1
|
||||
|
||||
/obj/machinery/tesla_act(power, tesla_flags, shocked_objects)
|
||||
/obj/machinery/zap_act(power, zap_flags, shocked_objects)
|
||||
..()
|
||||
if(prob(85) && (tesla_flags & TESLA_MACHINE_EXPLOSIVE) && !(resistance_flags & INDESTRUCTIBLE))
|
||||
if(prob(85) && (zap_flags & ZAP_MACHINE_EXPLOSIVE) && !(resistance_flags & INDESTRUCTIBLE))
|
||||
explosion(src, 1, 2, 4, flame_range = 2, adminlog = FALSE, smoke = FALSE)
|
||||
if(tesla_flags & TESLA_OBJ_DAMAGE)
|
||||
if(zap_flags & ZAP_OBJ_DAMAGE)
|
||||
take_damage(power/2000, BURN, "energy")
|
||||
if(prob(40))
|
||||
emp_act(EMP_LIGHT)
|
||||
|
||||
@@ -227,17 +227,18 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e
|
||||
SSfire_burning.processing -= src
|
||||
|
||||
///Called when the obj is hit by a tesla bolt.
|
||||
/obj/proc/tesla_act(power, tesla_flags, shocked_targets)
|
||||
/obj/proc/zap_act(power, zap_flags, shocked_targets)
|
||||
if(QDELETED(src))
|
||||
return
|
||||
obj_flags |= BEING_SHOCKED
|
||||
var/power_bounced = power / 2
|
||||
tesla_zap(src, 3, power_bounced, tesla_flags, shocked_targets)
|
||||
if(zap_flags & ZAP_IS_TESLA)
|
||||
var/power_bounced = power / 2
|
||||
tesla_zap(src, 3, power_bounced, zap_flags, shocked_targets)
|
||||
addtimer(CALLBACK(src, .proc/reset_shocked), 10)
|
||||
|
||||
//The surgeon general warns that being buckled to certain objects receiving powerful shocks is greatly hazardous to your health
|
||||
///Only tesla coils and grounding rods currently call this because mobs are already targeted over all other objects, but this might be useful for more things later.
|
||||
/obj/proc/tesla_buckle_check(var/strength)
|
||||
///Only tesla coils, vehicles, and grounding rods currently call this because mobs are already targeted over all other objects, but this might be useful for more things later.
|
||||
/obj/proc/zap_buckle_check(var/strength)
|
||||
if(has_buckled_mobs())
|
||||
for(var/m in buckled_mobs)
|
||||
var/mob/living/buckled_mob = m
|
||||
|
||||
@@ -261,7 +261,7 @@
|
||||
var/obj/structure/cable/C = T.get_cable_node()
|
||||
if(C)
|
||||
playsound(src, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
|
||||
tesla_zap(src, 3, C.newavail() * 0.01, TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE | TESLA_MOB_STUN | TESLA_ALLOW_DUPLICATES) //Zap for 1/100 of the amount of power. At a million watts in the grid, it will be as powerful as a tesla revolver shot.
|
||||
tesla_zap(src, 3, C.newavail() * 0.01, ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN | ZAP_ALLOW_DUPLICATES | ZAP_IS_TESLA) //Zap for 1/100 of the amount of power. At a million watts in the grid, it will be as powerful as a tesla revolver shot.
|
||||
C.add_delayedload(C.newavail() * 0.0375) // you can gain up to 3.5 via the 4x upgrades power is halved by the pole so thats 2x then 1X then .5X for 3.5x the 3 bounces shock.
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -22,5 +22,5 @@
|
||||
addtimer(CALLBACK(src, .proc/zap), rand(30, 100))
|
||||
|
||||
/obj/item/organ/heart/gland/electric/proc/zap()
|
||||
tesla_zap(owner, 4, 8000, TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE | TESLA_MOB_STUN)
|
||||
tesla_zap(owner, 4, 8000, ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN | ZAP_IS_TESLA)
|
||||
playsound(get_turf(owner), 'sound/magic/lightningshock.ogg', 50, TRUE)
|
||||
|
||||
@@ -207,7 +207,7 @@
|
||||
if(prob(100 - severity * 30))
|
||||
new /obj/effect/temp_visual/emp(get_turf(src))
|
||||
|
||||
/obj/structure/blob/tesla_act(power)
|
||||
/obj/structure/blob/zap_act(power)
|
||||
..()
|
||||
if(overmind)
|
||||
if(overmind.blobstrain.tesla_reaction(src, power))
|
||||
|
||||
@@ -445,9 +445,9 @@
|
||||
return
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/nuclearbomb/tesla_act(power, tesla_flags)
|
||||
/obj/machinery/nuclearbomb/zap_act(power, zap_flags)
|
||||
..()
|
||||
if(tesla_flags & TESLA_MACHINE_EXPLOSIVE)
|
||||
if(zap_flags & ZAP_MACHINE_EXPLOSIVE)
|
||||
qdel(src)//like the singulo, tesla deletes it. stops it from exploding over and over
|
||||
|
||||
#define NUKERANGE 127
|
||||
|
||||
@@ -151,9 +151,9 @@
|
||||
name = "reactive tesla armor"
|
||||
desc = "An experimental suit of armor with sensitive detectors hooked up to a huge capacitor grid, with emitters strutting out of it. Zap."
|
||||
siemens_coefficient = -1
|
||||
var/tesla_power = 25000
|
||||
var/tesla_range = 20
|
||||
var/tesla_flags = TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE
|
||||
var/zap_power = 25000
|
||||
var/zap_range = 20
|
||||
var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_IS_TESLA
|
||||
|
||||
/obj/item/clothing/suit/armor/reactive/tesla/dropped(mob/user)
|
||||
..()
|
||||
@@ -176,7 +176,7 @@
|
||||
owner.visible_message("<span class='danger'>The tesla capacitors on [owner]'s reactive tesla armor are still recharging! The armor merely emits some sparks.</span>")
|
||||
return
|
||||
owner.visible_message("<span class='danger'>[src] blocks [attack_text], sending out arcs of lightning!</span>")
|
||||
tesla_zap(owner, tesla_range, tesla_power, tesla_flags)
|
||||
tesla_zap(owner, zap_range, zap_power, zap_flags)
|
||||
reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -39,9 +39,9 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
|
||||
if(prob(20))
|
||||
set_broken()
|
||||
|
||||
/obj/machinery/gravity_generator/tesla_act(power, tesla_flags)
|
||||
/obj/machinery/gravity_generator/zap_act(power, zap_flags)
|
||||
..()
|
||||
if(tesla_flags & TESLA_MACHINE_EXPLOSIVE)
|
||||
if(zap_flags & ZAP_MACHINE_EXPLOSIVE)
|
||||
qdel(src)//like the singulo, tesla deletes it. stops it from exploding over and over
|
||||
|
||||
/obj/machinery/gravity_generator/update_icon()
|
||||
|
||||
@@ -725,8 +725,8 @@
|
||||
on = TRUE
|
||||
update()
|
||||
|
||||
/obj/machinery/light/tesla_act(power, tesla_flags)
|
||||
if(tesla_flags & TESLA_MACHINE_EXPLOSIVE)
|
||||
/obj/machinery/light/zap_act(power, zap_flags)
|
||||
if(zap_flags & ZAP_MACHINE_EXPLOSIVE)
|
||||
explosion(src,0,0,0,flame_range = 5, adminlog = 0)
|
||||
qdel(src)
|
||||
else
|
||||
|
||||
@@ -96,6 +96,7 @@
|
||||
/obj/machinery/power/rtg/abductor/fire_act(exposed_temperature, exposed_volume)
|
||||
overload()
|
||||
|
||||
/obj/machinery/power/rtg/abductor/tesla_act()
|
||||
/obj/machinery/power/rtg/abductor/zap_act(tesla_flags)
|
||||
..() //extend the zap
|
||||
overload()
|
||||
if(tesla_flags & ZAP_MACHINE_EXPLOSIVE)
|
||||
overload()
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
#define MOLE_PENALTY_THRESHOLD 1800 //Above this value we can get lord singulo and independent mol damage, below it we can heal damage
|
||||
#define MOLE_HEAT_PENALTY 350 //Heat damage scales around this. Too hot setups with this amount of moles do regular damage, anything above and below is scaled
|
||||
//Along with damage_penalty_point, makes flux anomalies.
|
||||
#define POWER_PENALTY_THRESHOLD 5000 //The cuttoff on power properly doing damage, pulling shit around, and delamming into a tesla. Low chance of pyro anomalies, +2 bolts of electricity
|
||||
#define POWER_PENALTY_THRESHOLD 5000 //The cutoff on power properly doing damage, pulling shit around, and delamming into a tesla. Low chance of pyro anomalies, +2 bolts of electricity
|
||||
#define SEVERE_POWER_PENALTY_THRESHOLD 7000 //+1 bolt of electricity, allows for gravitational anomalies, and higher chances of pyro anomalies
|
||||
#define CRITICAL_POWER_PENALTY_THRESHOLD 9000 //+1 bolt of electricity.
|
||||
#define HEAT_PENALTY_THRESHOLD 40 //Higher == Crystal safe operational temperature is higher.
|
||||
@@ -134,9 +134,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
var/powerloss_dynamic_scaling= 0
|
||||
var/power_transmission_bonus = 0
|
||||
var/mole_heat_penalty = 0
|
||||
|
||||
var/matter_power = 0
|
||||
|
||||
//The cutoff for a bolt jumping, grows with heat, lowers with higher mol count,
|
||||
var/zap_cutoff = 1500
|
||||
//Temporary values so that we can optimize this
|
||||
//How much the bullets damage should be multiplied by when it is added to the internal variables
|
||||
var/config_bullet_energy = 2
|
||||
@@ -388,7 +388,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
|
||||
//caps damage rate
|
||||
|
||||
//Takes the larger between archived damage + (1.8) and damage
|
||||
//Takes the lower number between archived damage + (1.8) and damage
|
||||
//This means we can only deal 1.8 damage per function call
|
||||
damage = min(damage_archived + (DAMAGE_HARDCAP * explosion_point),damage)
|
||||
|
||||
@@ -453,14 +453,14 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
|
||||
var/temp_factor = 50
|
||||
if(gasmix_power_ratio > 0.8)
|
||||
//with a perfect gas mix, make the power less based on heat
|
||||
//with a perfect gas mix, make the power more based on heat
|
||||
icon_state = "[base_icon_state]_glow"
|
||||
else
|
||||
//in normal mode, base the produced energy around the heat
|
||||
//in normal mode, power is less effected by heat
|
||||
temp_factor = 30
|
||||
icon_state = base_icon_state
|
||||
|
||||
//Reiterating the above, if there is more pluox and n2 then anything else, we receive no power increase from heat
|
||||
//if there is more pluox and n2 then anything else, we receive no power increase from heat
|
||||
power = max((removed.temperature * temp_factor / T0C) * gasmix_power_ratio + power, 0)
|
||||
|
||||
if(prob(50))
|
||||
@@ -499,7 +499,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
if(!istype(l.glasses, /obj/item/clothing/glasses/meson))
|
||||
var/D = sqrt(1 / max(1, get_dist(l, src)))
|
||||
l.hallucination += power * config_hallucination_power * D
|
||||
l.hallucination = CLAMP(0, 200, l.hallucination)
|
||||
l.hallucination = CLAMP(l.hallucination, 0, 200)
|
||||
|
||||
for(var/mob/living/l in range(src, round((power / 100) ** 0.25)))
|
||||
var/rads = (power / 10) * sqrt( 1 / max(get_dist(l, src),1) )
|
||||
@@ -507,23 +507,29 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
|
||||
//Transitions between one function and another, one we use for the fast inital startup, the other is used to prevent errors with fusion temperatures.
|
||||
//Use of the second function improves the power gain imparted by using co2
|
||||
power = max(power - min(((power/500)**3) * powerloss_inhibitor, power * 0.83 * powerloss_inhibitor),1)
|
||||
power = max(power - min(((power/500)**3) * powerloss_inhibitor, power * 0.83 * powerloss_inhibitor),0)
|
||||
//After this point power is lowered
|
||||
//This wraps around to the begining of the function
|
||||
//Handle high power zaps/anomaly generation
|
||||
if(power > POWER_PENALTY_THRESHOLD || damage > damage_penalty_point) //If the power is above 5000 or if the damage is above 550
|
||||
|
||||
if(removed && removed.temperature)
|
||||
zap_cutoff = CLAMP(3000 - (power * (env.total_moles()) / 10) / env.return_temperature(), 350, 3000)//If the core is cold, it's easier to jump, ditto if there are a lot of mols
|
||||
else
|
||||
zap_cutoff = 1500
|
||||
//We should always be able to zap our way out of the default enclosure
|
||||
//See supermatter_zap() for more details
|
||||
var/range = CLAMP(power / env.return_pressure() * 10, 2, 8)
|
||||
if(power > POWER_PENALTY_THRESHOLD)
|
||||
playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, TRUE, extrarange = 10)
|
||||
supermatter_zap(src, 5, min(power*2, 20000))
|
||||
supermatter_zap(src, 5, min(power*2, 20000))
|
||||
supermatter_zap(src, range, min(power*2, 20000))
|
||||
supermatter_zap(src, range, min(power*2, 20000))
|
||||
if(power > SEVERE_POWER_PENALTY_THRESHOLD)
|
||||
supermatter_zap(src, 5, min(power*2, 20000))
|
||||
supermatter_zap(src, range, min(power*2, 20000))
|
||||
if(power > CRITICAL_POWER_PENALTY_THRESHOLD)
|
||||
supermatter_zap(src, 5, min(power*2, 20000))
|
||||
supermatter_zap(src, range, min(power*2, 20000))
|
||||
else if (damage > damage_penalty_point && prob(20))
|
||||
playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, TRUE, extrarange = 10)
|
||||
supermatter_zap(src, 5, CLAMP(power*2, 4000, 20000))
|
||||
supermatter_zap(src, range, CLAMP(power*2, 4000, 20000))
|
||||
|
||||
if(prob(15) && power > POWER_PENALTY_THRESHOLD)
|
||||
supermatter_pull(src, power/750)
|
||||
@@ -844,73 +850,95 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
if(PYRO_ANOMALY)
|
||||
new /obj/effect/anomaly/pyro(L, 200)
|
||||
|
||||
/obj/machinery/power/supermatter_crystal/proc/supermatter_zap(atom/zapstart, range = 3, power)
|
||||
/obj/machinery/power/supermatter_crystal/proc/supermatter_zap(atom/zapstart, range = 5, zap_str, list/targets_hit = list())
|
||||
. = zapstart.dir
|
||||
if(power < 1000)
|
||||
//If the strength of the zap decays past the cutoff, we stop
|
||||
if(zap_str < zap_cutoff)
|
||||
return
|
||||
var/target
|
||||
var/list/arctargets = list()
|
||||
//Making a new copy so additons further down the recursion do not mess with other arcs
|
||||
var/list/targets_copy = targets_hit.Copy()
|
||||
//Lets put this ourself into the do not hit list, so we don't curve back to hit the same thing twice with one arc
|
||||
targets_copy += zapstart
|
||||
|
||||
var/target_atom
|
||||
var/mob/living/target_mob
|
||||
var/obj/machinery/target_machine
|
||||
var/obj/structure/target_structure
|
||||
var/list/arctargetsmob = list()
|
||||
var/list/arctargetsmachine = list()
|
||||
var/list/arctargetsstructure = list()
|
||||
for(var/obj/vehicle/ridden/bicycle/bike in oview(zapstart, range))
|
||||
if(!(bike in targets_copy) && !(bike.obj_flags & BEING_SHOCKED) && bike.can_buckle)//God's not on our side cause he hates idiots.
|
||||
arctargets += bike
|
||||
|
||||
if(prob(20)) //let's not hit all the engineers with every beam and/or segment of the arc
|
||||
for(var/mob/living/Z in oview(zapstart, range+2))
|
||||
arctargetsmob += Z
|
||||
if(arctargetsmob.len)
|
||||
var/mob/living/H = pick(arctargetsmob)
|
||||
var/atom/A = H
|
||||
target_mob = H
|
||||
target_atom = A
|
||||
if(!arctargets.len)
|
||||
for(var/obj/machinery/power/tesla_coil/coil in oview(zapstart, range))
|
||||
if(!(coil in targets_copy) && coil.anchored && !(coil.obj_flags & BEING_SHOCKED) && !coil.panel_open && prob(70))//Diversity of death
|
||||
arctargets += coil
|
||||
|
||||
else
|
||||
for(var/obj/machinery/X in oview(zapstart, range+2))
|
||||
arctargetsmachine += X
|
||||
if(arctargetsmachine.len)
|
||||
var/obj/machinery/M = pick(arctargetsmachine)
|
||||
var/atom/A = M
|
||||
target_machine = M
|
||||
target_atom = A
|
||||
if(!arctargets.len)
|
||||
for(var/obj/machinery/power/grounding_rod/rod in oview(zapstart, range))
|
||||
//2 rods are safer then one, intended to keep the bolts dangourus
|
||||
//If the sm puts out 2 bolts every half second, then a rod gets ignored every 5 seconds or so.
|
||||
if(rod.anchored && !rod.panel_open && prob(90))
|
||||
arctargets += rod
|
||||
|
||||
else
|
||||
for(var/obj/structure/Y in oview(zapstart, range+2))
|
||||
arctargetsstructure += Y
|
||||
if(arctargetsstructure.len)
|
||||
var/obj/structure/O = pick(arctargetsstructure)
|
||||
var/atom/A = O
|
||||
target_structure = O
|
||||
target_atom = A
|
||||
if(!arctargets.len)
|
||||
for(var/mob/living/Z in oview(zapstart, range))
|
||||
if(!(Z in targets_copy) && !(HAS_TRAIT(Z, TRAIT_TESLA_SHOCKIMMUNE)) && !(Z.flags_1 & SHOCKED_1) && Z.stat != DEAD && prob(20))//let's not hit all the engineers with every beam and/or segment of the arc
|
||||
arctargets += Z
|
||||
|
||||
if(target_atom)
|
||||
zapstart.Beam(target_atom, icon_state="sm_arc", time=5)
|
||||
var/zapdir = get_dir(zapstart, target_atom)
|
||||
if(!arctargets.len)
|
||||
for(var/obj/machinery/X in oview(zapstart, range))
|
||||
if(!(X in targets_copy) && !(X.obj_flags & BEING_SHOCKED) && prob(40))
|
||||
arctargets += X
|
||||
|
||||
if(!arctargets.len)
|
||||
for(var/obj/Y in oview(zapstart, range))
|
||||
if(!(Y in targets_copy) && !(Y.obj_flags & BEING_SHOCKED))
|
||||
arctargets += Y
|
||||
|
||||
if(arctargets.len)//Pick from our pool
|
||||
target = pick(arctargets)
|
||||
|
||||
if(target)//If we found something
|
||||
//Do the animation to zap to it from here
|
||||
zapstart.Beam(target, icon_state="nzcrentrs_power", time=5)
|
||||
var/zapdir = get_dir(zapstart, target)
|
||||
if(zapdir)
|
||||
. = zapdir
|
||||
|
||||
if(target_mob)
|
||||
target_mob.electrocute_act(rand(5,10), "Supermatter Discharge Bolt", 1, SHOCK_NOSTUN)
|
||||
if(prob(15))
|
||||
supermatter_zap(target_mob, 5, power / 2)
|
||||
supermatter_zap(target_mob, 5, power / 2)
|
||||
else
|
||||
supermatter_zap(target_mob, 5, power / 1.5)
|
||||
if(istype(target, /obj/machinery/power/tesla_coil))
|
||||
var/obj/machinery/power/tesla_coil/coil = target
|
||||
//In the best situation we can expect this to grow up to 540kw before a delam/IT'S GONE TOO FAR FRED SHUT IT DOWN
|
||||
//The formula for power gen is zap_str * 15 / 2 * capacitor rating, between 1 and 4
|
||||
zap_str = coil.zap_act(zap_str * 15, ZAP_SUPERMATTER_FLAGS, list()) //Coils should take a lot out of the power of the zap
|
||||
|
||||
else if(target_machine)
|
||||
if(prob(15))
|
||||
supermatter_zap(target_machine, 5, power / 2)
|
||||
supermatter_zap(target_machine, 5, power / 2)
|
||||
else
|
||||
supermatter_zap(target_machine, 5, power / 1.5)
|
||||
else if(istype(target, /obj/machinery/power/grounding_rod))
|
||||
var/obj/machinery/power/grounding_rod/rod = target
|
||||
//We can expect this to do very little, maybe shock the poor soul buckled to it, but that's all.
|
||||
//This is one of our endpoints, if the bolt hits a grounding rod, it stops jumping
|
||||
rod.zap_act(zap_str, ZAP_SUPERMATTER_FLAGS, list())
|
||||
return
|
||||
|
||||
else if(target_structure)
|
||||
if(prob(15))
|
||||
supermatter_zap(target_structure, 5, power / 2)
|
||||
supermatter_zap(target_structure, 5, power / 2)
|
||||
else if(isliving(target))//If we got a fleshbag on our hands
|
||||
var/mob/living/mob = target
|
||||
mob.set_shocked()
|
||||
addtimer(CALLBACK(mob, /mob/living/proc/reset_shocked), 10)
|
||||
mob.electrocute_act(rand(5,10), "Supermatter Discharge Bolt", 1, SHOCK_NOSTUN)
|
||||
zap_str /= 1.5 //Meatsacks are conductive, makes working in pairs more destructive
|
||||
|
||||
else if(isobj(target))
|
||||
var/obj/junk = target
|
||||
junk.zap_act(zap_str, ZAP_SUPERMATTER_FLAGS, list())
|
||||
zap_str /= 1.8 // worse then living things, better then coils
|
||||
//Then we finish it all up
|
||||
//This gotdamn variable is a boomer and keeps giving me problems
|
||||
var/turf/T = get_turf(target)
|
||||
var/pressure = T.return_air().return_pressure()
|
||||
//We get our range with the strength of the zap and the pressure, the lower the former and the higher the latter the better
|
||||
var/new_range = CLAMP(zap_str / pressure * 10, 2, 7)
|
||||
if(prob(5))
|
||||
zap_str = zap_str - (zap_str/10)
|
||||
supermatter_zap(target, new_range, zap_str, targets_copy)
|
||||
supermatter_zap(target, new_range, zap_str, targets_copy)
|
||||
else
|
||||
supermatter_zap(target_structure, 5, power / 1.5)
|
||||
supermatter_zap(target, new_range, zap_str, targets_copy)
|
||||
|
||||
#undef HALLUCINATION_RANGE
|
||||
#undef GRAVITATIONAL_ANOMALY
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
circuit = /obj/item/circuitboard/machine/tesla_coil
|
||||
|
||||
var/tesla_flags = TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE
|
||||
var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_IS_TESLA
|
||||
var/power_loss = 2
|
||||
var/input_power_multiplier = 1
|
||||
var/zap_cooldown = 100
|
||||
@@ -78,7 +78,7 @@
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/machinery/power/tesla_coil/tesla_act(power, tesla_flags, shocked_targets)
|
||||
/obj/machinery/power/tesla_coil/zap_act(power, zap_flags, shocked_targets)
|
||||
if(anchored && !panel_open)
|
||||
obj_flags |= BEING_SHOCKED
|
||||
//don't lose arc power when it's not connected to anything
|
||||
@@ -86,15 +86,17 @@
|
||||
var/power_produced = powernet ? power / power_loss : power
|
||||
add_avail(power_produced*input_power_multiplier)
|
||||
flick("coilhit", src)
|
||||
playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
|
||||
tesla_zap(src, 5, power_produced, tesla_flags, shocked_targets)
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_ENG)
|
||||
if(D)
|
||||
D.adjust_money(min(power_produced, 1))
|
||||
if(istype(linked_techweb))
|
||||
linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min(power_produced, 1)) // x4 coils = ~240/m point bonus for R&D
|
||||
addtimer(CALLBACK(src, .proc/reset_shocked), 10)
|
||||
tesla_buckle_check(power)
|
||||
zap_buckle_check(power)
|
||||
playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
|
||||
if(!(zap_flags & ZAP_IS_TESLA))
|
||||
return power_produced
|
||||
tesla_zap(src, 5, power_produced, zap_flags, shocked_targets)
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -107,8 +109,8 @@
|
||||
var/power = (powernet.avail/2)
|
||||
add_load(power)
|
||||
playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
|
||||
tesla_zap(src, 10, power/(coeff/2), tesla_flags)
|
||||
tesla_buckle_check(power/(coeff/2))
|
||||
tesla_zap(src, 10, power/(coeff/2), zap_flags)
|
||||
zap_buckle_check(power/(coeff/2))
|
||||
|
||||
// Tesla R&D researcher
|
||||
/obj/machinery/power/tesla_coil/research
|
||||
@@ -118,21 +120,23 @@
|
||||
circuit = /obj/item/circuitboard/machine/tesla_coil/research
|
||||
power_loss = 20 // something something, high voltage + resistance
|
||||
|
||||
/obj/machinery/power/tesla_coil/research/tesla_act(power, tesla_flags, shocked_things)
|
||||
/obj/machinery/power/tesla_coil/research/zap_act(power, zap_flags, shocked_targets)
|
||||
if(anchored && !panel_open)
|
||||
obj_flags |= BEING_SHOCKED
|
||||
var/power_produced = powernet ? power / power_loss : power
|
||||
add_avail(power_produced*input_power_multiplier)
|
||||
flick("rpcoilhit", src)
|
||||
playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
|
||||
tesla_zap(src, 5, power_produced, tesla_flags, shocked_things)
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_ENG)
|
||||
if(D)
|
||||
D.adjust_money(min(power_produced, 3))
|
||||
if(istype(linked_techweb))
|
||||
linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min(power_produced, 3)) // x4 coils with a pulse per second or so = ~720/m point bonus for R&D
|
||||
addtimer(CALLBACK(src, .proc/reset_shocked), 10)
|
||||
tesla_buckle_check(power)
|
||||
zap_buckle_check(power)
|
||||
playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
|
||||
if(!(zap_flags & ZAP_IS_TESLA))
|
||||
return power_produced
|
||||
tesla_zap(src, 5, power_produced, zap_flags, shocked_targets)
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -185,9 +189,9 @@
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/machinery/power/grounding_rod/tesla_act(var/power)
|
||||
/obj/machinery/power/grounding_rod/zap_act(var/power)
|
||||
if(anchored && !panel_open)
|
||||
flick("grounding_rodhit", src)
|
||||
tesla_buckle_check(power)
|
||||
zap_buckle_check(power)
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -168,20 +168,25 @@
|
||||
var/mob/living/carbon/C = A
|
||||
C.dust()
|
||||
|
||||
/proc/tesla_zap(atom/source, zap_range = 3, power, tesla_flags = TESLA_DEFAULT_FLAGS, list/shocked_targets)
|
||||
/proc/tesla_zap(atom/source, zap_range = 3, power, zap_flags = ZAP_DEFAULT_FLAGS, list/shocked_targets)
|
||||
. = source.dir
|
||||
if(power < 1000)
|
||||
return
|
||||
|
||||
/*
|
||||
THIS IS SO FUCKING UGLY AND I HATE IT, but I can't make it nice without making it slower, check*N rather then n. So we're stuck with it.
|
||||
*/
|
||||
var/closest_dist = 0
|
||||
var/closest_atom
|
||||
var/obj/vehicle/ridden/bicycle/closest_million_dollar_baby
|
||||
var/obj/machinery/power/tesla_coil/closest_tesla_coil
|
||||
var/obj/machinery/power/grounding_rod/closest_grounding_rod
|
||||
var/obj/vehicle/ridden/bicycle/closest_rideable
|
||||
var/mob/living/closest_mob
|
||||
var/obj/machinery/closest_machine
|
||||
var/obj/structure/closest_structure
|
||||
var/obj/structure/blob/closest_blob
|
||||
var/static/things_to_shock = typecacheof(list(/obj/machinery, /mob/living, /obj/structure))
|
||||
var/static/things_to_shock = typecacheof(list(/obj/machinery, /mob/living, /obj/structure, /obj/vehicle/ridden))
|
||||
var/static/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
|
||||
/obj/machinery/power/emitter,
|
||||
/obj/machinery/field/generator,
|
||||
@@ -206,23 +211,32 @@
|
||||
/obj/structure/frame/machine))
|
||||
|
||||
for(var/A in typecache_filter_multi_list_exclusion(oview(source, zap_range+2), things_to_shock, blacklisted_tesla_types))
|
||||
if(!(tesla_flags & TESLA_ALLOW_DUPLICATES) && LAZYACCESS(shocked_targets, A))
|
||||
if(!(zap_flags & ZAP_ALLOW_DUPLICATES) && LAZYACCESS(shocked_targets, A))
|
||||
continue
|
||||
|
||||
if(istype(A, /obj/machinery/power/tesla_coil))
|
||||
if(istype(A, /obj/vehicle/ridden/bicycle))//God's not on our side cause he hates idiots.
|
||||
var/dist = get_dist(source, A)
|
||||
var/obj/vehicle/ridden/bicycle/B = A
|
||||
if(dist <= zap_range && (dist < closest_dist || !closest_million_dollar_baby) && !(B.obj_flags & BEING_SHOCKED) && B.can_buckle)//Gee goof thanks for the boolean
|
||||
closest_dist = dist
|
||||
//we use both of these to save on istype and typecasting overhead later on
|
||||
//while still allowing common code to run before hand
|
||||
closest_million_dollar_baby = B
|
||||
closest_atom = B
|
||||
|
||||
else if(closest_million_dollar_baby)
|
||||
continue //no need checking these other things
|
||||
|
||||
else if(istype(A, /obj/machinery/power/tesla_coil))
|
||||
var/dist = get_dist(source, A)
|
||||
var/obj/machinery/power/tesla_coil/C = A
|
||||
if(dist <= zap_range && (dist < closest_dist || !closest_tesla_coil) && !(C.obj_flags & BEING_SHOCKED))
|
||||
closest_dist = dist
|
||||
|
||||
//we use both of these to save on istype and typecasting overhead later on
|
||||
//while still allowing common code to run before hand
|
||||
closest_tesla_coil = C
|
||||
closest_atom = C
|
||||
|
||||
|
||||
else if(closest_tesla_coil)
|
||||
continue //no need checking these other things
|
||||
continue
|
||||
|
||||
else if(istype(A, /obj/machinery/power/grounding_rod))
|
||||
var/dist = get_dist(source, A)-2
|
||||
@@ -234,10 +248,21 @@
|
||||
else if(closest_grounding_rod)
|
||||
continue
|
||||
|
||||
else if(istype(A,/obj/vehicle/ridden))
|
||||
var/dist = get_dist(source, A)
|
||||
var/obj/vehicle/ridden/R = A
|
||||
if(dist <= zap_range && (dist < closest_dist || !closest_rideable) && R.can_buckle && !(R.obj_flags & BEING_SHOCKED))
|
||||
closest_rideable = R
|
||||
closest_atom = A
|
||||
closest_dist = dist
|
||||
|
||||
else if(closest_rideable)
|
||||
continue
|
||||
|
||||
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 && !(HAS_TRAIT(L, TRAIT_TESLA_SHOCKIMMUNE)))
|
||||
if(dist <= zap_range && (dist < closest_dist || !closest_mob) && L.stat != DEAD && !(HAS_TRAIT(L, TRAIT_TESLA_SHOCKIMMUNE)) && !(L.flags_1 & SHOCKED_1))
|
||||
closest_mob = L
|
||||
closest_atom = A
|
||||
closest_dist = dist
|
||||
@@ -259,7 +284,7 @@
|
||||
else if(istype(A, /obj/structure/blob))
|
||||
var/obj/structure/blob/B = A
|
||||
var/dist = get_dist(source, A)
|
||||
if(dist <= zap_range && (dist < closest_dist || !closest_tesla_coil) && !(B.obj_flags & BEING_SHOCKED))
|
||||
if(dist <= zap_range && (dist < closest_dist || !closest_blob) && !(B.obj_flags & BEING_SHOCKED))
|
||||
closest_blob = B
|
||||
closest_atom = A
|
||||
closest_dist = dist
|
||||
@@ -270,47 +295,53 @@
|
||||
else if(isstructure(A))
|
||||
var/obj/structure/S = A
|
||||
var/dist = get_dist(source, A)
|
||||
if(dist <= zap_range && (dist < closest_dist || !closest_tesla_coil) && !(S.obj_flags & BEING_SHOCKED))
|
||||
//There's no closest_structure here because there are no checks below this one, re-add it if that changes
|
||||
if(dist <= zap_range && (dist < closest_dist) && !(S.obj_flags & BEING_SHOCKED))
|
||||
closest_structure = S
|
||||
closest_atom = A
|
||||
closest_dist = dist
|
||||
|
||||
else if(closest_structure)
|
||||
continue
|
||||
|
||||
//Alright, we've done our loop, now lets see if was anything interesting in range
|
||||
if(closest_atom)
|
||||
//common stuff
|
||||
source.Beam(closest_atom, icon_state="lightning[rand(1,12)]", time=5, maxdistance = INFINITY)
|
||||
if(!(tesla_flags & TESLA_ALLOW_DUPLICATES))
|
||||
if(!(zap_flags & ZAP_ALLOW_DUPLICATES))
|
||||
LAZYSET(shocked_targets, closest_atom, TRUE)
|
||||
var/zapdir = get_dir(source, closest_atom)
|
||||
if(zapdir)
|
||||
. = zapdir
|
||||
|
||||
//per type stuff:
|
||||
if(!QDELETED(closest_tesla_coil))
|
||||
closest_tesla_coil.tesla_act(power, tesla_flags, shocked_targets)
|
||||
if(!QDELETED(closest_million_dollar_baby))
|
||||
closest_million_dollar_baby.zap_act(power, zap_flags, shocked_targets)
|
||||
|
||||
else if(!QDELETED(closest_tesla_coil))
|
||||
closest_tesla_coil.zap_act(power, zap_flags, shocked_targets)
|
||||
|
||||
else if(!QDELETED(closest_grounding_rod))
|
||||
closest_grounding_rod.tesla_act(power, tesla_flags, shocked_targets)
|
||||
closest_grounding_rod.zap_act(power, zap_flags, shocked_targets)
|
||||
|
||||
else if(!QDELETED(closest_rideable))
|
||||
closest_rideable.zap_act(power, zap_flags, shocked_targets)
|
||||
|
||||
else if(!QDELETED(closest_mob))
|
||||
var/shock_damage = (tesla_flags & TESLA_MOB_DAMAGE)? (min(round(power/600), 90) + rand(-5, 5)) : 0
|
||||
closest_mob.electrocute_act(shock_damage, source, 1, SHOCK_TESLA | ((tesla_flags & TESLA_MOB_STUN) ? NONE : SHOCK_NOSTUN))
|
||||
closest_mob.set_shocked()
|
||||
addtimer(CALLBACK(closest_mob, /mob/living/proc/reset_shocked), 10)
|
||||
var/shock_damage = (zap_flags & ZAP_MOB_DAMAGE)? (min(round(power/600), 90) + rand(-5, 5)) : 0
|
||||
closest_mob.electrocute_act(shock_damage, source, 1, SHOCK_TESLA | ((zap_flags & ZAP_MOB_STUN) ? NONE : SHOCK_NOSTUN))
|
||||
if(issilicon(closest_mob))
|
||||
var/mob/living/silicon/S = closest_mob
|
||||
if((tesla_flags & TESLA_MOB_STUN) && (tesla_flags & TESLA_MOB_DAMAGE))
|
||||
if((zap_flags & ZAP_MOB_STUN) && (zap_flags & ZAP_MOB_DAMAGE))
|
||||
S.emp_act(EMP_LIGHT)
|
||||
tesla_zap(S, 7, power / 1.5, tesla_flags, shocked_targets) // metallic folks bounce it further
|
||||
tesla_zap(S, 7, power / 1.5, zap_flags, shocked_targets) // metallic folks bounce it further
|
||||
else
|
||||
tesla_zap(closest_mob, 5, power / 1.5, tesla_flags, shocked_targets)
|
||||
tesla_zap(closest_mob, 5, power / 1.5, zap_flags, shocked_targets)
|
||||
|
||||
else if(!QDELETED(closest_machine))
|
||||
closest_machine.tesla_act(power, tesla_flags, shocked_targets)
|
||||
closest_machine.zap_act(power, zap_flags, shocked_targets)
|
||||
|
||||
else if(!QDELETED(closest_blob))
|
||||
closest_blob.tesla_act(power, tesla_flags, shocked_targets)
|
||||
closest_blob.zap_act(power, zap_flags, shocked_targets)
|
||||
|
||||
else if(!QDELETED(closest_structure))
|
||||
closest_structure.tesla_act(power, tesla_flags, shocked_targets)
|
||||
closest_structure.zap_act(power, zap_flags, shocked_targets)
|
||||
|
||||
@@ -5,6 +5,6 @@
|
||||
icon_state = "TheSingGen"
|
||||
creation_type = /obj/singularity/energy_ball
|
||||
|
||||
/obj/machinery/the_singularitygen/tesla/tesla_act(power, tesla_flags)
|
||||
if(tesla_flags & TESLA_MACHINE_EXPLOSIVE)
|
||||
/obj/machinery/the_singularitygen/tesla/zap_act(power, zap_flags)
|
||||
if(zap_flags & ZAP_MACHINE_EXPLOSIVE)
|
||||
energy += power
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
icon_state = "tesla_projectile"
|
||||
impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
|
||||
var/chain
|
||||
var/tesla_flags = TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE
|
||||
var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_IS_TESLA
|
||||
var/zap_range = 3
|
||||
var/power = 10000
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
/obj/projectile/energy/tesla/on_hit(atom/target)
|
||||
. = ..()
|
||||
tesla_zap(target, zap_range, power, tesla_flags)
|
||||
tesla_zap(target, zap_range, power, zap_flags)
|
||||
qdel(src)
|
||||
|
||||
/obj/projectile/energy/tesla/Destroy()
|
||||
|
||||
@@ -625,9 +625,9 @@
|
||||
speed = 0.3
|
||||
flag = "magic"
|
||||
|
||||
var/tesla_power = 20000
|
||||
var/tesla_range = 15
|
||||
var/tesla_flags = TESLA_MOB_DAMAGE | TESLA_MOB_STUN | TESLA_OBJ_DAMAGE
|
||||
var/zap_power = 20000
|
||||
var/zap_range = 15
|
||||
var/zap_flags = ZAP_MOB_DAMAGE | ZAP_MOB_STUN | ZAP_OBJ_DAMAGE | ZAP_IS_TESLA
|
||||
var/chain
|
||||
var/mob/living/caster
|
||||
|
||||
@@ -644,7 +644,7 @@
|
||||
visible_message("<span class='warning'>[src] fizzles on contact with [target]!</span>")
|
||||
qdel(src)
|
||||
return BULLET_ACT_BLOCK
|
||||
tesla_zap(src, tesla_range, tesla_power, tesla_flags)
|
||||
tesla_zap(src, zap_range, zap_power, zap_flags)
|
||||
qdel(src)
|
||||
|
||||
/obj/projectile/magic/aoe/lightning/Destroy()
|
||||
|
||||
@@ -520,7 +520,7 @@
|
||||
modifier = -100
|
||||
mix_message = "<span class='boldannounce'>The teslium starts to spark as electricity arcs away from it!</span>"
|
||||
mix_sound = 'sound/machines/defib_zap.ogg'
|
||||
var/tesla_flags = TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE | TESLA_MOB_STUN
|
||||
var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN | ZAP_IS_TESLA
|
||||
|
||||
/datum/chemical_reaction/reagent_explosion/teslium_lightning/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/T1 = created_volume * 20 //100 units : Zap 3 times, with powers 2000/5000/12000. Tesla revolvers have a power of 10000 for comparison.
|
||||
@@ -528,15 +528,15 @@
|
||||
var/T3 = created_volume * 120
|
||||
sleep(5)
|
||||
if(created_volume >= 75)
|
||||
tesla_zap(holder.my_atom, 7, T1, tesla_flags)
|
||||
tesla_zap(holder.my_atom, 7, T1, zap_flags)
|
||||
playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, TRUE)
|
||||
sleep(15)
|
||||
if(created_volume >= 40)
|
||||
tesla_zap(holder.my_atom, 7, T2, tesla_flags)
|
||||
tesla_zap(holder.my_atom, 7, T2, zap_flags)
|
||||
playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, TRUE)
|
||||
sleep(15)
|
||||
if(created_volume >= 10) //10 units minimum for lightning, 40 units for secondary blast, 75 units for tertiary blast.
|
||||
tesla_zap(holder.my_atom, 7, T3, tesla_flags)
|
||||
tesla_zap(holder.my_atom, 7, T3, zap_flags)
|
||||
playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, TRUE)
|
||||
..()
|
||||
|
||||
|
||||
@@ -77,9 +77,10 @@
|
||||
/obj/structure/reagent_dispensers/fueltank/fire_act(exposed_temperature, exposed_volume)
|
||||
boom()
|
||||
|
||||
/obj/structure/reagent_dispensers/fueltank/tesla_act()
|
||||
/obj/structure/reagent_dispensers/fueltank/zap_act(zap_flags)
|
||||
..() //extend the zap
|
||||
boom()
|
||||
if(ZAP_OBJ_DAMAGE & zap_flags)
|
||||
boom()
|
||||
|
||||
/obj/structure/reagent_dispensers/fueltank/bullet_act(obj/projectile/P)
|
||||
. = ..()
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
action_icon_state = "lightning0"
|
||||
sound = 'sound/magic/lightningbolt.ogg'
|
||||
active = FALSE
|
||||
projectile_var_overrides = list("tesla_range" = 15, "tesla_power" = 20000, "tesla_flags" = TESLA_MOB_DAMAGE)
|
||||
projectile_var_overrides = list("zap_range" = 15, "zap_power" = 20000, "zap_flags" = ZAP_MOB_DAMAGE | ZAP_IS_TESLA)
|
||||
active_msg = "You energize your hand with arcane lightning!"
|
||||
deactive_msg = "You let the energy flow out of your hands back into yourself..."
|
||||
projectile_type = /obj/projectile/magic/aoe/lightning
|
||||
|
||||
@@ -11,10 +11,12 @@
|
||||
D.vehicle_move_delay = 0
|
||||
|
||||
|
||||
/obj/vehicle/ridden/bicycle/tesla_act() // :::^^^)))
|
||||
/obj/vehicle/ridden/bicycle/zap_act(zap_str, zap_flags, shocked_targets) // :::^^^)))
|
||||
//This didn't work for 3 years because none ever tested it I hate life
|
||||
name = "fried bicycle"
|
||||
desc = "Well spent."
|
||||
color = rgb(63, 23, 4)
|
||||
can_buckle = FALSE
|
||||
. = ..()
|
||||
for(var/m in buckled_mobs)
|
||||
unbuckle_mob(m,1)
|
||||
|
||||
@@ -100,3 +100,7 @@
|
||||
if(!force && occupant_amount() >= max_occupants)
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/obj/vehicle/ridden/zap_act(zap_str, zap_flags, shocked_targets)
|
||||
zap_buckle_check(zap_str)
|
||||
. = ..()
|
||||
|
||||
Reference in New Issue
Block a user