diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 4de06df651..cb4be0d942 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -104,6 +104,7 @@ shock_damage *= siemens_coeff if (shock_damage<1) return 0 + src.take_overall_damage(0,shock_damage,used_weapon="Electrocution") //src.burn_skin(shock_damage) //src.adjustFireLoss(shock_damage) //burn_skin will do this for us @@ -117,6 +118,11 @@ Stun(10)//This should work for now, more is really silly and makes you lay there forever // if(src.weakened < 20*siemens_coeff) src.weakened = 20*siemens_coeff Weaken(10) + + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, loc) + s.start() + return shock_damage diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index b08345ff5e..d7b3eef7f6 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -37,6 +37,22 @@ /mob/living/silicon/stun_effect_act(var/stun_amount, var/agony_amount) return //immune +/mob/living/silicon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0) + + if (istype(source, /obj/machinery/containment_field)) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, loc) + s.start() + + shock_damage *= 0.75 //take reduced damage + take_overall_damage(0, shock_damage) + visible_message("\red [src] was shocked by \the [source]!", \ + "\red Energy pulse detected, system damaged!", \ + "\red You hear an electrical crack") + if(prob(20)) + Stun(2) + return + /mob/living/silicon/proc/damage_mob(var/brute = 0, var/fire = 0, var/tox = 0) return diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 123ed28c9a..2c24eba108 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -56,49 +56,17 @@ if(!FG1 || !FG2) del(src) return 0 - if(iscarbon(user)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, user.loc) - s.start() - + if(isliving(user)) hasShocked = 1 var/shock_damage = min(rand(30,40),rand(30,40)) - user.burn_skin(shock_damage) - user.updatehealth() - user.visible_message("\red [user.name] was shocked by the [src.name]!", \ - "\red You feel a powerful shock course through your body sending you flying!", \ - "\red You hear a heavy electrical crack") + user.electrocute_act(shock_damage, src) - var/stun = min(shock_damage, 15) - user.Stun(stun) - user.Weaken(10) - - user.updatehealth() var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src))) user.throw_at(target, 200, 4) sleep(20) + hasShocked = 0 - return - - else if(issilicon(user)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, user.loc) - s.start() - - hasShocked = 1 - var/shock_damage = rand(15,30) - user.take_overall_damage(0,shock_damage) - user.visible_message("\red [user.name] was shocked by the [src.name]!", \ - "\red Energy pulse detected, system damaged!", \ - "\red You hear an electrical crack") - if(prob(20)) - user.Stun(2) - - sleep(20) - hasShocked = 0 - return - return /obj/machinery/containment_field/proc/set_master(var/master1,var/master2) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index a520cf3166..1796eb754c 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -1,4 +1,5 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 +#define EMITTER_DAMAGE_POWER_TRANSFER 350 //used to transfer power to containment field generators /obj/machinery/power/emitter name = "Emitter" @@ -10,13 +11,15 @@ req_access = list(access_engine_equip) var/id = null - use_power = 0 - idle_power_usage = 10 - active_power_usage = 300 + use_power = 0 //uses powernet power, not APC power + active_power_usage = 30000 //30 kW laser. I guess that means 30 kJ per shot. var/active = 0 var/powered = 0 var/fire_delay = 100 + var/max_burst_delay = 100 + var/min_burst_delay = 20 + var/burst_shots = 3 var/last_shot = 0 var/shot_number = 0 var/state = 0 @@ -118,13 +121,19 @@ return src.last_shot = world.time - if(src.shot_number < 3) + if(src.shot_number < burst_shots) src.fire_delay = 2 src.shot_number ++ else - src.fire_delay = rand(20,100) + src.fire_delay = rand(min_burst_delay, max_burst_delay) src.shot_number = 0 + + //need to calculate the power per shot as the emitter doesn't fire continuously. + var/burst_time = (min_burst_delay + max_burst_delay)/2 + 2*(burst_shots-1) + var/power_per_shot = active_power_usage * (burst_time/10) / burst_shots var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc ) + A.damage = round(power_per_shot/EMITTER_DAMAGE_POWER_TRANSFER) + playsound(src.loc, 'sound/weapons/emitter.ogg', 25, 1) if(prob(35)) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 315068792d..cf339eff30 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -12,7 +12,7 @@ field_generator power level display -Aygar */ -#define field_generator_max_power 250 +#define field_generator_max_power 250000 /obj/machinery/field_generator name = "Field Generator" desc = "A large thermal battery that projects a high amount of energy when powered." @@ -25,12 +25,16 @@ field_generator power level display var/Varedit_start = 0 var/Varpower = 0 var/active = 0 - var/power = 20 // Current amount of power + var/power = 30000 // Current amount of power var/state = 0 var/warming_up = 0 var/list/obj/machinery/containment_field/fields var/list/obj/machinery/field_generator/connected_gens var/clean_up = 0 + + //If keeping field generators powered is hard then increase the emitter active power usage. + var/gen_power_draw = 5500 //power needed per generator + var/field_power_draw = 2000 //power needed per field object /obj/machinery/field_generator/update_icon() @@ -167,8 +171,8 @@ field_generator power level display return 0 /obj/machinery/field_generator/bullet_act(var/obj/item/projectile/Proj) - if(Proj.flag != "bullet") - power += Proj.damage + if(istype(Proj, /obj/item/projectile/beam)) + power += Proj.damage * EMITTER_DAMAGE_POWER_TRANSFER update_icon() return 0 @@ -206,51 +210,44 @@ field_generator power level display if(src.power > field_generator_max_power) src.power = field_generator_max_power - var/power_draw = 2 + var/power_draw = gen_power_draw + for(var/obj/machinery/field_generator/FG in connected_gens) + if (!isnull(FG)) + power_draw += gen_power_draw for (var/obj/machinery/containment_field/F in fields) - if (isnull(F)) - continue - power_draw++ - if(draw_power(round(power_draw/2,1))) + if (!isnull(F)) + power_draw += field_power_draw + power_draw /= 2 //because this will be mirrored for both generators + if(draw_power(round(power_draw)) >= power_draw) return 1 else for(var/mob/M in viewers(src)) - M.show_message("\red The [src.name] shuts down!") + M.show_message("\red \The [src] shuts down!") turn_off() investigate_log("ran out of power and deactivated","singulo") src.power = 0 return 0 -//This could likely be better, it tends to start loopin if you have a complex generator loop setup. Still works well enough to run the engine fields will likely recode the field gens and fields sometime -Mport -/obj/machinery/field_generator/proc/draw_power(var/draw = 0, var/failsafe = 0, var/obj/machinery/field_generator/G = null, var/obj/machinery/field_generator/last = null) - if(Varpower) - return 1 - if((G && G == src) || (failsafe >= 8))//Loopin, set fail - return 0 - else - failsafe++ +//Tries to draw the needed power from our own power reserve, or connected generators if we can. Returns the amount of power we were able to get. +/obj/machinery/field_generator/proc/draw_power(var/draw = 0, var/list/flood_list = list()) + flood_list += src + if(src.power >= draw)//We have enough power src.power -= draw - return 1 - else//Need more power - draw -= src.power - src.power = 0 - for(var/obj/machinery/field_generator/FG in connected_gens) - if(isnull(FG)) - continue - if(FG == last)//We just asked you - continue - if(G)//Another gen is askin for power and we dont have it - if(FG.draw_power(draw,failsafe,G,src))//Can you take the load - return 1 - else - return 0 - else//We are askin another for power - if(FG.draw_power(draw,failsafe,src,src)) - return 1 - else - return 0 - + return draw + + //Need more power + var/actual_draw = src.power //already checked that power < draw + src.power = 0 + + for(var/obj/machinery/field_generator/FG in connected_gens) + if (FG in flood_list) + continue + actual_draw += FG.draw_power(draw - actual_draw, flood_list) //since the flood list reference is shared this actually works. + if (actual_draw >= draw) + return actual_draw + + return actual_draw /obj/machinery/field_generator/proc/start_fields() if(!src.state == 2 || !anchored) diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index a78a964870..c4be677ca5 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -6,7 +6,8 @@ proc emit_particle() 1 power box -the only part of this thing that uses power, can hack to mess with the pa/make it better +the only part of this thing that uses power, can hack to mess with the pa/make it better. +Lies, only the control computer draws power. 1 fuel chamber contains procs for mixing gas and whatever other fuel it uses diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 12dc2f5f22..0ae6a5c3bb 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -10,7 +10,7 @@ density = 1 use_power = 0 idle_power_usage = 500 - active_power_usage = 10000 + active_power_usage = 70000 //70 kW per unit of strength construction_state = 0 active = 0 dir = 1 @@ -20,6 +20,7 @@ /obj/machinery/particle_accelerator/control_box/New() connected_parts = list() + active_power_usage = initial(active_power_usage) * (strength + 1) ..() @@ -29,7 +30,7 @@ /obj/machinery/particle_accelerator/control_box/update_state() if(construction_state < 3) - use_power = 0 + update_use_power(0) assembled = 0 active = 0 for(var/obj/structure/particle_accelerator/part in connected_parts) @@ -39,7 +40,7 @@ connected_parts = list() return if(!part_scan()) - use_power = 1 + update_use_power(1) active = 0 connected_parts = list() @@ -87,6 +88,7 @@ else if(href_list["scan"]) src.part_scan() else if(href_list["strengthup"]) + var/old_strength = strength strength++ if(strength > 2) strength = 2 @@ -97,8 +99,13 @@ for(var/obj/structure/particle_accelerator/part in connected_parts) part.strength = strength part.update_icon() + + if (strength != old_strength) + active_power_usage = initial(active_power_usage) * (strength + 1) + use_power(0) //update power usage else if(href_list["strengthdown"]) + var/old_strength = strength strength-- if(strength < 0) strength = 0 @@ -107,6 +114,10 @@ for(var/obj/structure/particle_accelerator/part in connected_parts) part.strength = strength part.update_icon() + + if (strength != old_strength) + active_power_usage = initial(active_power_usage) * (strength + 1) + use_power(0) //update power usage src.updateDialog() src.update_icon() return @@ -116,9 +127,9 @@ ..() if(stat & NOPOWER) active = 0 - use_power = 0 + update_use_power(0) else if(!stat && construction_state == 3) - use_power = 1 + update_use_power(1) return @@ -188,13 +199,13 @@ /obj/machinery/particle_accelerator/control_box/proc/toggle_power() src.active = !src.active if(src.active) - src.use_power = 2 + update_use_power(2) for(var/obj/structure/particle_accelerator/part in connected_parts) part.strength = src.strength part.powered = 1 part.update_icon() else - src.use_power = 1 + update_use_power(1) for(var/obj/structure/particle_accelerator/part in connected_parts) part.strength = null part.powered = 0