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:
LemonInTheDark
2020-04-24 21:34:40 -03:00
committed by GitHub
parent 8e7d312412
commit 006cc4947d
5 changed files with 102 additions and 109 deletions
+8
View File
@@ -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
*
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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 ..()
+12 -17
View File
@@ -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
+80 -90
View File
@@ -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