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