mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-26 06:40:08 +01:00
[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:
co-authored by
Cameron Lennox
parent
743a16c74d
commit
a62b9ed8fe
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user