mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-30 00:29:02 +01:00
An attempt to clean up tesla code (#50530)
* An attempt to clean up tesla code * macro-op * there we go
This commit is contained in:
@@ -751,6 +751,14 @@
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_RCD_ACT, user, the_rcd, passed_mode)
|
||||
return FALSE
|
||||
|
||||
/**
|
||||
* Respond to a electric bolt action on our item
|
||||
*
|
||||
* Default behaviour is to return, we define here to allow for cleaner code later on
|
||||
*/
|
||||
/atom/proc/zap_act(power, zap_flags, shocked_targets)
|
||||
return
|
||||
|
||||
/**
|
||||
* Implement the behaviour for when a user click drags a storage object to your atom
|
||||
*
|
||||
|
||||
@@ -222,7 +222,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e
|
||||
SSfire_burning.processing -= src
|
||||
|
||||
///Called when the obj is hit by a tesla bolt.
|
||||
/obj/proc/zap_act(power, zap_flags, shocked_targets)
|
||||
/obj/zap_act(power, zap_flags, shocked_targets)
|
||||
if(QDELETED(src))
|
||||
return 0
|
||||
obj_flags |= BEING_SHOCKED
|
||||
|
||||
@@ -737,7 +737,7 @@
|
||||
|
||||
/obj/machinery/light/zap_act(power, zap_flags)
|
||||
if(zap_flags & ZAP_MACHINE_EXPLOSIVE)
|
||||
explosion(src,0,0,0,flame_range = 5, adminlog = 0)
|
||||
explosion(src,0,0,0,flame_range = 5, adminlog = FALSE)
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -965,8 +965,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
//If the strength of the zap decays past the cutoff, we stop
|
||||
if(zap_str < zap_cutoff)
|
||||
return
|
||||
var/datum/target
|
||||
var/target_type = (LOWEST)
|
||||
var/atom/target
|
||||
var/target_type = LOWEST
|
||||
var/list/arctargets = list()
|
||||
//Making a new copy so additons further down the recursion do not mess with other arcs
|
||||
//Lets put this ourself into the do not hit list, so we don't curve back to hit the same thing twice with one arc
|
||||
@@ -1053,8 +1053,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
//Going boom should be rareish
|
||||
if(prob(80))
|
||||
zap_flags &= ~ZAP_MACHINE_EXPLOSIVE
|
||||
if(istype(target, /obj/machinery/power/tesla_coil))
|
||||
var/obj/machinery/power/tesla_coil/coil = target
|
||||
if(target_type == COIL)
|
||||
//In the best situation we can expect this to grow up to 2120kw before a delam/IT'S GONE TOO FAR FRED SHUT IT DOWN
|
||||
//The formula for power gen is zap_str * zap_mod / 2 * capacitor rating, between 1 and 4
|
||||
var/multi = 10
|
||||
@@ -1063,33 +1062,29 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
multi = 20
|
||||
if(CRITICAL_POWER_PENALTY_THRESHOLD to INFINITY)
|
||||
multi = 40
|
||||
coil.zap_act(zap_str * multi, zap_flags, list())
|
||||
target.zap_act(zap_str * multi, zap_flags, list())
|
||||
zap_str /= 3 //Coils should take a lot out of the power of the zap
|
||||
|
||||
else if(istype(target, /obj/machinery/power/grounding_rod))
|
||||
var/obj/machinery/power/grounding_rod/rod = target
|
||||
else if(target_type == ROD)
|
||||
//We can expect this to do very little, maybe shock the poor soul buckled to it, but that's all.
|
||||
//This is one of our endpoints, if the bolt hits a grounding rod, it stops jumping
|
||||
rod.zap_act(zap_str, zap_flags, list())
|
||||
target.zap_act(zap_str, zap_flags, list())
|
||||
return
|
||||
|
||||
else if(isliving(target))//If we got a fleshbag on our hands
|
||||
var/mob/living/mob = target
|
||||
mob.set_shocked()
|
||||
addtimer(CALLBACK(mob, /mob/living/proc/reset_shocked), 10)
|
||||
var/mob/living/creature = target
|
||||
creature.set_shocked()
|
||||
addtimer(CALLBACK(creature, /mob/living/proc/reset_shocked), 10)
|
||||
//3 shots a human with no resistance. 2 to crit, one to death. This is at at least 10000 power.
|
||||
//There's no increase after that because the input power is effectivly capped at 10k
|
||||
//Does 1.5 damage at the least
|
||||
var/shock_damage = ((zap_flags & ZAP_MOB_DAMAGE) ? (power / 200) - 10 : rand(5,10))
|
||||
mob.electrocute_act(shock_damage, "Supermatter Discharge Bolt", 1, ((zap_flags & ZAP_MOB_STUN) ? SHOCK_TESLA : SHOCK_NOSTUN))
|
||||
creature.electrocute_act(shock_damage, "Supermatter Discharge Bolt", 1, ((zap_flags & ZAP_MOB_STUN) ? SHOCK_TESLA : SHOCK_NOSTUN))
|
||||
zap_str /= 1.5 //Meatsacks are conductive, makes working in pairs more destructive
|
||||
|
||||
else if(isobj(target))
|
||||
var/obj/junk = target
|
||||
junk.zap_act(zap_str, zap_flags, list())
|
||||
zap_str /= 2 // worse then living things, better then coils
|
||||
else
|
||||
zap_str = 0
|
||||
target.zap_act(zap_str, zap_flags, list())
|
||||
zap_str /= 2 // worse then living things, better then coils
|
||||
//This gotdamn variable is a boomer and keeps giving me problems
|
||||
var/turf/T = get_turf(target)
|
||||
var/pressure = 1
|
||||
|
||||
@@ -1,5 +1,14 @@
|
||||
#define TESLA_DEFAULT_POWER 1738260
|
||||
#define TESLA_MINI_POWER 869130
|
||||
//Zap constants, speeds up targeting
|
||||
#define BIKE (COIL + 1)
|
||||
#define COIL (ROD + 1)
|
||||
#define ROD (RIDE + 1)
|
||||
#define RIDE (LIVING + 1)
|
||||
#define LIVING (MACHINERY + 1)
|
||||
#define MACHINERY (BLOB + 1)
|
||||
#define BLOB (STRUCTURE + 1)
|
||||
#define STRUCTURE (1)
|
||||
|
||||
/obj/singularity/energy_ball
|
||||
name = "energy ball"
|
||||
@@ -32,6 +41,9 @@
|
||||
/obj/singularity/energy_ball/ex_act(severity, target)
|
||||
return
|
||||
|
||||
/obj/singularity/energy_ball/consume(severity, target)
|
||||
return
|
||||
|
||||
/obj/singularity/energy_ball/Destroy()
|
||||
if(orbiting && istype(orbiting.parent, /obj/singularity/energy_ball))
|
||||
var/obj/singularity/energy_ball/EB = orbiting.parent
|
||||
@@ -143,8 +155,8 @@
|
||||
target.orbiting_balls += src
|
||||
GLOB.poi_list -= src
|
||||
target.dissipate_strength = target.orbiting_balls.len
|
||||
|
||||
. = ..()
|
||||
|
||||
/obj/singularity/energy_ball/stop_orbit()
|
||||
if (orbiting && istype(orbiting.parent, /obj/singularity/energy_ball))
|
||||
var/obj/singularity/energy_ball/orbitingball = orbiting.parent
|
||||
@@ -178,16 +190,8 @@
|
||||
/*
|
||||
THIS IS SO FUCKING UGLY AND I HATE IT, but I can't make it nice without making it slower, check*N rather then n. So we're stuck with it.
|
||||
*/
|
||||
var/closest_dist = 0
|
||||
var/closest_atom
|
||||
var/obj/vehicle/ridden/bicycle/closest_million_dollar_baby
|
||||
var/obj/machinery/power/tesla_coil/closest_tesla_coil
|
||||
var/obj/machinery/power/grounding_rod/closest_grounding_rod
|
||||
var/obj/vehicle/ridden/closest_rideable
|
||||
var/mob/living/closest_mob
|
||||
var/obj/machinery/closest_machine
|
||||
var/obj/structure/closest_structure
|
||||
var/obj/structure/blob/closest_blob
|
||||
var/atom/closest_atom
|
||||
var/closest_type = 0
|
||||
var/static/things_to_shock = typecacheof(list(/obj/machinery, /mob/living, /obj/structure, /obj/vehicle/ridden))
|
||||
var/static/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
|
||||
/obj/machinery/power/emitter,
|
||||
@@ -211,123 +215,105 @@
|
||||
/obj/structure/grille,
|
||||
/obj/structure/frame/machine))
|
||||
|
||||
for(var/A in typecache_filter_multi_list_exclusion(oview(source, zap_range+2), things_to_shock, blacklisted_tesla_types))
|
||||
//Ok so we are making an assumption here. We assume that view() still calculates from the center out.
|
||||
//This means that if we find an object we can assume it is the closest one of its type. This is somewhat of a speed increase.
|
||||
//This also means we have no need to track distance, as the doview() proc does it all for us.
|
||||
|
||||
//Darkness fucks oview up hard. I've tried dview() but it doesn't seem to work
|
||||
//I hate existance
|
||||
for(var/a in typecache_filter_multi_list_exclusion(oview(zap_range+2, source), things_to_shock, blacklisted_tesla_types))
|
||||
var/atom/A = a
|
||||
if(!(zap_flags & ZAP_ALLOW_DUPLICATES) && LAZYACCESS(shocked_targets, A))
|
||||
continue
|
||||
if(closest_type >= BIKE)
|
||||
break
|
||||
|
||||
if(istype(A, /obj/vehicle/ridden/bicycle))//God's not on our side cause he hates idiots.
|
||||
var/dist = get_dist(source, A)
|
||||
else if(istype(A, /obj/vehicle/ridden/bicycle))//God's not on our side cause he hates idiots.
|
||||
var/obj/vehicle/ridden/bicycle/B = A
|
||||
if(dist <= zap_range && (dist < closest_dist || !closest_million_dollar_baby) && !(B.obj_flags & BEING_SHOCKED) && B.can_buckle)//Gee goof thanks for the boolean
|
||||
closest_dist = dist
|
||||
if(!(B.obj_flags & BEING_SHOCKED) && B.can_buckle)//Gee goof thanks for the boolean
|
||||
//we use both of these to save on istype and typecasting overhead later on
|
||||
//while still allowing common code to run before hand
|
||||
closest_million_dollar_baby = B
|
||||
closest_type = BIKE
|
||||
closest_atom = B
|
||||
|
||||
else if(closest_million_dollar_baby)
|
||||
else if(closest_type >= COIL)
|
||||
continue //no need checking these other things
|
||||
|
||||
else 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
|
||||
closest_tesla_coil = C
|
||||
if(!(C.obj_flags & BEING_SHOCKED))
|
||||
closest_type = COIL
|
||||
closest_atom = C
|
||||
|
||||
else if(closest_tesla_coil)
|
||||
else if(closest_type >= ROD)
|
||||
continue
|
||||
|
||||
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))
|
||||
closest_grounding_rod = A
|
||||
closest_atom = A
|
||||
closest_dist = dist
|
||||
closest_type = ROD
|
||||
closest_atom = A
|
||||
|
||||
else if(closest_grounding_rod)
|
||||
else if(closest_type >= RIDE)
|
||||
continue
|
||||
|
||||
else if(istype(A,/obj/vehicle/ridden))
|
||||
var/dist = get_dist(source, A)
|
||||
var/obj/vehicle/ridden/R = A
|
||||
if(dist <= zap_range && (dist < closest_dist || !closest_rideable) && R.can_buckle && !(R.obj_flags & BEING_SHOCKED))
|
||||
closest_rideable = R
|
||||
if(R.can_buckle && !(R.obj_flags & BEING_SHOCKED))
|
||||
closest_type = RIDE
|
||||
closest_atom = A
|
||||
closest_dist = dist
|
||||
|
||||
else if(closest_rideable)
|
||||
else if(closest_type >= LIVING)
|
||||
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 && !(HAS_TRAIT(L, TRAIT_TESLA_SHOCKIMMUNE)) && !(L.flags_1 & SHOCKED_1))
|
||||
closest_mob = L
|
||||
if(L.stat != DEAD && !(HAS_TRAIT(L, TRAIT_TESLA_SHOCKIMMUNE)) && !(L.flags_1 & SHOCKED_1))
|
||||
closest_type = LIVING
|
||||
closest_atom = A
|
||||
closest_dist = dist
|
||||
|
||||
else if(closest_mob)
|
||||
else if(closest_type >= MACHINERY)
|
||||
continue
|
||||
|
||||
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
|
||||
if(!(M.obj_flags & BEING_SHOCKED))
|
||||
closest_type = MACHINERY
|
||||
closest_atom = A
|
||||
closest_dist = dist
|
||||
|
||||
else if(closest_machine)
|
||||
else if(closest_type >= BLOB)
|
||||
continue
|
||||
|
||||
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_blob) && !(B.obj_flags & BEING_SHOCKED))
|
||||
closest_blob = B
|
||||
if(!(B.obj_flags & BEING_SHOCKED))
|
||||
closest_type = BLOB
|
||||
closest_atom = A
|
||||
closest_dist = dist
|
||||
|
||||
else if(closest_blob)
|
||||
else if(closest_type >= STRUCTURE)
|
||||
continue
|
||||
|
||||
else if(isstructure(A))
|
||||
var/obj/structure/S = A
|
||||
var/dist = get_dist(source, A)
|
||||
//There's no closest_structure here because there are no checks below this one, re-add it if that changes
|
||||
if(dist <= zap_range && (dist < closest_dist) && !(S.obj_flags & BEING_SHOCKED))
|
||||
closest_structure = S
|
||||
if(!(S.obj_flags & BEING_SHOCKED))
|
||||
closest_type = STRUCTURE
|
||||
closest_atom = A
|
||||
closest_dist = dist
|
||||
|
||||
//Alright, we've done our loop, now lets see if was anything interesting in range
|
||||
if(closest_atom)
|
||||
//common stuff
|
||||
source.Beam(closest_atom, icon_state="lightning[rand(1,12)]", time=5, maxdistance = INFINITY)
|
||||
if(!(zap_flags & ZAP_ALLOW_DUPLICATES))
|
||||
LAZYSET(shocked_targets, closest_atom, TRUE)
|
||||
var/zapdir = get_dir(source, closest_atom)
|
||||
if(zapdir)
|
||||
. = zapdir
|
||||
if(!closest_atom)
|
||||
return
|
||||
//common stuff
|
||||
source.Beam(closest_atom, icon_state="lightning[rand(1,12)]", time=5, maxdistance = INFINITY)
|
||||
if(!(zap_flags & ZAP_ALLOW_DUPLICATES))
|
||||
LAZYSET(shocked_targets, closest_atom, TRUE)
|
||||
var/zapdir = get_dir(source, closest_atom)
|
||||
if(zapdir)
|
||||
. = zapdir
|
||||
|
||||
//per type stuff:
|
||||
var/range = 3
|
||||
if(!QDELETED(closest_million_dollar_baby))
|
||||
power = closest_million_dollar_baby.zap_act(power, zap_flags, shocked_targets)
|
||||
var/next_range = 3
|
||||
if(closest_type == COIL)
|
||||
next_range = 5
|
||||
|
||||
else if(!QDELETED(closest_tesla_coil))
|
||||
power = closest_tesla_coil.zap_act(power, zap_flags, shocked_targets)
|
||||
range = 5
|
||||
|
||||
else if(!QDELETED(closest_grounding_rod))
|
||||
power = closest_grounding_rod.zap_act(power, zap_flags, shocked_targets)
|
||||
|
||||
else if(!QDELETED(closest_rideable))
|
||||
power = closest_rideable.zap_act(power, zap_flags, shocked_targets)
|
||||
|
||||
else if(!QDELETED(closest_mob))
|
||||
if(closest_type == LIVING)
|
||||
var/mob/living/closest_mob = closest_atom
|
||||
closest_mob.set_shocked()
|
||||
addtimer(CALLBACK(closest_mob, /mob/living/proc/reset_shocked), 10)
|
||||
var/shock_damage = (zap_flags & ZAP_MOB_DAMAGE) ? (min(round(power/600), 90) + rand(-5, 5)) : 0
|
||||
@@ -336,20 +322,24 @@
|
||||
var/mob/living/silicon/S = closest_mob
|
||||
if((zap_flags & ZAP_MOB_STUN) && (zap_flags & ZAP_MOB_DAMAGE))
|
||||
S.emp_act(EMP_LIGHT)
|
||||
range = 7 // metallic folks bounce it further
|
||||
next_range = 7 // metallic folks bounce it further
|
||||
else
|
||||
range = 5
|
||||
next_range = 5
|
||||
power /= 1.5
|
||||
|
||||
else if(!QDELETED(closest_machine))
|
||||
power = closest_machine.zap_act(power, zap_flags, shocked_targets)
|
||||
|
||||
else if(!QDELETED(closest_blob))
|
||||
power = closest_blob.zap_act(power, zap_flags, shocked_targets)
|
||||
|
||||
else if(!QDELETED(closest_structure))
|
||||
power = closest_structure.zap_act(power, zap_flags, shocked_targets)
|
||||
|
||||
tesla_zap(closest_mob, range, power, zap_flags, shocked_targets)
|
||||
else
|
||||
power = closest_atom.zap_act(power, zap_flags, shocked_targets)
|
||||
if(prob(20))//I know I know
|
||||
tesla_zap(closest_mob, range, power / 2, zap_flags, shocked_targets)
|
||||
tesla_zap(closest_atom, next_range, power * 0.5, zap_flags, shocked_targets)
|
||||
tesla_zap(closest_atom, next_range, power * 0.5, zap_flags, shocked_targets)
|
||||
else
|
||||
tesla_zap(closest_atom, next_range, power, zap_flags, shocked_targets)
|
||||
|
||||
#undef BIKE
|
||||
#undef COIL
|
||||
#undef ROD
|
||||
#undef RIDE
|
||||
#undef LIVING
|
||||
#undef MACHINERY
|
||||
#undef BLOB
|
||||
#undef STRUCTURE
|
||||
|
||||
Reference in New Issue
Block a user