diff --git a/code/WorkInProgress/Cael_Aislinn/ShieldGen/energy_field.dm b/code/WorkInProgress/Cael_Aislinn/ShieldGen/energy_field.dm
index a8bda3d14f..d154d591eb 100644
--- a/code/WorkInProgress/Cael_Aislinn/ShieldGen/energy_field.dm
+++ b/code/WorkInProgress/Cael_Aislinn/ShieldGen/energy_field.dm
@@ -40,6 +40,8 @@
/obj/effect/energy_field/proc/Strengthen(var/severity)
strength += severity
+ if (strength < 0)
+ strength = 0
//if we take too much damage, drop out - the generator will bring us back up if we have enough power
if(strength >= 1)
diff --git a/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_capacitor.dm b/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_capacitor.dm
index b95c0ffb6f..d80b98c8e3 100644
--- a/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_capacitor.dm
+++ b/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_capacitor.dm
@@ -7,20 +7,16 @@
desc = "Machine that charges a shield generator."
icon = 'code/WorkInProgress/Cael_Aislinn/ShieldGen/shielding.dmi'
icon_state = "capacitor"
- var/active = 1
+ var/active = 0
density = 1
- var/stored_charge = 0
+ var/stored_charge = 0 //not to be confused with power cell charge, this is in Joules
+ var/last_stored_charge = 0
var/time_since_fail = 100
- var/max_charge = 5e6
- var/charge_limit = 200000
+ var/max_charge = 8e6 //8 MJ
+ var/max_charge_rate = 400000 //400 kW
var/locked = 0
- //
- use_power = 1 //0 use nothing
- //1 use idle power
- //2 use active power
- idle_power_usage = 10
- active_power_usage = 100
- var/charge_rate = 100
+ use_power = 0 //doesn't use APC power
+ var/charge_rate = 100000 //100 kW
var/obj/machinery/shield_gen/owned_gen
/obj/machinery/shield_capacitor/New()
@@ -75,12 +71,12 @@
return src.attack_hand(user)
/obj/machinery/shield_capacitor/attack_hand(mob/user)
- if(stat & (NOPOWER|BROKEN))
+ if(stat & (BROKEN))
return
interact(user)
/obj/machinery/shield_capacitor/interact(mob/user)
- if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
+ if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN)) )
if (!istype(user, /mob/living/silicon))
user.unset_machine()
user << browse(null, "window=shield_capacitor")
@@ -90,13 +86,13 @@
t += "Swipe your ID card to begin."
else
t += "This capacitor is: [active ? "Online" : "Offline" ] [active ? "\[Deactivate\]" : "\[Activate\]"]
"
- t += "[time_since_fail > 2 ? "Charging stable." : "Warning, low charge!"]
"
- t += "Charge: [stored_charge] Watts ([100 * stored_charge/max_charge]%)
"
- t += "Charge rate: \
+ t += "Capacitor Status: [time_since_fail > 2 ? "OK." : "Discharging!"]
"
+ t += "Charge: [stored_charge] J ([100 * stored_charge/max_charge]%)
"
+ t += "Charge Rate: \
\[----\] \
\[---\] \
\[--\] \
- \[-\][charge_rate] Watts/sec \
+ \[-\][charge_rate] W \
\[+\] \
\[++\] \
\[+++\] \
@@ -109,20 +105,27 @@
user.set_machine(src)
/obj/machinery/shield_capacitor/process()
- //
- if(active)
- use_power = 2
- if(stored_charge + charge_rate > max_charge)
- active_power_usage = max_charge - stored_charge
- else
- active_power_usage = charge_rate
- stored_charge += active_power_usage
- else
- use_power = 1
+ if (!anchored)
+ active = 0
+
+ //see if we can connect to a power net.
+ var/datum/powernet/PN
+ var/turf/T = src.loc
+ var/obj/structure/cable/C = T.get_cable_node()
+ if (C)
+ PN = C.powernet
+
+ if (PN)
+ var/power_draw = between(0, max_charge - stored_charge, charge_rate) //what we are trying to draw
+ power_draw = min(power_draw, surplus) //what we actually get
+ if (power_draw > 0)
+ stored_charge += power_draw
+ PN.newload += power_draw //use powernet power
time_since_fail++
- if(stored_charge < active_power_usage * 1.5)
- time_since_fail = 0
+ if(stored_charge < last_stored_charge)
+ time_since_fail = 0 //losing charge faster than we can draw from PN
+ last_stored_charge = stored_charge
/obj/machinery/shield_capacitor/Topic(href, href_list[])
..()
@@ -132,33 +135,16 @@
return
if( href_list["toggle"] )
active = !active
- if(active)
- use_power = 2
- else
- use_power = 1
if( href_list["charge_rate"] )
- charge_rate += text2num(href_list["charge_rate"])
- if(charge_rate > charge_limit)
- charge_rate = charge_limit
- else if(charge_rate < 0)
- charge_rate = 0
- //
+ charge_rate = between(10000, charge_rate + text2num(href_list["charge_rate"]), max_charge_rate)
+
updateDialog()
/obj/machinery/shield_capacitor/power_change()
if(stat & BROKEN)
icon_state = "broke"
else
- if( powered() )
- if (src.active)
- icon_state = "capacitor"
- else
- icon_state = "capacitor"
- stat &= ~NOPOWER
- else
- spawn(rand(0, 15))
- src.icon_state = "capacitor"
- stat |= NOPOWER
+ ..()
/obj/machinery/shield_capacitor/verb/rotate()
set name = "Rotate capacitor clockwise"
diff --git a/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_gen.dm b/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_gen.dm
index e6f206a21e..909b685a91 100644
--- a/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_gen.dm
+++ b/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_gen.dm
@@ -12,24 +12,23 @@
icon_state = "generator0"
var/active = 0
var/field_radius = 3
+ var/max_field_radius = 100
var/list/field
density = 1
var/locked = 0
var/average_field_strength = 0
var/strengthen_rate = 0.2
- var/max_strengthen_rate = 0.2
+ var/max_strengthen_rate = 0.5 //the maximum rate that the generator can increase the average field strength
+ var/dissipation_rate = 0.030 //the percentage of the shield strength that needs to be replaced each second
+ var/min_dissipation = 0.1 //will dissipate by at least this rate in renwicks per field tile (otherwise field would never dissipate completely as dissipation is a percentage)
var/powered = 0
var/check_powered = 1
var/obj/machinery/shield_capacitor/owned_capacitor
var/target_field_strength = 10
+ var/max_field_strength = 10
var/time_since_fail = 100
- var/energy_conversion_rate = 0.01 //how many renwicks per watt?
- //
- use_power = 1 //0 use nothing
- //1 use idle power
- //2 use active power
- idle_power_usage = 20
- active_power_usage = 100
+ var/energy_conversion_rate = 0.0002 //how many renwicks per watt?
+ use_power = 0 //doesn't use APC power
/obj/machinery/shield_gen/New()
spawn(10)
@@ -88,12 +87,12 @@
return src.attack_hand(user)
/obj/machinery/shield_gen/attack_hand(mob/user)
- if(stat & (NOPOWER|BROKEN))
+ if(stat & (BROKEN))
return
interact(user)
/obj/machinery/shield_gen/interact(mob/user)
- if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
+ if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN)) )
if (!istype(user, /mob/living/silicon))
user.unset_machine()
user << browse(null, "window=shield_generator")
@@ -104,29 +103,29 @@
else
t += "[owned_capacitor ? "Charge capacitor connected." : "Unable to locate charge capacitor!"]
"
t += "This generator is: [active ? "Online" : "Offline" ] [active ? "\[Deactivate\]" : "\[Activate\]"]
"
- t += "[time_since_fail > 2 ? "Field is stable." : "Warning, field is unstable!"]
"
- t += "Coverage radius (restart required): \
+ t += "Field Status: [time_since_fail > 2 ? "Stable" : "Unstable"]
"
+ t += "Coverage Radius (restart required): \
--- \
-- \
- \
- [field_radius * 2]m \
+ [field_radius] m \
+ \
++ \
+++
"
- t += "Overall field strength: [average_field_strength] Renwicks ([target_field_strength ? 100 * average_field_strength / target_field_strength : "NA"]%)
"
- t += "Upkeep energy: [field.len * average_field_strength / energy_conversion_rate] Watts/sec
"
- t += "Charge rate: -- \
- [strengthen_rate] Renwicks/sec \
+ t += "Overall Field Strength: [round(average_field_strength, 0.01)] Renwick ([target_field_strength ? round(100 * average_field_strength / target_field_strength) : "NA"]%)
"
+ t += "Upkeep Power: [round(field.len * max(average_field_strength * dissipation_rate, min_dissipation) / energy_conversion_rate)] W
"
+ t += "Charge Rate: -- \
+ [strengthen_rate] Renwick/s \
++
"
- t += "Additional energy required to charge: [field.len * strengthen_rate / energy_conversion_rate] Watts/sec
"
- t += "Maximum field strength: \
- \[min\] \
- -- \
+ t += "Shield Generation Power: [round(field.len * min(strengthen_rate, target_field_strength - average_field_strength) / energy_conversion_rate)] W
"
+ t += "Maximum Field Strength: \
+ \[min\] \
+ -- \
- \
- [target_field_strength] Renwicks \
+ [target_field_strength] Renwick \
+ \
- ++ \
- \[max\]
"
+ ++ \
+ \[max\]
"
t += "