Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 25 additions & 28 deletions code/modules/power/tesla/coil.dm
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,16 @@
circuit = /obj/item/circuitboard/machine/tesla_coil

var/tesla_flags = TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE
var/power_loss = 2
var/input_power_multiplier = 1
var/percentage_power_loss = 0 // 0-1. Regular coils don't have power loss.
var/input_power_multiplier = 0
var/zap_cooldown = 100
var/last_zap = 0

var/datum/techweb/linked_techweb
var/research_points_per_zap = 2 // Research points gained per minute is indirectly buffed by having a lower zap cooldown.
// level 1 coil: 15/m, level coil 2: 20/m, level coil 3: 30/m, level coil 4: 60/m

var/datum/bank_account/linked_account
var/money_per_zap = 2 // This is tied to coil cooldown in the same way research points are.

/obj/machinery/power/tesla_coil/power
circuit = /obj/item/circuitboard/machine/tesla_coil/power
Expand All @@ -28,14 +32,14 @@
. = ..()
wires = new /datum/wires/tesla_coil(src)
linked_techweb = SSresearch.science_tech
linked_account = SSeconomy.get_dep_account(ACCOUNT_ENG)

/obj/machinery/power/tesla_coil/RefreshParts()
var/power_multiplier = 0
input_power_multiplier = 0
zap_cooldown = 100
for(var/obj/item/stock_parts/capacitor/C in component_parts)
power_multiplier += C.rating
zap_cooldown -= (C.rating * 20)
input_power_multiplier = power_multiplier
input_power_multiplier += C.rating // Each level increases power gain by 100%
zap_cooldown -= (C.rating * 20) // Each level decreases cooldown by 2 seconds

/obj/machinery/power/tesla_coil/examine(mob/user)
. = ..()
Expand Down Expand Up @@ -77,27 +81,21 @@
/obj/machinery/power/tesla_coil/tesla_act(power, tesla_flags, shocked_targets)
if(anchored && !panel_open)
obj_flags |= BEING_SHOCKED
//don't lose arc power when it's not connected to anything
//please place tesla coils all around the station to maximize effectiveness
var/power_produced = powernet ? power / power_loss : power
add_avail(power_produced*input_power_multiplier)
add_avail((power * (1 - percentage_power_loss))*input_power_multiplier)
flick("coilhit", src)
playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, 1, 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_account))
linked_account.adjust_money(money_per_zap)
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)
linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, research_points_per_zap)
addtimer(CALLBACK(src, .proc/reset_shocked), zap_cooldown)
tesla_buckle_check(power)
else
..()

/obj/machinery/power/tesla_coil/proc/zap()
if((last_zap + zap_cooldown) > world.time || !powernet)
if(!powernet)
return FALSE
last_zap = world.time
var/coeff = (20 - ((input_power_multiplier - 1) * 3))
coeff = max(coeff, 10)
var/power = (powernet.avail/2)
Expand All @@ -112,22 +110,21 @@
desc = "A modified Tesla Coil used to study the effects of Edison's Bane for research."
icon_state = "rpcoil0"
circuit = /obj/item/circuitboard/machine/tesla_coil/research
power_loss = 20 // something something, high voltage + resistance
percentage_power_loss = 0.95 // Research coils lose 95% of the power (converting power to research or something idk)
research_points_per_zap = 6 // level 1 coil: 44/m, level coil 2: 60/m, level coil 3: 90/m, level coil 4: 180/m
money_per_zap = 6

/obj/machinery/power/tesla_coil/research/tesla_act(power, tesla_flags, shocked_things)
if(anchored && !panel_open)
obj_flags |= BEING_SHOCKED
var/power_produced = powernet ? power / power_loss : power
add_avail(power_produced*input_power_multiplier)
add_avail((power * (1 - percentage_power_loss))*input_power_multiplier)
flick("rpcoilhit", src)
playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, 1, 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_account))
linked_account.adjust_money(money_per_zap)
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)
linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, research_points_per_zap)
addtimer(CALLBACK(src, .proc/reset_shocked), zap_cooldown)
tesla_buckle_check(power)
else
..()
Expand Down
22 changes: 11 additions & 11 deletions code/modules/power/tesla/energy_ball.dm
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,7 @@
for (var/ball in orbiting_balls)
if(prob(80)) //tesla nerf/reducing lag, each miniball now has only 20% to trigger the zap
continue
var/range = rand(1, clamp(orbiting_balls.len, 3, zap_range))
tesla_zap(ball, range, TESLA_MINI_POWER/7*range)
tesla_zap(ball, rand(2, zap_range), TESLA_MINI_POWER)
else
energy = 0 // ensure we dont have miniballs of miniballs

Expand Down Expand Up @@ -130,6 +129,11 @@
/obj/singularity/energy_ball/proc/new_mini_ball()
if(!loc)
return
// Timers can be added fast enough that the max_balls check in handle_energy will "fail".
// Timers aren't accounted for in that check so it will add more timers to make more miniballs.
if(orbiting_balls.len >= max_balls)
return

var/obj/singularity/energy_ball/EB = new(loc, 0, TRUE)

EB.transform *= pick(0.3, 0.4, 0.5, 0.6, 0.7)
Expand Down Expand Up @@ -223,12 +227,14 @@
/obj/machinery/the_singularitygen/tesla,
/obj/structure/frame/machine))

for(var/A in typecache_filter_multi_list_exclusion(oview(source, zap_range+2), things_to_shock, blacklisted_tesla_types))
// +3 to range specifically to include grounding rods that are zap_range+3 away
for(var/A in typecache_filter_multi_list_exclusion(oview(source, zap_range+3), things_to_shock, blacklisted_tesla_types))
if(!(tesla_flags & TESLA_ALLOW_DUPLICATES) && LAZYACCESS(shocked_targets, A))
continue

var/dist = get_dist(source, A)

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
Expand All @@ -238,13 +244,11 @@
closest_tesla_coil = C
closest_atom = C


else if(closest_tesla_coil)
continue //no need checking these other things

else if(istype(A, /obj/machinery/power/grounding_rod))
var/dist = get_dist(source, A)-2
if(dist <= zap_range && (dist < closest_dist || !closest_grounding_rod))
if(dist < closest_dist || !closest_grounding_rod)
closest_grounding_rod = A
closest_atom = A
closest_dist = dist
Expand All @@ -253,7 +257,6 @@
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 && !(L.flags_1 & TESLA_IGNORE_1))
closest_mob = L
Expand All @@ -265,7 +268,6 @@

else if(ismachinery(A))
var/obj/machinery/M = A
var/dist = get_dist(source, A)
if(dist <= zap_range && (dist < closest_dist || !closest_machine) && !(M.obj_flags & BEING_SHOCKED))
closest_machine = M
closest_atom = A
Expand All @@ -276,7 +278,6 @@

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))
closest_blob = B
closest_atom = A
Expand All @@ -287,7 +288,6 @@

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))
closest_structure = S
closest_atom = A
Expand Down