diff --git a/baystation12.dme b/baystation12.dme
index d972490d4bb..876093d2403 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -206,6 +206,7 @@
#define FILE_DIR "icons/vending_icons"
#define FILE_DIR "interface"
#define FILE_DIR "maps"
+#define FILE_DIR "maps/backup"
#define FILE_DIR "maps/RandomZLevels"
#define FILE_DIR "sound"
#define FILE_DIR "sound/AI"
@@ -1167,7 +1168,11 @@
#include "code\WorkInProgress\AI_Visibility\minimap.dm"
#include "code\WorkInProgress\AI_Visibility\util.dm"
#include "code\WorkInProgress\animusstation\atm.dm"
+#include "code\WorkInProgress\Cael_Aislinn\energy_field.dm"
+#include "code\WorkInProgress\Cael_Aislinn\external_shield_gen.dm"
#include "code\WorkInProgress\Cael_Aislinn\power_monitor.dm"
+#include "code\WorkInProgress\Cael_Aislinn\shield_capacitor.dm"
+#include "code\WorkInProgress\Cael_Aislinn\shield_gen.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\core_field.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\core_gen.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\core_monitor.dm"
diff --git a/code/WorkInProgress/Cael_Aislinn/shield_gen.dm b/code/WorkInProgress/Cael_Aislinn/shield_gen.dm
deleted file mode 100644
index 46f1f4c6abb..00000000000
--- a/code/WorkInProgress/Cael_Aislinn/shield_gen.dm
+++ /dev/null
@@ -1,280 +0,0 @@
-//renwicks: fictional unit to describe shield strength
-//a small meteor hit will deduct 1 renwick of strength from that shield tile
-//light explosion range will do 1 renwick's damage
-//medium explosion range will do 2 renwick's damage
-//heavy explosion range will do 3 renwick's damage
-//explosion damage is cumulative. if a tile is in range of light, medium and heavy damage, it will take a hit from all three
-
-/obj/machinery/shield_gen
- name = "shield generator"
- desc = "Machine that generates an impenetrable field of energy when activated."
- icon = 'shielding.dmi'
- icon_state = "generator0"
- var/active = 0
- var/field_radius = 3
- var/list/field
- density = 1
- anchored = 1
- var/locked = 0
- var/average_field_strength = 0
- var/strengthen_rate = 0.2
- var/max_strengthen_rate = 0.2
- var/powered = 0
- var/check_powered = 1
- var/obj/machinery/shield_capacitor/owned_capacitor
- var/max_field_strength = 10
- var/time_since_fail = 100
- var/energy_conversion_rate = 0.01 //how many renwicks per watt?
- var/flicker_shield_glitch = 1 //shield is slightly faulty, and flickers
- //
- use_power = 1 //0 use nothing
- //1 use idle power
- //2 use active power
- idle_power_usage = 20
- active_power_usage = 100
-
-/obj/machinery/shield_gen/New()
- ..()
- field = new/list()
- for(var/obj/machinery/shield_capacitor/possible_cap in range(1))
- if(get_dir(possible_cap, src) == possible_cap.dir)
- owned_capacitor = possible_cap
- break
- /*spawn(10)
- check_powered()*/
-
-//copied from a copypaste. DRY, right?
-/obj/machinery/shield_gen/proc/check_powered()
- /*
- check_powered = 1
- if(!anchored)
- powered = 0
- return 0
- var/turf/T = src.loc
- var/obj/structure/cable/C = T.get_cable_node()
- var/net
- if (C)
- net = C.netnum // find the powernet of the connected cable
-
- if(!net)
- powered = 0
- return 0
- var/datum/powernet/PN = powernets[net] // find the powernet. Magic code, voodoo code.
-
- if(!PN)
- powered = 0
- return 0
- var/surplus = max(PN.avail-PN.load, 0)
- var/shieldload = min(rand(50,200), surplus)
- if(shieldload==0 && !storedpower) // no cable or no power, and no power stored
- powered = 0
- return 0
- else
- powered = 1
- if(PN)
- storedpower += shieldload
- PN.newload += shieldload //uses powernet power.
- */
-
-/obj/machinery/shield_gen/process()
-
- if(!owned_capacitor)
- for(var/obj/machinery/shield_capacitor/possible_cap in range(1))
- if(get_dir(possible_cap, src) == possible_cap.dir)
- owned_capacitor = possible_cap
- break
-
- if(active && field.len)
- var/stored_renwicks = 0
- var/target_field_strength = min(average_field_strength + strengthen_rate, max_field_strength)
- if(owned_capacitor)
- var/assumed_charge = min(owned_capacitor.stored_charge, (target_field_strength / energy_conversion_rate) * field.len)
- stored_renwicks = assumed_charge * energy_conversion_rate
- owned_capacitor.stored_charge -= assumed_charge
-
- time_since_fail++
-
- average_field_strength = 0
- target_field_strength = stored_renwicks / field.len
-
- if(!flicker_shield_glitch)
- for(var/obj/effect/energy_field/E in field)
- //check to see if the shield is strengthening or failing
- if(E.strength > target_field_strength)
- E.strength = target_field_strength
- else if(E.strength + strengthen_rate > target_field_strength)
- E.strength = target_field_strength
- else
- E.strength += strengthen_rate
-
- if(stored_renwicks - E.strength < 0)
- E.strength = stored_renwicks
- stored_renwicks -= E.strength
-
- average_field_strength += E.strength
- //check if the current shield tile has enough energy to maintain itself
- if(E.strength >= 1)
- E.density = 1
- E.invisibility = 0
- else
- E.density = 0
- E.invisibility = 2
- else
- //the flicker shield glitch is an intersting quirk in 'older' and/or faulty shielding models
- //basically, it strengthens the shields continuously until it can no longer sustain them... then it drops out for a few seconds and starts again
- //this makes the shield 'flicker' every now and then until it stabilises
- //when this glitch is fixed, shields will only be charged as much as is sustainable
- for(var/obj/effect/energy_field/E in field)
- //check to see if the shield is strengthening or failing
- if(E.strength < target_field_strength)
- E.strength += strengthen_rate
-
- retry:
- if(stored_renwicks - E.strength < 0)
- if(owned_capacitor.stored_charge > 0)
- var/emergency_renwicks = min(E.strength, owned_capacitor.stored_charge * energy_conversion_rate)
- owned_capacitor.stored_charge -= emergency_renwicks / energy_conversion_rate
- stored_renwicks += emergency_renwicks
- goto retry
- else
- E.strength = stored_renwicks
- stored_renwicks -= E.strength
-
- average_field_strength += E.strength
- //check if the current shield tile has enough energy to maintain itself
- if(E.strength >= 1)
- E.density = 1
- E.invisibility = 0
- else
- E.density = 0
- E.invisibility = 2
-
- //add any leftover charge back to the capacitor
- if(owned_capacitor && stored_renwicks >= 0)
- owned_capacitor.stored_charge += stored_renwicks / energy_conversion_rate
-
- average_field_strength /= field.len
- if(average_field_strength < 0)
- time_since_fail = 0
- else
- average_field_strength = 0
- //
- updateDialog()
-
-/obj/machinery/shield_gen/attack_hand(mob/user as mob)
-
- interact(user)
- src.add_fingerprint(user)
-
-/obj/machinery/shield_gen/attackby(obj/item/W, mob/user)
-
- if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
- if (src.allowed(user))
- src.locked = !src.locked
- user << "Controls are now [src.locked ? "locked." : "unlocked."]"
- else
- user << "\red Access denied."
-
- else
- src.add_fingerprint(user)
- user << "\red You hit the [src.name] with your [W.name]!"
- for(var/mob/M in viewers(src))
- if(M == user) continue
- M.show_message("\red The [src.name] has been hit with the [W.name] by [user.name]!")
-
-/obj/machinery/shield_gen/power_change()
- if(stat & BROKEN)
- icon_state = "broke"
- else
- if( powered() )
- if (src.active)
- icon_state = "generator1"
- else
- icon_state = "generator0"
- stat &= ~NOPOWER
- else
- spawn(rand(0, 15))
- src.icon_state = "generator0"
- stat |= NOPOWER
- if (src.active)
- toggle()
-
-/obj/machinery/shield_gen/proc/toggle()
- active = !active
- power_change()
- if(active)
- var/list/covered_turfs = get_shielded_turfs()
- if(get_turf(src) in covered_turfs)
- covered_turfs.Remove(get_turf(src))
- for(var/turf/O in covered_turfs)
- var/obj/effect/energy_field/E = new(O)
- field.Add(E)
- del covered_turfs
-
- for(var/mob/M in view(5,src))
- M << "\icon[src] You hear heavy droning start up."
- else
- for(var/obj/effect/energy_field/D in field)
- field.Remove(D)
- del D
-
- for(var/mob/M in view(5,src))
- M << "\icon[src] You hear heavy droning fade out."
-
-/obj/machinery/shield_gen/Topic(href, href_list[])
- ..()
- if( href_list["close"] )
- usr << browse(null, "window=shield_generator")
- usr.machine = null
- return
- else if( href_list["toggle"] )
- toggle()
- else if( href_list["change_radius"] )
- field_radius += text2num(href_list["change_radius"])
- if(field_radius > 200)
- field_radius = 200
- else if(field_radius < 0)
- field_radius = 0
- else if( href_list["strengthen_rate"] )
- strengthen_rate += text2num(href_list["strengthen_rate"])
- if(strengthen_rate > 0.2)
- strengthen_rate = 0.2
- else if(strengthen_rate < 0)
- strengthen_rate = 0
- else if( href_list["max_field_strength"] )
- max_field_strength += text2num(href_list["max_field_strength"])
- if(max_field_strength > 1000)
- max_field_strength = 1000
- else if(max_field_strength < 0)
- max_field_strength = 0
- //
- updateDialog()
-
-/obj/machinery/shield_gen/proc/interact(mob/user)
- if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
- if (!istype(user, /mob/living/silicon))
- user.machine = null
- user << browse(null, "window=shield_generator")
- return
- var/t = "Shield Generator Control Console
"
- 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 (generator will need a restart to take effect): -- - [field_radius * 2]m + ++
"
- t += "Overall field strength: [average_field_strength] Renwicks ([100 * average_field_strength / max_field_strength]%)
"
- t += "Charge consumption: [( (min(average_field_strength + strengthen_rate, max_field_strength)) / energy_conversion_rate) * field.len] Watts/sec
"
- t += "Field charge rate (approx): -- -[strengthen_rate] Renwicks/sec + ++
"
- t += "Maximum field strength (avg across field): \[min\] -- -[max_field_strength] Renwicks + ++ \[max\]
"
- t += "