From 28a6439448792be900c2daba02ae4b092e25d5d1 Mon Sep 17 00:00:00 2001 From: Asdjky <36432064+Asdjky@users.noreply.github.com> Date: Mon, 24 May 2021 15:46:39 -0700 Subject: [PATCH 1/3] 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. --- code/modules/power/tesla/coil.dm | 53 ++++++++++++------------- code/modules/power/tesla/energy_ball.dm | 31 ++++++++------- 2 files changed, 41 insertions(+), 43 deletions(-) diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index 3f05b4eb5122..f3d641437377 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -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 @@ -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) . = ..() @@ -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) @@ -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 ..() diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 5da38a4378f4..cdea8688bd61 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -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 @@ -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) @@ -227,10 +231,13 @@ if(!(tesla_flags & TESLA_ALLOW_DUPLICATES) && LAZYACCESS(shocked_targets, A)) continue + var/dist = get_dist(source, A) + if(dist > zap_range) + continue + 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)) + if((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 @@ -238,13 +245,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 @@ -253,9 +258,8 @@ 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)) + if((dist < closest_dist || !closest_mob) && L.stat != DEAD && !(L.flags_1 & TESLA_IGNORE_1)) closest_mob = L closest_atom = A closest_dist = dist @@ -265,8 +269,7 @@ 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)) + if((dist < closest_dist || !closest_machine) && !(M.obj_flags & BEING_SHOCKED)) closest_machine = M closest_atom = A closest_dist = dist @@ -276,8 +279,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 < closest_dist || !closest_tesla_coil) && !(B.obj_flags & BEING_SHOCKED)) closest_blob = B closest_atom = A closest_dist = dist @@ -287,8 +289,7 @@ 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)) + if((dist < closest_dist || !closest_tesla_coil) && !(S.obj_flags & BEING_SHOCKED)) closest_structure = S closest_atom = A closest_dist = dist From 9177cb9755d692a5fb7bdbe50f258937295992b4 Mon Sep 17 00:00:00 2001 From: Asdjky <36432064+Asdjky@users.noreply.github.com> Date: Sun, 6 Jun 2021 23:58:16 -0700 Subject: [PATCH 2/3] Fix Tesla blowing holes in the station --- code/modules/power/tesla/energy_ball.dm | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index cdea8688bd61..7a56c99db762 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -227,17 +227,16 @@ /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+2 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(dist > zap_range) - continue if(istype(A, /obj/machinery/power/tesla_coil)) var/obj/machinery/power/tesla_coil/C = A - if((dist < closest_dist || !closest_tesla_coil) && !(C.obj_flags & BEING_SHOCKED)) + 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 @@ -249,7 +248,7 @@ continue //no need checking these other things else if(istype(A, /obj/machinery/power/grounding_rod)) - if((dist < closest_dist || !closest_grounding_rod)) + if(dist < closest_dist || !closest_grounding_rod) closest_grounding_rod = A closest_atom = A closest_dist = dist @@ -259,7 +258,7 @@ else if(isliving(A)) var/mob/living/L = A - if((dist < closest_dist || !closest_mob) && L.stat != DEAD && !(L.flags_1 & TESLA_IGNORE_1)) + if(dist <= zap_range && (dist < closest_dist || !closest_mob) && L.stat != DEAD && !(L.flags_1 & TESLA_IGNORE_1)) closest_mob = L closest_atom = A closest_dist = dist @@ -269,7 +268,7 @@ else if(ismachinery(A)) var/obj/machinery/M = A - if((dist < closest_dist || !closest_machine) && !(M.obj_flags & BEING_SHOCKED)) + if((dist <= zap_range && dist < closest_dist || !closest_machine) && !(M.obj_flags & BEING_SHOCKED)) closest_machine = M closest_atom = A closest_dist = dist @@ -279,7 +278,7 @@ else if(istype(A, /obj/structure/blob)) var/obj/structure/blob/B = A - if((dist < closest_dist || !closest_tesla_coil) && !(B.obj_flags & BEING_SHOCKED)) + if(dist <= zap_range && (dist < closest_dist || !closest_tesla_coil) && !(B.obj_flags & BEING_SHOCKED)) closest_blob = B closest_atom = A closest_dist = dist @@ -289,7 +288,7 @@ else if(isstructure(A)) var/obj/structure/S = A - if((dist < closest_dist || !closest_tesla_coil) && !(S.obj_flags & BEING_SHOCKED)) + if(dist <= zap_range && (dist < closest_dist || !closest_tesla_coil) && !(S.obj_flags & BEING_SHOCKED)) closest_structure = S closest_atom = A closest_dist = dist From 2f84df91fe4504da55eac6ecda3bb5a73ddd8fed Mon Sep 17 00:00:00 2001 From: Asdjky <36432064+Asdjky@users.noreply.github.com> Date: Mon, 7 Jun 2021 16:55:06 -0700 Subject: [PATCH 3/3] I should slow down --- code/modules/power/tesla/energy_ball.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 7a56c99db762..8508d7b713d4 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -227,7 +227,7 @@ /obj/machinery/the_singularitygen/tesla, /obj/structure/frame/machine)) - // +3 to range specifically to include grounding rods that are zap_range+2 away + // +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 @@ -268,7 +268,7 @@ else if(ismachinery(A)) var/obj/machinery/M = A - if((dist <= zap_range && dist < closest_dist || !closest_machine) && !(M.obj_flags & BEING_SHOCKED)) + if(dist <= zap_range && (dist < closest_dist || !closest_machine) && !(M.obj_flags & BEING_SHOCKED)) closest_machine = M closest_atom = A closest_dist = dist