Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.

Commit fbcf464

Browse files
authored
Minor Changes to Tesla Mechanics (#11526)
* Minor change to tesla mechanics Tesla Miniball maximum now properly enforced. Miniball power output no longer tied to zap range. Zap range standardized across objects and minimum range increased to 2. Tesla Coils no longer cause zaps to jump. Coil cooldown restrictions actually work now. Research/money gain adjusted to compensate for cooldown restrictions. * Fix Tesla blowing holes in the station * I should slow down
1 parent 24a2d9a commit fbcf464

2 files changed

Lines changed: 36 additions & 39 deletions

File tree

code/modules/power/tesla/coil.dm

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,16 @@
1414
circuit = /obj/item/circuitboard/machine/tesla_coil
1515

1616
var/tesla_flags = TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE
17-
var/power_loss = 2
18-
var/input_power_multiplier = 1
17+
var/percentage_power_loss = 0 // 0-1. Regular coils don't have power loss.
18+
var/input_power_multiplier = 0
1919
var/zap_cooldown = 100
20-
var/last_zap = 0
2120

2221
var/datum/techweb/linked_techweb
22+
var/research_points_per_zap = 2 // Research points gained per minute is indirectly buffed by having a lower zap cooldown.
23+
// level 1 coil: 15/m, level coil 2: 20/m, level coil 3: 30/m, level coil 4: 60/m
24+
25+
var/datum/bank_account/linked_account
26+
var/money_per_zap = 2 // This is tied to coil cooldown in the same way research points are.
2327

2428
/obj/machinery/power/tesla_coil/power
2529
circuit = /obj/item/circuitboard/machine/tesla_coil/power
@@ -28,14 +32,14 @@
2832
. = ..()
2933
wires = new /datum/wires/tesla_coil(src)
3034
linked_techweb = SSresearch.science_tech
35+
linked_account = SSeconomy.get_dep_account(ACCOUNT_ENG)
3136

3237
/obj/machinery/power/tesla_coil/RefreshParts()
33-
var/power_multiplier = 0
38+
input_power_multiplier = 0
3439
zap_cooldown = 100
3540
for(var/obj/item/stock_parts/capacitor/C in component_parts)
36-
power_multiplier += C.rating
37-
zap_cooldown -= (C.rating * 20)
38-
input_power_multiplier = power_multiplier
41+
input_power_multiplier += C.rating // Each level increases power gain by 100%
42+
zap_cooldown -= (C.rating * 20) // Each level decreases cooldown by 2 seconds
3943

4044
/obj/machinery/power/tesla_coil/examine(mob/user)
4145
. = ..()
@@ -77,27 +81,21 @@
7781
/obj/machinery/power/tesla_coil/tesla_act(power, tesla_flags, shocked_targets)
7882
if(anchored && !panel_open)
7983
obj_flags |= BEING_SHOCKED
80-
//don't lose arc power when it's not connected to anything
81-
//please place tesla coils all around the station to maximize effectiveness
82-
var/power_produced = powernet ? power / power_loss : power
83-
add_avail(power_produced*input_power_multiplier)
84+
add_avail((power * (1 - percentage_power_loss))*input_power_multiplier)
8485
flick("coilhit", src)
8586
playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, 1, extrarange = 5)
86-
tesla_zap(src, 5, power_produced, tesla_flags, shocked_targets)
87-
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_ENG)
88-
if(D)
89-
D.adjust_money(min(power_produced, 1))
87+
if(istype(linked_account))
88+
linked_account.adjust_money(money_per_zap)
9089
if(istype(linked_techweb))
91-
linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min(power_produced, 1)) // x4 coils = ~240/m point bonus for R&D
92-
addtimer(CALLBACK(src, .proc/reset_shocked), 10)
90+
linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, research_points_per_zap)
91+
addtimer(CALLBACK(src, .proc/reset_shocked), zap_cooldown)
9392
tesla_buckle_check(power)
9493
else
9594
..()
9695

9796
/obj/machinery/power/tesla_coil/proc/zap()
98-
if((last_zap + zap_cooldown) > world.time || !powernet)
97+
if(!powernet)
9998
return FALSE
100-
last_zap = world.time
10199
var/coeff = (20 - ((input_power_multiplier - 1) * 3))
102100
coeff = max(coeff, 10)
103101
var/power = (powernet.avail/2)
@@ -112,22 +110,21 @@
112110
desc = "A modified Tesla Coil used to study the effects of Edison's Bane for research."
113111
icon_state = "rpcoil0"
114112
circuit = /obj/item/circuitboard/machine/tesla_coil/research
115-
power_loss = 20 // something something, high voltage + resistance
113+
percentage_power_loss = 0.95 // Research coils lose 95% of the power (converting power to research or something idk)
114+
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
115+
money_per_zap = 6
116116

