[MIRROR] SM, Tesla, and general engineering adjustments [MDB IGNORE] [IDB IGNORE] (#12603)

Co-authored-by: Cameron Lennox <killer65311@gmail.com>
This commit is contained in:
CHOMPStation2StaffMirrorBot
2026-03-26 23:08:54 -04:00
committed by GitHub
co-authored by Cameron Lennox
parent 743a16c74d
commit a62b9ed8fe
83 changed files with 992 additions and 309 deletions
+1
View File
@@ -151,6 +151,7 @@
maxcharge = 30000 //determines how badly mobs get shocked
matter = list(MAT_STEEL = 700, MAT_GLASS = 80)
robot_durability = 200
emp_proof = TRUE
/obj/item/cell/infinite/check_charge()
return 1
+1
View File
@@ -12,6 +12,7 @@
var/list/active_field = list()//Our active field.
var/active = 0 //are we even on?
var/id_tag //needed for !!rasins!!
circuit = /obj/item/circuitboard/hydromagnetic_trap
/obj/machinery/power/hydromagnetic_trap/attackby(var/obj/item/W, var/mob/user)
if(default_unfasten_wrench(user, W))
+1 -1
View File
@@ -38,7 +38,7 @@ GLOBAL_LIST_EMPTY(gravity_generators)
if(prob(20))
set_broken()
/obj/machinery/gravity_generator/tesla_act(power, tesla_flags)
/obj/machinery/gravity_generator/tesla_act(power, explosive, current_jumps)
..()
qdel(src)//like the singulo, tesla deletes it. stops it from exploding over and over
+1 -1
View File
@@ -1125,7 +1125,7 @@ GLOBAL_LIST_EMPTY(light_type_cache)
if(isrobot(user))
I = user.get_active_hand()
if(istype(I,/obj/item/multitool))
if(I?.has_tool_quality(TOOL_MULTITOOL))
var/list/menu_list = list(
"Normal Range",
"Normal Brightness",
+5 -5
View File
@@ -236,8 +236,8 @@
visible_message(span_danger("\The [src] lets out an shower of sparks as it starts to lose stability!"),\
span_warningplain("You hear a loud electrical crack!"))
playsound(src, 'sound/effects/lightningshock.ogg', 100, 1, extrarange = 5)
tesla_zap(src, 5, power_gen * 0.05)
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), get_turf(src), 2, 3, 4, 8), 100) // Not a normal explosion.
tesla_zap(src, 5, power_gen * 0.05, current_jumps = 1)
addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(explosion), get_turf(src), 2, 3, 4, 8), 100) // Not a normal explosion.
/obj/machinery/power/rtg/abductor/bullet_act(obj/item/projectile/Proj)
. = ..()
@@ -297,7 +297,7 @@
/obj/machinery/power/rtg/abductor/fire_act(exposed_temperature, exposed_volume)
asplod()
/obj/machinery/power/rtg/abductor/tesla_act()
/obj/machinery/power/rtg/abductor/tesla_act(power, explosive, current_jumps)
..() //extend the zap
asplod()
@@ -355,7 +355,7 @@
/obj/machinery/power/rtg/kugelblitz/fire_act(exposed_temperature, exposed_volume)
asplod()
/obj/machinery/power/rtg/kugelblitz/tesla_act()
/obj/machinery/power/rtg/kugelblitz/tesla_act(power, explosive, current_jumps)
..() //extend the zap
asplod()
@@ -620,7 +620,7 @@
/obj/machinery/power/rtg/antimatter_core/fire_act(exposed_temperature, exposed_volume)
return
/obj/machinery/power/rtg/antimatter_core/tesla_act()
/obj/machinery/power/rtg/antimatter_core/tesla_act(power, explosive, current_jumps)
..() //extend the zap
asplod()
@@ -307,3 +307,12 @@
projectile.particle_type = particle
return projectile
return new /obj/item/projectile/beam/emitter(get_turf(src))
/obj/machinery/power/emitter/pre_mapped
anchored = TRUE
state = 2
/obj/machinery/power/emitter/pre_mapped/Initialize(mapload)
. = ..()
connect_to_network()
update_icon()
@@ -35,3 +35,12 @@
icon_state = "emitter_+a"
else
icon_state = "emitter"
/obj/machinery/power/emitter/antique/pre_mapped
anchored = TRUE
state = 2
/obj/machinery/power/emitter/antique/pre_mapped/Initialize(mapload)
. = ..()
connect_to_network()
update_icon()
@@ -357,3 +357,12 @@
investigate_log("has " + span_red("failed") + " whilst a singulo exists.","singulo")
log_game("FIELDGEN([x],[y],[z]) Containment failed while singulo/tesla exists.")
O.last_warning = world.time
/obj/machinery/field_generator/pre_mapped
state = 2 //Start welded.
anchored = TRUE
/obj/machinery/field_generator/pre_mapped/Initialize(mapload)
. = ..()
update_icon()
@@ -346,3 +346,12 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
update_use_power(USE_POWER_IDLE)
update_icon()
return 1
/obj/structure/particle_accelerator/end_cap/pre_mapped
construction_state = 3
anchored = TRUE
/obj/structure/particle_accelerator/end_cap/pre_mapped/Initialize(mapload)
. = ..()
update_state()
update_icon()
@@ -4,3 +4,11 @@
icon = 'icons/obj/machines/particle_accelerator2.dmi'
icon_state = "fuel_chamber"
reference = "fuel_chamber"
/obj/structure/particle_accelerator/fuel_chamber/pre_mapped
construction_state = 3
anchored = TRUE
/obj/structure/particle_accelerator/fuel_chamber/pre_mapped/Initialize(mapload)
. = ..()
update_icon()
@@ -252,3 +252,11 @@
. = TRUE
update_icon()
/obj/machinery/particle_accelerator/control_box/pre_mapped
construction_state = 3
assembled = TRUE
/obj/machinery/particle_accelerator/control_box/pre_mapped/Initialize(mapload)
. = ..()
update_icon()
@@ -45,3 +45,28 @@
A.set_dir(src.dir)
return 1
return 0
/obj/structure/particle_accelerator/particle_emitter/center/pre_mapped
construction_state = 3
anchored = TRUE
/obj/structure/particle_accelerator/particle_emitter/center/pre_mapped/Initialize(mapload)
. = ..()
update_icon()
/obj/structure/particle_accelerator/particle_emitter/right/pre_mapped
construction_state = 3
anchored = TRUE
/obj/structure/particle_accelerator/particle_emitter/right/pre_mapped/Initialize(mapload)
. = ..()
update_icon()
/obj/structure/particle_accelerator/particle_emitter/left/pre_mapped
construction_state = 3
anchored = TRUE
/obj/structure/particle_accelerator/particle_emitter/left/pre_mapped/Initialize(mapload)
. = ..()
update_icon()
@@ -4,3 +4,11 @@
icon = 'icons/obj/machines/particle_accelerator2.dmi'
icon_state = "power_box"
reference = "power_box"
/obj/structure/particle_accelerator/power_box/pre_mapped
construction_state = 3
anchored = TRUE
/obj/structure/particle_accelerator/power_box/pre_mapped/Initialize(mapload)
. = ..()
update_icon()
+7 -5
View File
@@ -62,7 +62,7 @@ GLOBAL_LIST_EMPTY(solars_list)
if(W.has_tool_quality(TOOL_CROWBAR))
playsound(src, 'sound/machines/click.ogg', 50, 1)
user.visible_message(span_notice("[user] begins to take the glass off the solar panel."))
if(do_after(user, 5 SECONDS, target = src))
if(do_after(user, 2 SECONDS * W.toolspeed, target = src))
var/obj/item/solar_assembly/S = new(loc)
S.anchored = TRUE
new glass_type(loc, 2)
@@ -70,10 +70,12 @@ GLOBAL_LIST_EMPTY(solars_list)
user.visible_message(span_notice("[user] takes the glass off the solar panel."))
qdel(src)
return
else if (W)
src.add_fingerprint(user)
src.health -= W.force
src.healthcheck()
else if(W && user.a_intent == I_HURT)
user.visible_message(span_warning("[user] strikes the solar panel with [W]."))
user.setClickCooldown(user.get_attack_speed(W))
add_fingerprint(user)
health -= W.force
healthcheck()
..()
+9 -10
View File
@@ -460,16 +460,15 @@
if(!istype(l.glasses, /obj/item/clothing/glasses/meson) || l.is_incorporeal()) //Only mesons can protect you! OR if they're not in the same plane of existence
l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1,get_dist(l, src)) ) ) )
if(power)
// At a power mult of 0.025 for range, this means a 1000power SM (about normal) will reach 25 tiles and be putting off rad pulses of 500. With 0 protection, you have a 10% chance of getting hit.
radiation_pulse(
src,
max_range = CLAMP(round(power * 0.025), 5, 50),
threshold = CLAMP(RAD_HEAVY_INSULATION - (power * 0.00025), 0.1, RAD_MEDIUM_INSULATION),
chance = max(round(power * 0.01), DEFAULT_RADIATION_CHANCE),
minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME,
strength = max(round(power * 0.5), 50)
)
// At a power mult of 0.025 for range, this means a 1000power SM (about normal) will reach 25 tiles and be putting off rad pulses of 500. With 0 protection, you have a 10% chance of getting hit.
radiation_pulse(
src,
max_range = CLAMP(round(power * 0.025), 5, 50),
threshold = CLAMP(RAD_MEDIUM_INSULATION - (power * 0.00025), 0.1, RAD_MEDIUM_INSULATION),
chance = max(round(power * 0.01), DEFAULT_RADIATION_CHANCE),
minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME,
strength = max(round(power * 0.5), 50)
)
power -= (power/DECAY_FACTOR)**3 //energy losses due to radiation
+225 -56
View File
@@ -1,3 +1,5 @@
#define AMPLIFIER_STRENGTH 0.2 //Each tier of capacitor increases the amplifier's strength by this much. At 5 rating, 100% increase per relay.
/obj/machinery/power/tesla_coil
name = "tesla coil"
desc = "Balanced power generation and zapping."
@@ -15,20 +17,37 @@
var/power_loss = 2
var/input_power_multiplier = 1
var/zap_cooldown = 100
var/zap_cooldown = 10
var/last_zap = 0
var/datum/wires/tesla_coil/wires = null
var/zap_range = 5
var/lossy_transfer = TRUE //If true, we lose power upon shooting the next beam by our power_loss var. Only comes to play if power_loss is > 1
/obj/machinery/power/tesla_coil/pre_mapped
anchored = TRUE
/obj/machinery/power/tesla_coil/examine()
/obj/machinery/power/tesla_coil/examine(mob/user)
. = ..()
if(anchored)
. += span_notice("It has been securely bolted down and is ready for operation.")
else
. += span_warning("It is not secured!")
if(Adjacent(user))
var/power_calculated = FALSE
if(input_power_multiplier != 1) //Greater than 1 or less than 1.
if(power_loss != 1)
. += span_info("This tesla coil will increase any power it produces by [((input_power_multiplier/power_loss) - 1) * 100]%.")
power_calculated = TRUE
else
. += span_info("This tesla coil will increase any power it produces by [(input_power_multiplier - 1) * 100]%.")
if(!power_calculated || lossy_transfer)
if(power_loss != 1) //If set to 1, we don't lose power upon shooting the next.
. += span_warning("This tesla coil will relay power with a [(1/power_loss) * 100]% loss.")
if(zap_range)
. += span_info("This tesla coil produces bolts that will reach out [zap_range] tiles.")
else
. += span_warning("This tesla coil does not produce bolts!")
/obj/machinery/power/tesla_coil/Initialize(mapload)
. = ..()
wires = new(src)
@@ -42,13 +61,11 @@
return ..()
/obj/machinery/power/tesla_coil/RefreshParts()
var/power_multiplier = 0
zap_cooldown = 100
input_power_multiplier = 0
zap_cooldown = 10
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
zap_cooldown -= (C.rating - 1)
/obj/machinery/power/tesla_coil/update_icon()
if(panel_open)
@@ -57,7 +74,7 @@
icon_state = "[icontype][anchored]"
/obj/machinery/power/tesla_coil/attackby(obj/item/W, mob/user, params)
src.add_fingerprint(user)
add_fingerprint(user)
//if(default_deconstruction_screwdriver(user, "coil_open[anchored]", "coil[anchored]", W))
if(default_deconstruction_screwdriver(user, W))
@@ -68,8 +85,67 @@
return
if(default_deconstruction_crowbar(user, W))
return
if(panel_open && W?.has_tool_quality(TOOL_MULTITOOL))
var/list/menu_list = list(
"Normal",
"Relay",
"Splitter",
"Amplifier",
"Recaster",
"Collector",
)
var/modification_decision = tgui_input_list(user, "Which tesla do you wish to change it into?", "Tesla Selection", menu_list)
if(!modification_decision)
return //They didn't select anything!
if(QDELETED(src) || QDELETED(W) || QDELETED(user) || get_dist(user, src) > W.reach)
return
var/turf = get_turf(src)
if(!turf)
return
var/obj/machinery/power/tesla_coil/new_coil
switch(modification_decision)
if("Normal")
new_coil = new(turf)
if("Relay")
new_coil = new /obj/machinery/power/tesla_coil/relay(turf)
if("Splitter")
new_coil = new /obj/machinery/power/tesla_coil/splitter(turf)
if("Amplifier")
new_coil = new /obj/machinery/power/tesla_coil/amplifier(turf)
if("Recaster")
new_coil = new /obj/machinery/power/tesla_coil/recaster(turf)
if("Collector")
new_coil = new /obj/machinery/power/tesla_coil/collector(turf)
else //Should never happen.
return
//Get rid of the stock parts that get added by init.
for(var/obj/item/stock_parts/C in new_coil.component_parts)
new_coil.component_parts -= C
qdel(C)
//Move the stock parts from the old coil to the new one.
for(var/obj/item/stock_parts/C in component_parts)
C.forceMove(new_coil)
component_parts -= C
new_coil.component_parts += C
new_coil.RefreshParts()
new_coil.anchored = anchored
new_coil.update_icon()
to_chat(user, span_notice("You modify \the [src]. It is now a [lowertext(modification_decision)]! You close the access panel."))
qdel(src)
return
/* //Tesla wires do literally nothing.
if(is_wire_tool(W))
return wires.Interact(user)
*/
return ..()
/obj/machinery/power/tesla_coil/attack_hand(mob/user)
@@ -77,58 +153,72 @@
return
..()
/obj/machinery/power/tesla_coil/tesla_act(var/power)
/obj/machinery/power/tesla_coil/tesla_act(power, explosive, current_jumps)
if(anchored && !panel_open)
being_shocked = TRUE
coil_act(power)
coil_act(power, explosive, current_jumps)
//addtimer(CALLBACK(src, PROC_REF(reset_shocked)), 10)
spawn(10) reset_shocked()
spawn(zap_cooldown) reset_shocked()
else if(anchored && panel_open) //Doing maintenance. Just act like a grounding rod.
being_shocked = TRUE
spawn(zap_cooldown) reset_shocked()
else
..()
/obj/machinery/power/tesla_coil/proc/coil_act(var/power)
/obj/machinery/power/tesla_coil/proc/coil_act(power, explosive, current_jumps)
var/power_produced = power / power_loss
add_avail(power_produced*input_power_multiplier)
flick("[icontype]hit", src)
playsound(src, 'sound/effects/lightningshock.ogg', 100, 1, extrarange = 5)
tesla_zap(src, 5, power_produced)
tesla_zap(src, zap_range, power_produced, current_jumps = current_jumps)
/obj/machinery/power/tesla_coil/proc/zap()
//Unused.
/obj/machinery/power/tesla_coil/proc/zap(power, explosive, current_jumps)
if((last_zap + zap_cooldown) > world.time || !powernet)
return FALSE
last_zap = world.time
var/coeff = (20 - ((input_power_multiplier - 1) * 3))
coeff = max(coeff, 10)
var/power = (powernet.avail/2)
power = (powernet.avail/2)
draw_power(power)
playsound(src, 'sound/effects/lightningshock.ogg', 100, 1, extrarange = 5)
tesla_zap(src, 10, power/(coeff/2))
tesla_zap(src, zap_range, power/(coeff/2), current_jumps = current_jumps)
/obj/machinery/power/tesla_coil/relay
name = "tesla relay coil"
desc = "Designed to move power around rather than just consuming it."
desc = "Designed to move power around rather. Creates no power on its own."
icon_state = "relay0"
icontype = "relay"
circuit = /obj/item/circuitboard/tesla_coil
power_loss = 1
input_power_multiplier = 0
var/relay_efficiency = 0.9
/obj/machinery/power/tesla_coil/relay/RefreshParts()
..()
var/relay_multiplier
input_power_multiplier = 1 //So we don't show the examine text further above.
relay_efficiency = 0.85
for(var/obj/item/stock_parts/capacitor/C in component_parts)
relay_multiplier += C.rating
relay_efficiency = 0.85 + (0.05 * relay_multiplier)
relay_efficiency += C.rating * 0.05
/obj/machinery/power/tesla_coil/relay/coil_act(var/power)
var/power_relayed = power * relay_efficiency
/obj/machinery/power/tesla_coil/relay/coil_act(power, explosive, current_jumps)
var/diminishing_returns = 1 + ((current_jumps * 0.1)-0.1) //The more jumps, the less effective the amplifier is. At 10 jumps, it's only 1/2 as effective.
var/power_relayed = ((power * relay_efficiency) / diminishing_returns)
if(power_relayed < power && relay_efficiency >= 1)
power_relayed = power
flick("[icontype]hit", src)
playsound(src, 'sound/effects/lightningshock.ogg', 100, 1, extrarange = 5)
tesla_zap(src, 5, power_relayed)
tesla_zap(src, zap_range, power_relayed, current_jumps = current_jumps)
/obj/machinery/power/tesla_coil/relay/examine(mob/user)
. = ..()
if(Adjacent(user))
if(relay_efficiency == 1)
. += span_info("This tesla coil will transfer power through it with no loss.")
else
. += span_info("This tesla coil will [relay_efficiency > 1 ? "amplify" : "reduce"] power transferring through it by [ abs(relay_efficiency - 1) * 100]%.")
/obj/machinery/power/tesla_coil/splitter
name = "tesla prism coil"
@@ -138,6 +228,9 @@
circuit = /obj/item/circuitboard/tesla_coil
power_loss = 2
lossy_transfer = FALSE
var/split_count = 1
/obj/machinery/power/tesla_coil/splitter/RefreshParts()
@@ -146,38 +239,56 @@
for(var/obj/item/stock_parts/capacitor/C in component_parts)
split_count += C.rating
/obj/machinery/power/tesla_coil/splitter/coil_act(var/power)
/obj/machinery/power/tesla_coil/splitter/coil_act(power, explosive, current_jumps)
var/power_per_bolt = power / (split_count + 1)
var/power_produced = power_per_bolt / power_loss
add_avail(power_produced*input_power_multiplier)
add_avail(power_produced * input_power_multiplier)
flick("[icontype]hit", src)
playsound(src, 'sound/effects/lightningshock.ogg', 100, 1, extrarange = 5)
for(var/i = 0, i < split_count, i++)
tesla_zap(src, 5, power_per_bolt)
tesla_zap(src, zap_range, power_per_bolt, current_jumps = current_jumps)
/obj/machinery/power/tesla_coil/splitter/examine(mob/user)
. = ..()
if(Adjacent(user))
. += span_info("This tesla coil will create [split_count + 1] bolts, with each containing [round(((1 / (split_count+1)) * 100), 0.1)]% of the original power.")
/obj/machinery/power/tesla_coil/amplifier
name = "tesla amplifier coil"
desc = "Designed to amplify power moving through it rather than collecting it."
desc = "Designed to amplify power moving through it rather than collecting it. Has diminishing returns the more relays the tesla bolt has passed through."
icon_state = "amp0"
icontype = "amp"
circuit = /obj/item/circuitboard/tesla_coil
var/amp_eff = 2
var/amp_eff = 1.075
power_loss = 1
/obj/machinery/power/tesla_coil/amplifier/RefreshParts()
..()
var/amp_eff = 1
amp_eff = 1.075
for(var/obj/item/stock_parts/capacitor/C in component_parts)
amp_eff += C.rating
amp_eff += ((C.rating * AMPLIFIER_STRENGTH) - AMPLIFIER_STRENGTH)
input_power_multiplier = 1 //no mult for you
/obj/machinery/power/tesla_coil/amplifier/coil_act(var/power)
var/power_produced = power / power_loss
add_avail(power_produced*input_power_multiplier)
/obj/machinery/power/tesla_coil/amplifier/coil_act(power, explosive, current_jumps)
var/diminishing_returns = 1 + ((current_jumps * 0.1)-0.1) //The more jumps, the less effective the amplifier is. At 10 jumps, it stops increasing power. Use something else!
var/power_produced = ((power * amp_eff) / diminishing_returns)
if(power_produced < power)
power_produced = power //Don't let it reduce power. If the amp is worse than the original, just give them the original power.
flick("[icontype]hit", src)
playsound(src, 'sound/effects/lightningshock.ogg', 100, 1, extrarange = 5)
tesla_zap(src, 5, power_produced)
tesla_zap(src, zap_range, power_produced, current_jumps = current_jumps)
/obj/machinery/power/tesla_coil/amplifier/examine(mob/user)
. = ..()
if(Adjacent(user))
. += span_info("This tesla coil will amplify any power it receives by [round((((amp_eff) * 100) - 100), 0.1)]% of the original power when relaying it.")
. += span_info("Every jump the tesla makes reduces the effectiveness of the amplifier by 10%, meaning at 10 jumps, it stops increasing power.")
. += span_danger("This tesla coil will NOT produce produce energy.")
///BE WARNED, THIS THING CAN CAUSE MASSIVE LAG IF THE RANGE IS TOO HIGH
/obj/machinery/power/tesla_coil/recaster
name = "tesla recaster coil"
desc = "Extends the reach of the bolts."
@@ -186,21 +297,21 @@
circuit = /obj/item/circuitboard/tesla_coil
var/zap_range = 6
zap_range = 6
/obj/machinery/power/tesla_coil/recaster/RefreshParts()
..()
var/zap_range = 5
zap_range = 5
for(var/obj/item/stock_parts/capacitor/C in component_parts)
zap_range += C.rating
zap_range += C.rating * 1
/obj/machinery/power/tesla_coil/recaster/coil_act(var/power)
/obj/machinery/power/tesla_coil/recaster/coil_act(power, explosive, current_jumps)
var/power_relayed = power / power_loss
var/power_produced = power / (power_loss * 2)
add_avail(power_produced*input_power_multiplier)
flick("[icontype]hit", src)
playsound(src, 'sound/effects/lightningshock.ogg', 100, 1, extrarange = zap_range)
tesla_zap(src, zap_range, power_relayed)
tesla_zap(src, zap_range, power_relayed, current_jumps = current_jumps)
/obj/machinery/power/tesla_coil/collector
name = "tesla collector coil"
@@ -210,18 +321,20 @@
circuit = /obj/item/circuitboard/tesla_coil
var/collect_eff = 0.8
power_loss = 1 //Doesn't lose power. Instead it uses collect_eff
zap_range = 0
/obj/machinery/power/tesla_coil/collector/RefreshParts()
..()
var/collect_mod = 0
input_power_multiplier = 0
for(var/obj/item/stock_parts/capacitor/C in component_parts)
collect_mod += C.rating
collect_eff = 0.75 + collect_mod*0.05
input_power_multiplier += C.rating * C.rating //T1 = 200% T2 = 400% T3 = 900% T4 = 1600% T5 = 2500%
if(input_power_multiplier == 1)
input_power_multiplier = 2
/obj/machinery/power/tesla_coil/collector/coil_act(var/power)
var/power_produced = power * collect_eff
add_avail(power_produced*input_power_multiplier)
/obj/machinery/power/tesla_coil/collector/coil_act(power, explosive, current_jumps)
add_avail(power*input_power_multiplier)
flick("[icontype]hit", src)
playsound(src, 'sound/effects/lightningshock.ogg', 100, 1, extrarange = 5)
@@ -241,16 +354,13 @@
. = ..()
AddElement(/datum/element/climbable)
/obj/machinery/power/grounding_rod/examine()
/obj/machinery/power/grounding_rod/examine(user)
. = ..()
if(anchored)
. += span_notice("It has been securely bolted down and is ready for operation.")
else
. += span_warning("It is not secured!")
/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]"
@@ -274,8 +384,67 @@
return
..()
/obj/machinery/power/grounding_rod/tesla_act(var/power)
/obj/machinery/power/grounding_rod/tesla_act(power, explosive, current_jumps)
if(anchored && !panel_open)
flick("grounding_rodhit", src)
else
..()
//Mapspawn variants of each.
/obj/machinery/power/tesla_coil/pre_mapped
anchored = TRUE
/obj/machinery/power/tesla_coil/pre_mapped/Initialize(mapload)
. = ..()
connect_to_network()
update_icon()
/obj/machinery/power/tesla_coil/relay/pre_mapped
anchored = TRUE
/obj/machinery/power/tesla_coil/relay/pre_mapped/Initialize(mapload)
. = ..()
connect_to_network()
update_icon()
/obj/machinery/power/tesla_coil/splitter/pre_mapped
anchored = TRUE
/obj/machinery/power/tesla_coil/splitter/pre_mapped/Initialize(mapload)
. = ..()
connect_to_network()
update_icon()
/obj/machinery/power/tesla_coil/amplifier/pre_mapped
anchored = TRUE
/obj/machinery/power/tesla_coil/amplifier/pre_mapped/Initialize(mapload)
. = ..()
connect_to_network()
update_icon()
/obj/machinery/power/tesla_coil/recaster/pre_mapped
anchored = TRUE
/obj/machinery/power/tesla_coil/recaster/pre_mapped/Initialize(mapload)
. = ..()
connect_to_network()
update_icon()
/obj/machinery/power/tesla_coil/collector/pre_mapped
anchored = TRUE
/obj/machinery/power/tesla_coil/collector/pre_mapped/Initialize(mapload)
. = ..()
connect_to_network()
update_icon()
/obj/machinery/power/grounding_rod/pre_mapped
anchored = TRUE
/obj/machinery/power/grounding_rod/pre_mapped/Initialize(mapload)
. = ..()
connect_to_network()
update_icon()
#undef AMPLIFIER_STRENGTH
+16 -11
View File
@@ -58,11 +58,11 @@
playsound(src, 'sound/effects/lightningbolt.ogg', 100, 1, extrarange = 30)
set_dir(tesla_zap(src, 7, TESLA_DEFAULT_POWER, TRUE))
set_dir(tesla_zap(src, 7, TESLA_DEFAULT_POWER, TRUE, current_jumps = 1))
for (var/ball in orbiting_balls)
var/range = rand(1, CLAMP(orbiting_balls.len, 3, 7))
tesla_zap(ball, range, TESLA_MINI_POWER/7*range, TRUE)
tesla_zap(ball, range, TESLA_MINI_POWER/7*range, TRUE, current_jumps = 1)
else
energy = 0 // ensure we dont have miniballs of miniballs
@@ -158,12 +158,15 @@
// L.dust() - Changing to do fatal elecrocution instead
L.electrocute_act(500, src, def_zone = BP_TORSO)
/proc/tesla_zap(atom/source, zap_range = 3, power, explosive = FALSE, stun_mobs = TRUE)
/proc/tesla_zap(atom/source, zap_range = 3, power, explosive = FALSE, stun_mobs = TRUE, current_jumps)
if(!source) // Some mobs and maybe some objects delete themselves when they die.
return
. = source.dir
if(power < 1000)
return
if(current_jumps >= MAXIMUM_TESLA_JUMPS)
return
current_jumps++
var/closest_dist = 0
var/closest_atom
@@ -194,10 +197,12 @@
/obj/structure/grille,
/obj/machinery/the_singularitygen/tesla))
for(var/A in typecache_filter_multi_list_exclusion(oview(source, zap_range+2), things_to_shock, blacklisted_tesla_types))
for(var/A in typecache_filter_multi_list_exclusion(oview(zap_range+2, source), things_to_shock, blacklisted_tesla_types))
if(istype(A, /obj/machinery/power/tesla_coil))
var/dist = get_dist(source, A)
var/obj/machinery/power/tesla_coil/C = A
if(!C.anchored)
continue
if(dist <= zap_range && (dist < closest_dist || !closest_tesla_coil) && !C.being_shocked)
closest_dist = dist
@@ -277,10 +282,10 @@
//per type stuff:
if(closest_tesla_coil)
closest_tesla_coil.tesla_act(power, explosive, stun_mobs)
closest_tesla_coil.tesla_act(power, explosive, stun_mobs, current_jumps = current_jumps)
else if(closest_grounding_rod)
closest_grounding_rod.tesla_act(power, explosive, stun_mobs)
closest_grounding_rod.tesla_act(power, explosive, stun_mobs, current_jumps = current_jumps)
else if(closest_mob)
var/shock_damage = CLAMP(round(power/400), 10, 90) + rand(-5, 5)
@@ -291,21 +296,21 @@
var/mob/living/silicon/S = closest_mob
if(stun_mobs)
S.emp_act(3 /*EMP_LIGHT*/)
tesla_zap(closest_mob, 7, power / 1.5, explosive, stun_mobs) // metallic folks bounce it further
tesla_zap(closest_mob, 7, power / 1.5, explosive, stun_mobs, current_jumps = current_jumps) // metallic folks bounce it further
else
tesla_zap(closest_mob, 5, power / 1.5, explosive, stun_mobs)
tesla_zap(closest_mob, 5, power / 1.5, explosive, stun_mobs, current_jumps = current_jumps)
else if(closest_machine)
drain_energy = TRUE // VOREStation Edit - Safety First! Drain Tesla fast when its loose
closest_machine.tesla_act(power, explosive, stun_mobs)
closest_machine.tesla_act(power, explosive, stun_mobs, current_jumps = current_jumps)
else if(closest_blob)
drain_energy = TRUE // VOREStation Edit - Safety First! Drain Tesla fast when its loose
closest_blob.tesla_act(power, explosive, stun_mobs)
closest_blob.tesla_act(power, explosive, stun_mobs, current_jumps = current_jumps)
else if(closest_structure)
drain_energy = TRUE // VOREStation Edit - Safety First! Drain Tesla fast when its loose
closest_structure.tesla_act(power, explosive, stun_mobs)
closest_structure.tesla_act(power, explosive, stun_mobs, current_jumps = current_jumps)
// VOREStation Edit Start - Safety First! Drain Tesla fast when its loose
if(drain_energy && istype(source, /obj/singularity/energy_ball))
+4 -1
View File
@@ -5,6 +5,9 @@
icon_state = "TheSingGen"
creation_type = /obj/singularity/energy_ball
/obj/machinery/the_singularitygen/tesla/tesla_act(power, explosive = FALSE)
/obj/machinery/the_singularitygen/tesla/tesla_act(power, explosive = FALSE, current_jumps)
if(explosive)
energy += power
/obj/machinery/the_singularitygen/tesla/pre_mapped
anchored = TRUE
+10 -10
View File
@@ -2,10 +2,10 @@
// Vars and Default tesla_act behavior
////////////////////////////////////////
/obj/proc/tesla_act(var/power)
/obj/proc/tesla_act(power, explosive = FALSE, current_jumps)
being_shocked = TRUE
var/power_bounced = power / 2
tesla_zap(src, 3, power_bounced)
tesla_zap(src, 3, power_bounced, current_jumps)
//addtimer(CALLBACK(src, PROC_REF(reset_shocked)), 10)
//schedule_task_with_source_in(10, src, PROC_REF(reset_shocked))
spawn(10) reset_shocked()
@@ -15,16 +15,16 @@
// Overrides for behavior on specific types
/obj/structure/blob/tesla_act(power)
/obj/structure/blob/tesla_act(power, explosive, current_jumps)
..()
adjust_integrity(-power/400)
/obj/machinery/nuclearbomb/tesla_act(power, explosive)
/obj/machinery/nuclearbomb/tesla_act(power, explosive, current_jumps)
..()
if(explosive)
qdel(src)//like the singulo, tesla deletes it. stops it from exploding over and over
/obj/machinery/tesla_act(power, explosive = FALSE)
/obj/machinery/tesla_act(power, explosive, current_jumps)
..()
if(prob(85) && explosive)
explosion(loc, 0, 2, 4, /*flame_range = 2,*/ adminlog = FALSE/*, smoke = FALSE*/) // VOREStation Edit - No devastation range
@@ -33,13 +33,13 @@
else
ex_act(2)
/obj/machinery/camera/tesla_act(var/power)//EMP proof upgrade also makes it tesla immune
/obj/machinery/camera/tesla_act(power, explosive, current_jumps)//EMP proof upgrade also makes it tesla immune
if(isEmpProof())
return
..()
qdel(src) //to prevent bomb testing camera from exploding over and over forever
/obj/machinery/light/tesla_act(power, explosive = FALSE)
/obj/machinery/light/tesla_act(power, explosive, current_jumps)
if(explosive)
explosion(loc, 0, 0, 0/*, flame_range = 5*/, adminlog = FALSE)
qdel(src)
@@ -47,16 +47,16 @@
on = TRUE
broken()
/obj/structure/closet/tesla_act(var/power)
/obj/structure/closet/tesla_act(power, explosive, current_jumps)
..() //extend the zap
visible_message(span_danger("[src] is blown apart by the bolt of electricity!"), span_danger("You hear a metallic screeching sound."))
dump_contents()
qdel(src)
/obj/structure/reagent_dispensers/fueltank/tesla_act()
/obj/structure/reagent_dispensers/fueltank/tesla_act(power, explosive, current_jumps)
..() //extend the zap
explode()
/obj/mecha/tesla_act(power)
/obj/mecha/tesla_act(power, explosive = FALSE, current_jumps)
..()
take_damage(power / 200, "energy") // A surface lightning strike will do 100 damage.
+1 -1
View File
@@ -330,7 +330,7 @@
compressor = C
LAZYINITLIST(doors)
for(var/obj/machinery/door/blast/P in GLOB.machines)
if(P.id == id)
if(P.id == id) //This will never work because the ID on the blast doors is a number while the ID on the turbine (if set mid-round) is a string.
doors += P
/obj/machinery/computer/turbine_computer/attackby(obj/item/W, mob/user)