From 8322aa933842e8d594933df54b8bb76bdc66db23 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sat, 30 Apr 2016 06:44:01 -0400 Subject: [PATCH] Tesla Update/Rebalance --- code/__HELPERS/unsorted.dm | 16 ++ code/datums/beam.dm | 16 +- code/datums/uplink_item.dm | 7 +- code/game/machinery/machinery.dm | 11 + code/game/objects/objs.dm | 6 +- code/modules/assembly/igniter.dm | 2 +- code/modules/power/tesla/coil.dm | 15 +- code/modules/power/tesla/energy_ball.dm | 289 ++++++++++++--------- code/modules/reagents/reagent_dispenser.dm | 38 +-- 9 files changed, 235 insertions(+), 165 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 33a815f2443..2f332f8f10b 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1611,6 +1611,22 @@ var/mob/dview/dview_mob = new tY = max(1, min(world.maxy, origin.y + (text2num(tY) - (world.view + 1)))) return locate(tX, tY, tZ) +/proc/get_closest_atom(type, list, source) + var/closest_atom + var/closest_distance + for(var/A in list) + if(!istype(A, type)) + continue + var/distance = get_dist(source, A) + if(!closest_distance) + closest_distance = distance + closest_atom = A + else + if(closest_distance > distance) + closest_distance = distance + closest_atom = A + return closest_atom + /proc/pick_closest_path(value) var/list/matches = get_fancy_list_of_types() if (!isnull(value) && value!="") diff --git a/code/datums/beam.dm b/code/datums/beam.dm index e87c60e54bd..1b48dd37560 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -19,13 +19,9 @@ /datum/beam/New(beam_origin,beam_target,beam_icon='icons/effects/beam.dmi',beam_icon_state="b_beam",time=50,maxdistance=10,btype = /obj/effect/ebeam) endtime = world.time+time origin = beam_origin - origin_oldloc = origin.loc - if(isarea(origin_oldloc)) - origin_oldloc = origin + origin_oldloc = get_turf(origin) target = beam_target - target_oldloc = target.loc - if(isarea(target_oldloc)) - target_oldloc = target + target_oldloc = get_turf(target) if(origin_oldloc == origin && target_oldloc == target) static_beam = 1 max_distance = maxdistance @@ -38,9 +34,11 @@ /datum/beam/proc/Start() Draw() while(!finished && origin && target && world.time < endtime && get_dist(origin,target)= 300) - energy -= 300 - playsound(src.loc, 'sound/magic/lightning_chargeup.ogg', 100, 1, extrarange = 15) + if(energy >= energy_to_raise) + energy_to_lower = energy_to_raise - 20 + energy_to_raise = energy_to_raise * 1.5 + + playsound(src.loc, 'sound/magic/lightning_chargeup.ogg', 100, 1, extrarange = 30) spawn(100) + if (!loc) + return var/obj/singularity/energy_ball/EB = new(loc) - orbiting_balls.Add(EB) - EB.transform *= pick(0.3,0.4,0.5,0.6,0.7) - EB.is_orbiting = 1 + + EB.transform *= pick(0.3, 0.4, 0.5, 0.6, 0.7) var/icon/I = icon(icon,icon_state,dir) - var/orbitsize = (I.Width()+I.Height())*pick(0.5,0.6,0.7) - orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) - spawn(1) - EB.orbit(src,orbitsize, pick(FALSE,TRUE), rand(10,25), pick(3,4,5,6,36)) + var/orbitsize = (I.Width() + I.Height()) * pick(0.4, 0.5, 0.6, 0.7, 0.8) + orbitsize -= (orbitsize / world.icon_size) * (world.icon_size * 0.25) + EB.orbit(src, orbitsize, pick(FALSE, TRUE), rand(10, 25), pick(3, 4, 5, 6, 36)) + else if(energy < energy_to_lower && orbiting_balls.len) + energy_to_raise = energy_to_raise / 1.5 + energy_to_lower = (energy_to_raise / 1.5) - 20 + + var/Orchiectomy_target = pick(orbiting_balls) + qdel(Orchiectomy_target) + + else if(orbiting_balls.len) + energy -= orbiting_balls.len * 0.5 /obj/singularity/energy_ball/Bump(atom/A) dust_mobs(A) @@ -90,120 +122,119 @@ var/list/blacklisted_tesla_types = list(/obj/machinery/atmospherics, /obj/singularity/energy_ball/Bumped(atom/A) dust_mobs(A) +/obj/singularity/energy_ball/orbit(obj/singularity/energy_ball/target) + if (istype(target)) + target.orbiting_balls += src + + . = ..() + + if (istype(target)) + target.orbiting_balls -= src + if (!loc) + qdel(src) + /obj/singularity/energy_ball/proc/dust_mobs(atom/A) if(istype(A, /mob/living/carbon)) var/mob/living/carbon/C = A C.dust() return -/proc/get_closest_atom(type, list, source) - var/closest_atom - var/closest_distance - for(var/A in list) - if(!istype(A, type)) - continue - var/distance = get_dist(source, A) - if(!closest_distance) - closest_distance = distance - closest_atom = A - else - if(closest_distance > distance) - closest_distance = distance - closest_atom = A - return closest_atom - /proc/tesla_zap(var/atom/source, zap_range = 3, power) + . = source.dir if(power < 1000) return - var/list/tesla_coils = list() - var/list/grounding_rods = list() - var/list/potential_machine_zaps = list() - var/list/potential_mob_zaps = list() - var/list/potential_structure_zaps = list() + + var/closest_dist = 0 var/closest_atom - for(var/atom/A in oview(source, zap_range)) + var/obj/machinery/power/tesla_coil/closest_tesla_coil + var/obj/machinery/power/grounding_rod/closest_grounding_rod + var/mob/living/closest_mob + var/obj/machinery/closest_machine + var/obj/structure/closest_structure + + for(var/A in oview(source, zap_range)) if(istype(A, /obj/machinery/power/tesla_coil)) + var/dist = get_dist(source, A) var/obj/machinery/power/tesla_coil/C = A - if(C.being_shocked) - continue - tesla_coils.Add(C) + if((dist < closest_dist || !closest_tesla_coil) && !C.being_shocked) + closest_dist = dist + + //we use both of these to save on istype and typecasting overhead later on + //while still allowing common code to run before hand + closest_tesla_coil = C + closest_atom = C + + + else if(closest_tesla_coil) + continue //no need checking these other things + + else if(istype(A, /obj/machinery/power/grounding_rod)) + var/dist = get_dist(source, A) + if(dist < closest_dist || !closest_grounding_rod) + closest_grounding_rod = A + closest_atom = A + closest_dist = dist + + else if(closest_grounding_rod || is_type_in_list(A, blacklisted_tesla_types)) continue - if(istype(A, /obj/machinery/power/grounding_rod)) - var/obj/machinery/power/grounding_rod/R = A - grounding_rods.Add(R) - continue - if(istype(A, /obj/machinery)) - var/obj/machinery/M = A - if(is_type_in_list(M, blacklisted_tesla_types)) - continue - if(M.being_shocked) - continue - potential_machine_zaps.Add(M) - continue - if(istype(A, /obj/structure)) - var/obj/structure/M = A - if(is_type_in_list(M, blacklisted_tesla_types)) - continue - if(M.being_shocked) - continue - potential_structure_zaps.Add(M) - continue - if(istype(A, /mob/living)) + + else if(istype(A, /mob/living)) + var/dist = get_dist(source, A) var/mob/living/L = A - if(L.stat == DEAD) - continue - if(is_type_in_list(L, blacklisted_tesla_types)) - continue - potential_mob_zaps.Add(L) + if((dist < closest_dist || !closest_mob) && L.stat != DEAD) + closest_mob = L + closest_atom = A + closest_dist = dist + + else if(closest_mob) continue - closest_atom = get_closest_atom(/obj/machinery/power/tesla_coil, tesla_coils, source) - if(closest_atom && istype(closest_atom, /obj/machinery/power/tesla_coil)) - var/obj/machinery/power/tesla_coil/C = closest_atom - source.Beam(C,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5) - C.tesla_act(power) - return - if(!closest_atom) - closest_atom = get_closest_atom(/obj/machinery/power/grounding_rod, grounding_rods, source) - if(closest_atom && istype(closest_atom, /obj/machinery/power/grounding_rod)) - var/obj/machinery/power/grounding_rod/R = closest_atom - source.Beam(R,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5) - R.tesla_act(power) - return - if(!closest_atom) - closest_atom = get_closest_atom(/mob/living, potential_mob_zaps, source) - if(closest_atom && istype(closest_atom, /mob/living)) - var/mob/living/L = closest_atom - var/shock_damage = Clamp(round(power/400), 10, 90) + rand(-5,5) - source.Beam(L,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5) - L.electrocute_act(shock_damage, source, 1, tesla_shock = 1) - if(istype(L, /mob/living/silicon)) - var/mob/living/silicon/S = L - S.emp_act(2) - tesla_zap(S, 7, power / 1.5) // metallic folks bounce it further - else - tesla_zap(L, 5, power / 1.5) - return - if(!closest_atom) - closest_atom = get_closest_atom(/obj/machinery, potential_machine_zaps, source) - if(closest_atom) - var/obj/machinery/M = closest_atom - source.Beam(M,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5) - M.tesla_act(power) - if(prob(85)) - M.emp_act(2) - else - if(prob(50)) - M.ex_act(3) - else - if(prob(90)) - M.ex_act(2) - else - M.ex_act(1) - return - if(!closest_atom) - closest_atom = get_closest_atom(/obj/structure, potential_structure_zaps, source) - if(closest_atom) - var/obj/structure/S = closest_atom - source.Beam(S,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5) - S.tesla_act(power) - return + + else if(istype(A, /obj/machinery)) + var/obj/machinery/M = A + var/dist = get_dist(source, A) + if((dist < closest_dist || !closest_machine) && !M.being_shocked) + closest_machine = M + closest_atom = A + closest_dist = dist + + else if(closest_mob) + continue + + else if(istype(A, /obj/structure)) + var/obj/structure/S = A + var/dist = get_dist(source, A) + if((dist < closest_dist || !closest_tesla_coil) && !S.being_shocked) + closest_structure = S + 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)]", icon='icons/effects/effects.dmi', time=5) + var/zapdir = get_dir(source, closest_atom) + if(zapdir) + . = zapdir + + //per type stuff: + if(closest_tesla_coil) + closest_tesla_coil.tesla_act(power) + + else if(closest_grounding_rod) + closest_grounding_rod.tesla_act(power) + + else if(closest_mob) + var/shock_damage = Clamp(round(power/400), 10, 90) + rand(-5, 5) + closest_mob.electrocute_act(shock_damage, source, 1, tesla_shock = 1) + if(istype(closest_mob, /mob/living/silicon)) + var/mob/living/silicon/S = closest_mob + S.emp_act(2) + tesla_zap(S, 7, power / 1.5) // metallic folks bounce it further + else + tesla_zap(closest_mob, 5, power / 1.5) + + else if(closest_machine) + closest_machine.tesla_act(power) + + else if(closest_structure) + closest_structure.tesla_act(power) \ No newline at end of file diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 23f09e6c95b..70f8060a670 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -98,18 +98,31 @@ ..() reagents.add_reagent("fuel",1000) -/obj/structure/reagent_dispensers/fueltank/bullet_act(var/obj/item/projectile/Proj) - if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet)) - if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)) - message_admins("[key_name_admin(Proj.firer)] triggered a fueltank explosion.") - log_game("[key_name(Proj.firer)] triggered a fueltank explosion.") - explode() +/obj/structure/reagent_dispensers/fueltank/bullet_act(obj/item/projectile/Proj) + ..() + if(istype(Proj) && !Proj.nodamage && ((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))) + message_admins("[key_name_admin(Proj.firer)] triggered a fueltank explosion.") + log_game("[key_name(Proj.firer)] triggered a fueltank explosion.") + boom() -/obj/structure/reagent_dispensers/fueltank/blob_act() +/obj/structure/reagent_dispensers/fueltank/proc/boom() explosion(src.loc,0,1,5,7,10, flame_range = 5) + if(src) + qdel(src) + +/obj/structure/reagent_dispensers/fueltank/blob_act(obj/effect/blob/B) + boom() + /obj/structure/reagent_dispensers/fueltank/ex_act() - explode() + boom() + +/obj/structure/reagent_dispensers/fueltank/fire_act() + boom() + +/obj/structure/reagent_dispensers/fueltank/tesla_act() + ..() //extend the zap + boom() /obj/structure/reagent_dispensers/fueltank/examine(mob/user) if(!..(user, 2)) @@ -151,15 +164,6 @@ return ..() -/obj/structure/reagent_dispensers/fueltank/proc/explode() - explosion(src.loc,-1,0,2, flame_range = 2) - if(src) - qdel(src) - -/obj/structure/reagent_dispensers/fueltank/fire_act(datum/gas_mixture/air, temperature, volume) - blob_act() //saving a few lines of copypasta - - /obj/structure/reagent_dispensers/fueltank/Move() ..() if(rig)