117117
/obj/machinery/power/tesla_coil/research/tesla_act(power, tesla_flags, shocked_things)
118118
if(anchored && !panel_open)
119119
obj_flags |= BEING_SHOCKED
120-
var/power_produced = powernet ? power / power_loss : power
121-
add_avail(power_produced*input_power_multiplier)
120+
add_avail((power * (1 - percentage_power_loss))*input_power_multiplier)
122121
flick("rpcoilhit", src)
123122
playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, 1, extrarange = 5)
124-
tesla_zap(src, 5, power_produced, tesla_flags, shocked_things)
125-
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_ENG)
126-
if(D)
127-
D.adjust_money(min(power_produced, 3))
123+
if(istype(linked_account))
124+
linked_account.adjust_money(money_per_zap)
128125
if(istype(linked_techweb))
129-
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
130-
addtimer(CALLBACK(src, .proc/reset_shocked), 10)
126+
linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, research_points_per_zap)
127+
addtimer(CALLBACK(src, .proc/reset_shocked), zap_cooldown)
131128
tesla_buckle_check(power)
132129
else
133130
..()

code/modules/power/tesla/energy_ball.dm

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,7 @@
7272
for (var/ball in orbiting_balls)
7373
if(prob(80)) //tesla nerf/reducing lag, each miniball now has only 20% to trigger the zap
7474
continue
75-
var/range = rand(1, clamp(orbiting_balls.len, 3, zap_range))
76-
tesla_zap(ball, range, TESLA_MINI_POWER/7*range)
75+
tesla_zap(ball, rand(2, zap_range), TESLA_MINI_POWER)
7776
else
7877
energy = 0 // ensure we dont have miniballs of miniballs
7978

@@ -130,6 +129,11 @@
130129
/obj/singularity/energy_ball/proc/new_mini_ball()
131130
if(!loc)
132131
return
132+
// Timers can be added fast enough that the max_balls check in handle_energy will "fail".
133+
// Timers aren't accounted for in that check so it will add more timers to make more miniballs.
134+
if(orbiting_balls.len >= max_balls)
135+
return
136+
133137
var/obj/singularity/energy_ball/EB = new(loc, 0, TRUE)
134138

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

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

235+
var/dist = get_dist(source, A)
236+
230237
if(istype(A, /obj/machinery/power/tesla_coil))
231-
var/dist = get_dist(source, A)
232238
var/obj/machinery/power/tesla_coil/C = A
233239
if(dist <= zap_range && (dist < closest_dist || !closest_tesla_coil) && !(C.obj_flags & BEING_SHOCKED))
234240
closest_dist = dist
@@ -238,13 +244,11 @@
238244
closest_tesla_coil = C
239245
closest_atom = C
240246

241-
242247
else if(closest_tesla_coil)
243248
continue //no need checking these other things
244249

245250
else if(istype(A, /obj/machinery/power/grounding_rod))
246-
var/dist = get_dist(source, A)-2
247-
if(dist <= zap_range && (dist < closest_dist || !closest_grounding_rod))
251+
if(dist < closest_dist || !closest_grounding_rod)
248252
closest_grounding_rod = A
249253
closest_atom = A
250254
closest_dist = dist
@@ -253,7 +257,6 @@
253257
continue
254258

255259
else if(isliving(A))
256-
var/dist = get_dist(source, A)
257260
var/mob/living/L = A
258261
if(dist <= zap_range && (dist < closest_dist || !closest_mob) && L.stat != DEAD && !(L.flags_1 & TESLA_IGNORE_1))
259262
closest_mob = L
@@ -265,7 +268,6 @@
265268

266269
else if(ismachinery(A))
267270
var/obj/machinery/M = A
268-
var/dist = get_dist(source, A)
269271
if(dist <= zap_range && (dist < closest_dist || !closest_machine) && !(M.obj_flags & BEING_SHOCKED))
270272
closest_machine = M
271273
closest_atom = A
@@ -276,7 +278,6 @@
276278

277279
else if(istype(A, /obj/structure/blob))
278280
var/obj/structure/blob/B = A
279-
var/dist = get_dist(source, A)
280281
if(dist <= zap_range && (dist < closest_dist || !closest_tesla_coil) && !(B.obj_flags & BEING_SHOCKED))
281282
closest_blob = B
282283
closest_atom = A
@@ -287,7 +288,6 @@
287288

288289
else if(isstructure(A))
289290
var/obj/structure/S = A
290-
var/dist = get_dist(source, A)
291291
if(dist <= zap_range && (dist < closest_dist || !closest_tesla_coil) && !(S.obj_flags & BEING_SHOCKED))
292292
closest_structure = S
293293
closest_atom = A

0 commit comments

Comments
 (0)