diff --git a/baystation12.dme b/baystation12.dme
index 90020c08644..52a2cd5319d 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -318,7 +318,6 @@
#include "code\game\machinery\requests_console.dm"
#include "code\game\machinery\robot_fabricator.dm"
#include "code\game\machinery\seed_extractor.dm"
-#include "code\game\machinery\shieldgen.dm"
#include "code\game\machinery\Sleeper.dm"
#include "code\game\machinery\spaceheater.dm"
#include "code\game\machinery\status_display.dm"
@@ -1316,6 +1315,13 @@
#include "code\modules\scripting\Scanner\Tokens.dm"
#include "code\modules\security levels\keycard authentication.dm"
#include "code\modules\security levels\security levels.dm"
+#include "code\modules\shieldgen\circuits_and_designs.dm"
+#include "code\modules\shieldgen\emergency_shield.dm"
+#include "code\modules\shieldgen\energy_field.dm"
+#include "code\modules\shieldgen\sheldwallgen.dm"
+#include "code\modules\shieldgen\shield_capacitor.dm"
+#include "code\modules\shieldgen\shield_gen.dm"
+#include "code\modules\shieldgen\shield_gen_external.dm"
#include "code\modules\shuttles\antagonist.dm"
#include "code\modules\shuttles\departmental.dm"
#include "code\modules\shuttles\shuttle.dm"
@@ -1388,11 +1394,6 @@
#include "code\WorkInProgress\Cael_Aislinn\Rust\gyrotron_controller.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\radiation.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\virtual_particle_catcher.dm"
-#include "code\WorkInProgress\Cael_Aislinn\ShieldGen\circuits_and_designs.dm"
-#include "code\WorkInProgress\Cael_Aislinn\ShieldGen\energy_field.dm"
-#include "code\WorkInProgress\Cael_Aislinn\ShieldGen\shield_capacitor.dm"
-#include "code\WorkInProgress\Cael_Aislinn\ShieldGen\shield_gen.dm"
-#include "code\WorkInProgress\Cael_Aislinn\ShieldGen\shield_gen_external.dm"
#include "code\WorkInProgress\Cael_Aislinn\Supermatter\LaserComputer.dm"
#include "code\WorkInProgress\Cael_Aislinn\Supermatter\ZeroPointLaser.dm"
#include "code\WorkInProgress\Chinsky\ashtray.dm"
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
deleted file mode 100644
index b67b2cee3ae..00000000000
--- a/code/game/machinery/shieldgen.dm
+++ /dev/null
@@ -1,673 +0,0 @@
-/obj/machinery/shield
- name = "Emergency energy shield"
- desc = "An energy shield used to contain hull breaches."
- icon = 'icons/effects/effects.dmi'
- icon_state = "shield-old"
- density = 1
- opacity = 0
- anchored = 1
- unacidable = 1
- var/const/max_health = 200
- var/health = max_health //The shield can only take so much beating (prevents perma-prisons)
- var/shield_generate_power = 7500 //how much power we use when regenerating
- var/shield_idle_power = 1500 //how much power we use when just being sustained.
-
-/obj/machinery/shield/New()
- src.dir = pick(1,2,3,4)
- ..()
- update_nearby_tiles(need_rebuild=1)
-
-/obj/machinery/shield/Del()
- opacity = 0
- density = 0
- update_nearby_tiles()
- ..()
-
-/obj/machinery/shield/CanPass(atom/movable/mover, turf/target, height, air_group)
- if(!height || air_group) return 0
- else return ..()
-
-//Looks like copy/pasted code... I doubt 'need_rebuild' is even used here - Nodrak
-/obj/machinery/shield/proc/update_nearby_tiles(need_rebuild)
- if(!air_master)
- return 0
-
- air_master.mark_for_update(get_turf(src))
-
- return 1
-
-
-/obj/machinery/shield/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(!istype(W)) return
-
- //Calculate damage
- var/aforce = W.force
- if(W.damtype == BRUTE || W.damtype == BURN)
- src.health -= aforce
-
- //Play a fitting sound
- playsound(src.loc, 'sound/effects/EMPulse.ogg', 75, 1)
-
-
- if (src.health <= 0)
- visible_message("\blue The [src] dissipates!")
- del(src)
- return
-
- opacity = 1
- spawn(20) if(src) opacity = 0
-
- ..()
-
-/obj/machinery/shield/meteorhit()
- src.health -= max_health*0.75 //3/4 health as damage
-
- if(src.health <= 0)
- visible_message("\blue The [src] dissipates!")
- del(src)
- return
-
- opacity = 1
- spawn(20) if(src) opacity = 0
- return
-
-/obj/machinery/shield/bullet_act(var/obj/item/projectile/Proj)
- health -= Proj.damage
- ..()
- if(health <=0)
- visible_message("\blue The [src] dissipates!")
- del(src)
- return
- opacity = 1
- spawn(20) if(src) opacity = 0
-
-/obj/machinery/shield/ex_act(severity)
- switch(severity)
- if(1.0)
- if (prob(75))
- del(src)
- if(2.0)
- if (prob(50))
- del(src)
- if(3.0)
- if (prob(25))
- del(src)
- return
-
-/obj/machinery/shield/emp_act(severity)
- switch(severity)
- if(1)
- del(src)
- if(2)
- if(prob(50))
- del(src)
-
-/obj/machinery/shield/blob_act()
- del(src)
-
-
-/obj/machinery/shield/hitby(AM as mob|obj)
- //Let everyone know we've been hit!
- visible_message("\red [src] was hit by [AM].")
-
- //Super realistic, resource-intensive, real-time damage calculations.
- var/tforce = 0
- if(ismob(AM))
- tforce = 40
- else
- tforce = AM:throwforce
-
- src.health -= tforce
-
- //This seemed to be the best sound for hitting a force field.
- playsound(src.loc, 'sound/effects/EMPulse.ogg', 100, 1)
-
- //Handle the destruction of the shield
- if (src.health <= 0)
- visible_message("\blue The [src] dissipates!")
- del(src)
- return
-
- //The shield becomes dense to absorb the blow.. purely asthetic.
- opacity = 1
- spawn(20) if(src) opacity = 0
-
- ..()
- return
-
-
-
-/obj/machinery/shieldgen
- name = "Emergency shield projector"
- desc = "Used to seal minor hull breaches."
- icon = 'icons/obj/objects.dmi'
- icon_state = "shieldoff"
- density = 1
- opacity = 0
- anchored = 0
- pressure_resistance = 2*ONE_ATMOSPHERE
- req_access = list(access_engine)
- var/const/max_health = 100
- var/health = max_health
- var/active = 0
- var/malfunction = 0 //Malfunction causes parts of the shield to slowly dissapate
- var/list/deployed_shields = list()
- var/list/regenerating = list()
- var/is_open = 0 //Whether or not the wires are exposed
- var/locked = 0
- var/check_delay = 60 //periodically recheck if we need to rebuild a shield
- use_power = 0
- idle_power_usage = 0
-
-/obj/machinery/shieldgen/Del()
- for(var/obj/machinery/shield/shield_tile in deployed_shields)
- del(shield_tile)
- ..()
-
-
-/obj/machinery/shieldgen/proc/shields_up()
- if(active) return 0 //If it's already turned on, how did this get called?
-
- src.active = 1
- update_icon()
-
- create_shields()
-
- idle_power_usage = 0
- for(var/obj/machinery/shield/shield_tile in deployed_shields)
- idle_power_usage += shield_tile.shield_idle_power
- update_use_power(1)
-
-/obj/machinery/shieldgen/proc/shields_down()
- if(!active) return 0 //If it's already off, how did this get called?
-
- src.active = 0
- update_icon()
-
- for(var/obj/machinery/shield/shield_tile in deployed_shields)
- del(shield_tile)
-
- update_use_power(0)
-
-/obj/machinery/shieldgen/proc/create_shields()
- for(var/turf/target_tile in range(2, src))
- if (istype(target_tile,/turf/space) && !(locate(/obj/machinery/shield) in target_tile))
- if (malfunction && prob(33) || !malfunction)
- var/obj/machinery/shield/S = new/obj/machinery/shield(target_tile)
- deployed_shields += S
- use_power(S.shield_generate_power)
-
-/obj/machinery/shieldgen/process()
- if (!active)
- return
-
- if(malfunction)
- if(deployed_shields.len && prob(5))
- del(pick(deployed_shields))
- else
- if (check_delay <= 0)
- create_shields()
-
- var/new_power_usage = 0
- for(var/obj/machinery/shield/shield_tile in deployed_shields)
- new_power_usage += shield_tile.shield_idle_power
-
- if (new_power_usage != idle_power_usage)
- idle_power_usage = new_power_usage
- use_power(0)
-
- check_delay = 60
- else
- check_delay--
-
-/obj/machinery/shieldgen/proc/checkhp()
- if(health <= 30)
- src.malfunction = 1
- if(health <= 0)
- del(src)
- update_icon()
- return
-
-/obj/machinery/shieldgen/meteorhit(obj/O as obj)
- src.health -= max_health*0.25 //A quarter of the machine's health
- if (prob(5))
- src.malfunction = 1
- src.checkhp()
- return
-
-/obj/machinery/shieldgen/ex_act(severity)
- switch(severity)
- if(1.0)
- src.health -= 75
- src.checkhp()
- if(2.0)
- src.health -= 30
- if (prob(15))
- src.malfunction = 1
- src.checkhp()
- if(3.0)
- src.health -= 10
- src.checkhp()
- return
-
-/obj/machinery/shieldgen/emp_act(severity)
- switch(severity)
- if(1)
- src.health /= 2 //cut health in half
- malfunction = 1
- locked = pick(0,1)
- if(2)
- if(prob(50))
- src.health *= 0.3 //chop off a third of the health
- malfunction = 1
- checkhp()
-
-/obj/machinery/shieldgen/attack_hand(mob/user as mob)
- if(locked)
- user << "The machine is locked, you are unable to use it."
- return
- if(is_open)
- user << "The panel must be closed before operating this machine."
- return
-
- if (src.active)
- user.visible_message("\blue \icon[src] [user] deactivated the shield generator.", \
- "\blue \icon[src] You deactivate the shield generator.", \
- "You hear heavy droning fade out.")
- src.shields_down()
- else
- if(anchored)
- user.visible_message("\blue \icon[src] [user] activated the shield generator.", \
- "\blue \icon[src] You activate the shield generator.", \
- "You hear heavy droning.")
- src.shields_up()
- else
- user << "The device must first be secured to the floor."
- return
-
-/obj/machinery/shieldgen/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/card/emag))
- malfunction = 1
- update_icon()
-
- else if(istype(W, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
- if(is_open)
- user << "\blue You close the panel."
- is_open = 0
- else
- user << "\blue You open the panel and expose the wiring."
- is_open = 1
-
- else if(istype(W, /obj/item/weapon/cable_coil) && malfunction && is_open)
- var/obj/item/weapon/cable_coil/coil = W
- user << "\blue You begin to replace the wires."
- //if(do_after(user, min(60, round( ((maxhealth/health)*10)+(malfunction*10) ))) //Take longer to repair heavier damage
- if(do_after(user, 30))
- if(!src || !coil) return
- coil.use(1)
- health = max_health
- malfunction = 0
- user << "\blue You repair the [src]!"
- update_icon()
-
- else if(istype(W, /obj/item/weapon/wrench))
- if(locked)
- user << "The bolts are covered, unlocking this would retract the covers."
- return
- if(anchored)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- user << "\blue You unsecure the [src] from the floor!"
- if(active)
- user << "\blue The [src] shuts off!"
- src.shields_down()
- anchored = 0
- else
- if(istype(get_turf(src), /turf/space)) return //No wrenching these in space!
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- user << "\blue You secure the [src] to the floor!"
- anchored = 1
-
-
- else if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))
- if(src.allowed(user))
- src.locked = !src.locked
- user << "The controls are now [src.locked ? "locked." : "unlocked."]"
- else
- user << "\red Access denied."
-
- else
- ..()
-
-
-/obj/machinery/shieldgen/update_icon()
- if(active)
- src.icon_state = malfunction ? "shieldonbr":"shieldon"
- else
- src.icon_state = malfunction ? "shieldoffbr":"shieldoff"
- return
-
-////FIELD GEN START //shameless copypasta from fieldgen, powersink, and grille
-/obj/machinery/shieldwallgen
- name = "Shield Generator"
- desc = "A shield generator."
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "Shield_Gen"
- anchored = 0
- density = 1
- req_access = list(access_teleporter)
- var/active = 0
- var/power = 0
- var/state = 0
- var/steps = 0
- var/last_check = 0
- var/check_delay = 10
- var/recalc = 0
- var/locked = 1
- var/destroyed = 0
- var/directwired = 1
-// var/maxshieldload = 200
- var/obj/structure/cable/attached // the attached cable
- var/storedpower = 0
- flags = FPRINT | CONDUCT
- //There have to be at least two posts, so these are effectively doubled
- var/power_draw = 30000 //30 kW. How much power is drawn from powernet. Increase this to allow the generator to sustain longer shields, at the cost of more power draw.
- var/max_stored_power = 50000 //50 kW
- use_power = 0 //Draws directly from power net. Does not use APC power.
-
-/obj/machinery/shieldwallgen/attack_hand(mob/user as mob)
- if(state != 1)
- user << "\red The shield generator needs to be firmly secured to the floor first."
- return 1
- if(src.locked && !istype(user, /mob/living/silicon))
- user << "\red The controls are locked!"
- return 1
- if(power != 1)
- user << "\red The shield generator needs to be powered by wire underneath."
- return 1
-
- if(src.active >= 1)
- src.active = 0
- icon_state = "Shield_Gen"
-
- user.visible_message("[user] turned the shield generator off.", \
- "You turn off the shield generator.", \
- "You hear heavy droning fade out.")
- for(var/dir in list(1,2,4,8)) src.cleanup(dir)
- else
- src.active = 1
- icon_state = "Shield_Gen +a"
- user.visible_message("[user] turned the shield generator on.", \
- "You turn on the shield generator.", \
- "You hear heavy droning.")
- src.add_fingerprint(user)
-
-/obj/machinery/shieldwallgen/proc/power()
- if(!anchored)
- power = 0
- return 0
- var/turf/T = src.loc
-
- var/obj/structure/cable/C = T.get_cable_node()
- var/datum/powernet/PN
- if(C) PN = C.powernet // find the powernet of the connected cable
-
- if(!PN)
- power = 0
- return 0
-
- var/shieldload = between(500, max_stored_power - storedpower, power_draw) //what we try to draw
- shieldload = PN.draw_power(shieldload) //what we actually get
- storedpower += shieldload
-
- //If we're still in the red, then there must not be enough available power to cover our load.
- if(storedpower <= 0)
- power = 0
- return 0
-
- power = 1 // IVE GOT THE POWER!
- return 1
-
-/obj/machinery/shieldwallgen/process()
- spawn(100)
- power()
- if(power)
- storedpower -= 2500 //the generator post itself uses some power
- if(storedpower >= max_stored_power)
- storedpower = max_stored_power
- if(storedpower <= 0)
- storedpower = 0
-// if(shieldload >= maxshieldload) //there was a loop caused by specifics of process(), so this was needed.
-// shieldload = maxshieldload
-
- if(src.active == 1)
- if(!src.state == 1)
- src.active = 0
- return
- spawn(1)
- setup_field(1)
- spawn(2)
- setup_field(2)
- spawn(3)
- setup_field(4)
- spawn(4)
- setup_field(8)
- src.active = 2
- if(src.active >= 1)
- if(src.power == 0)
- src.visible_message("\red The [src.name] shuts down due to lack of power!", \
- "You hear heavy droning fade out")
- icon_state = "Shield_Gen"
- src.active = 0
- for(var/dir in list(1,2,4,8)) src.cleanup(dir)
-
-/obj/machinery/shieldwallgen/proc/setup_field(var/NSEW = 0)
- var/turf/T = src.loc
- var/turf/T2 = src.loc
- var/obj/machinery/shieldwallgen/G
- var/steps = 0
- var/oNSEW = 0
-
- if(!NSEW)//Make sure its ran right
- return
-
- if(NSEW == 1)
- oNSEW = 2
- else if(NSEW == 2)
- oNSEW = 1
- else if(NSEW == 4)
- oNSEW = 8
- else if(NSEW == 8)
- oNSEW = 4
-
- for(var/dist = 0, dist <= 9, dist += 1) // checks out to 8 tiles away for another generator
- T = get_step(T2, NSEW)
- T2 = T
- steps += 1
- if(locate(/obj/machinery/shieldwallgen) in T)
- G = (locate(/obj/machinery/shieldwallgen) in T)
- steps -= 1
- if(!G.active)
- return
- G.cleanup(oNSEW)
- break
-
- if(isnull(G))
- return
-
- T2 = src.loc
-
- for(var/dist = 0, dist < steps, dist += 1) // creates each field tile
- var/field_dir = get_dir(T2,get_step(T2, NSEW))
- T = get_step(T2, NSEW)
- T2 = T
- var/obj/machinery/shieldwall/CF = new/obj/machinery/shieldwall/(src, G) //(ref to this gen, ref to connected gen)
- CF.loc = T
- CF.dir = field_dir
-
-
-/obj/machinery/shieldwallgen/attackby(obj/item/W, mob/user)
- if(istype(W, /obj/item/weapon/wrench))
- if(active)
- user << "Turn off the field generator first."
- return
-
- else if(state == 0)
- state = 1
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
- user << "You secure the external reinforcing bolts to the floor."
- src.anchored = 1
- return
-
- else if(state == 1)
- state = 0
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
- user << "You undo the external reinforcing bolts."
- src.anchored = 0
- return
-
- 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)
- visible_message("\red The [src.name] has been hit with \the [W.name] by [user.name]!")
-
-/obj/machinery/shieldwallgen/proc/cleanup(var/NSEW)
- var/obj/machinery/shieldwall/F
- var/obj/machinery/shieldwallgen/G
- var/turf/T = src.loc
- var/turf/T2 = src.loc
-
- for(var/dist = 0, dist <= 9, dist += 1) // checks out to 8 tiles away for fields
- T = get_step(T2, NSEW)
- T2 = T
- if(locate(/obj/machinery/shieldwall) in T)
- F = (locate(/obj/machinery/shieldwall) in T)
- del(F)
-
- if(locate(/obj/machinery/shieldwallgen) in T)
- G = (locate(/obj/machinery/shieldwallgen) in T)
- if(!G.active)
- break
-
-/obj/machinery/shieldwallgen/Del()
- src.cleanup(1)
- src.cleanup(2)
- src.cleanup(4)
- src.cleanup(8)
- ..()
-
-/obj/machinery/shieldwallgen/bullet_act(var/obj/item/projectile/Proj)
- storedpower -= 400 * Proj.damage
- ..()
- return
-
-
-//////////////Containment Field START
-/obj/machinery/shieldwall
- name = "Shield"
- desc = "An energy shield."
- icon = 'icons/effects/effects.dmi'
- icon_state = "shieldwall"
- anchored = 1
- density = 1
- unacidable = 1
- luminosity = 3
- var/needs_power = 0
- var/active = 1
-// var/power = 10
- var/delay = 5
- var/last_active
- var/mob/U
- var/obj/machinery/shieldwallgen/gen_primary
- var/obj/machinery/shieldwallgen/gen_secondary
- var/power_usage = 2500 //how much power it takes to sustain the shield
- var/generate_power_usage = 7500 //how much power it takes to start up the shield
-
-/obj/machinery/shieldwall/New(var/obj/machinery/shieldwallgen/A, var/obj/machinery/shieldwallgen/B)
- ..()
- src.gen_primary = A
- src.gen_secondary = B
- if(A && B && A.active && B.active)
- needs_power = 1
- if(prob(50))
- A.storedpower -= generate_power_usage
- else
- B.storedpower -= generate_power_usage
- else
- del(src) //need at least two generator posts
-
-/obj/machinery/shieldwall/attack_hand(mob/user as mob)
- return
-
-
-/obj/machinery/shieldwall/process()
- if(needs_power)
- if(isnull(gen_primary)||isnull(gen_secondary))
- del(src)
- return
-
- if(!(gen_primary.active)||!(gen_secondary.active))
- del(src)
- return
-
- if(prob(50))
- gen_primary.storedpower -= power_usage
- else
- gen_secondary.storedpower -= power_usage
-
-
-/obj/machinery/shieldwall/bullet_act(var/obj/item/projectile/Proj)
- if(needs_power)
- var/obj/machinery/shieldwallgen/G
- if(prob(50))
- G = gen_primary
- else
- G = gen_secondary
- G.storedpower -= 400 * Proj.damage
- ..()
- return
-
-
-/obj/machinery/shieldwall/ex_act(severity)
- if(needs_power)
- var/obj/machinery/shieldwallgen/G
- switch(severity)
- if(1.0) //big boom
- if(prob(50))
- G = gen_primary
- else
- G = gen_secondary
- G.storedpower -= 120000
-
- if(2.0) //medium boom
- if(prob(50))
- G = gen_primary
- else
- G = gen_secondary
- G.storedpower -= 30000
-
- if(3.0) //lil boom
- if(prob(50))
- G = gen_primary
- else
- G = gen_secondary
- G.storedpower -= 12000
- return
-
-
-/obj/machinery/shieldwall/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group || (height==0)) return 1
-
- if(istype(mover) && mover.checkpass(PASSGLASS))
- return prob(20)
- else
- if (istype(mover, /obj/item/projectile))
- return prob(10)
- else
- return !src.density
\ No newline at end of file
diff --git a/code/WorkInProgress/Cael_Aislinn/ShieldGen/circuits_and_designs.dm b/code/modules/shieldgen/circuits_and_designs.dm
similarity index 100%
rename from code/WorkInProgress/Cael_Aislinn/ShieldGen/circuits_and_designs.dm
rename to code/modules/shieldgen/circuits_and_designs.dm
diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm
new file mode 100644
index 00000000000..7ab3afd006b
--- /dev/null
+++ b/code/modules/shieldgen/emergency_shield.dm
@@ -0,0 +1,348 @@
+/obj/machinery/shield
+ name = "Emergency energy shield"
+ desc = "An energy shield used to contain hull breaches."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "shield-old"
+ density = 1
+ opacity = 0
+ anchored = 1
+ unacidable = 1
+ var/const/max_health = 200
+ var/health = max_health //The shield can only take so much beating (prevents perma-prisons)
+ var/shield_generate_power = 7500 //how much power we use when regenerating
+ var/shield_idle_power = 1500 //how much power we use when just being sustained.
+
+/obj/machinery/shield/New()
+ src.dir = pick(1,2,3,4)
+ ..()
+ update_nearby_tiles(need_rebuild=1)
+
+/obj/machinery/shield/Del()
+ opacity = 0
+ density = 0
+ update_nearby_tiles()
+ ..()
+
+/obj/machinery/shield/CanPass(atom/movable/mover, turf/target, height, air_group)
+ if(!height || air_group) return 0
+ else return ..()
+
+//Looks like copy/pasted code... I doubt 'need_rebuild' is even used here - Nodrak
+/obj/machinery/shield/proc/update_nearby_tiles(need_rebuild)
+ if(!air_master)
+ return 0
+
+ air_master.mark_for_update(get_turf(src))
+
+ return 1
+
+
+/obj/machinery/shield/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(!istype(W)) return
+
+ //Calculate damage
+ var/aforce = W.force
+ if(W.damtype == BRUTE || W.damtype == BURN)
+ src.health -= aforce
+
+ //Play a fitting sound
+ playsound(src.loc, 'sound/effects/EMPulse.ogg', 75, 1)
+
+
+ if (src.health <= 0)
+ visible_message("\blue The [src] dissipates!")
+ del(src)
+ return
+
+ opacity = 1
+ spawn(20) if(src) opacity = 0
+
+ ..()
+
+/obj/machinery/shield/meteorhit()
+ src.health -= max_health*0.75 //3/4 health as damage
+
+ if(src.health <= 0)
+ visible_message("\blue The [src] dissipates!")
+ del(src)
+ return
+
+ opacity = 1
+ spawn(20) if(src) opacity = 0
+ return
+
+/obj/machinery/shield/bullet_act(var/obj/item/projectile/Proj)
+ health -= Proj.damage
+ ..()
+ if(health <=0)
+ visible_message("\blue The [src] dissipates!")
+ del(src)
+ return
+ opacity = 1
+ spawn(20) if(src) opacity = 0
+
+/obj/machinery/shield/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ if (prob(75))
+ del(src)
+ if(2.0)
+ if (prob(50))
+ del(src)
+ if(3.0)
+ if (prob(25))
+ del(src)
+ return
+
+/obj/machinery/shield/emp_act(severity)
+ switch(severity)
+ if(1)
+ del(src)
+ if(2)
+ if(prob(50))
+ del(src)
+
+/obj/machinery/shield/blob_act()
+ del(src)
+
+
+/obj/machinery/shield/hitby(AM as mob|obj)
+ //Let everyone know we've been hit!
+ visible_message("\red [src] was hit by [AM].")
+
+ //Super realistic, resource-intensive, real-time damage calculations.
+ var/tforce = 0
+ if(ismob(AM))
+ tforce = 40
+ else
+ tforce = AM:throwforce
+
+ src.health -= tforce
+
+ //This seemed to be the best sound for hitting a force field.
+ playsound(src.loc, 'sound/effects/EMPulse.ogg', 100, 1)
+
+ //Handle the destruction of the shield
+ if (src.health <= 0)
+ visible_message("\blue The [src] dissipates!")
+ del(src)
+ return
+
+ //The shield becomes dense to absorb the blow.. purely asthetic.
+ opacity = 1
+ spawn(20) if(src) opacity = 0
+
+ ..()
+ return
+
+
+
+/obj/machinery/shieldgen
+ name = "Emergency shield projector"
+ desc = "Used to seal minor hull breaches."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "shieldoff"
+ density = 1
+ opacity = 0
+ anchored = 0
+ pressure_resistance = 2*ONE_ATMOSPHERE
+ req_access = list(access_engine)
+ var/const/max_health = 100
+ var/health = max_health
+ var/active = 0
+ var/malfunction = 0 //Malfunction causes parts of the shield to slowly dissapate
+ var/list/deployed_shields = list()
+ var/list/regenerating = list()
+ var/is_open = 0 //Whether or not the wires are exposed
+ var/locked = 0
+ var/check_delay = 60 //periodically recheck if we need to rebuild a shield
+ use_power = 0
+ idle_power_usage = 0
+
+/obj/machinery/shieldgen/Del()
+ for(var/obj/machinery/shield/shield_tile in deployed_shields)
+ del(shield_tile)
+ ..()
+
+
+/obj/machinery/shieldgen/proc/shields_up()
+ if(active) return 0 //If it's already turned on, how did this get called?
+
+ src.active = 1
+ update_icon()
+
+ create_shields()
+
+ idle_power_usage = 0
+ for(var/obj/machinery/shield/shield_tile in deployed_shields)
+ idle_power_usage += shield_tile.shield_idle_power
+ update_use_power(1)
+
+/obj/machinery/shieldgen/proc/shields_down()
+ if(!active) return 0 //If it's already off, how did this get called?
+
+ src.active = 0
+ update_icon()
+
+ for(var/obj/machinery/shield/shield_tile in deployed_shields)
+ del(shield_tile)
+
+ update_use_power(0)
+
+/obj/machinery/shieldgen/proc/create_shields()
+ for(var/turf/target_tile in range(2, src))
+ if (istype(target_tile,/turf/space) && !(locate(/obj/machinery/shield) in target_tile))
+ if (malfunction && prob(33) || !malfunction)
+ var/obj/machinery/shield/S = new/obj/machinery/shield(target_tile)
+ deployed_shields += S
+ use_power(S.shield_generate_power)
+
+/obj/machinery/shieldgen/process()
+ if (!active)
+ return
+
+ if(malfunction)
+ if(deployed_shields.len && prob(5))
+ del(pick(deployed_shields))
+ else
+ if (check_delay <= 0)
+ create_shields()
+
+ var/new_power_usage = 0
+ for(var/obj/machinery/shield/shield_tile in deployed_shields)
+ new_power_usage += shield_tile.shield_idle_power
+
+ if (new_power_usage != idle_power_usage)
+ idle_power_usage = new_power_usage
+ use_power(0)
+
+ check_delay = 60
+ else
+ check_delay--
+
+/obj/machinery/shieldgen/proc/checkhp()
+ if(health <= 30)
+ src.malfunction = 1
+ if(health <= 0)
+ del(src)
+ update_icon()
+ return
+
+/obj/machinery/shieldgen/meteorhit(obj/O as obj)
+ src.health -= max_health*0.25 //A quarter of the machine's health
+ if (prob(5))
+ src.malfunction = 1
+ src.checkhp()
+ return
+
+/obj/machinery/shieldgen/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ src.health -= 75
+ src.checkhp()
+ if(2.0)
+ src.health -= 30
+ if (prob(15))
+ src.malfunction = 1
+ src.checkhp()
+ if(3.0)
+ src.health -= 10
+ src.checkhp()
+ return
+
+/obj/machinery/shieldgen/emp_act(severity)
+ switch(severity)
+ if(1)
+ src.health /= 2 //cut health in half
+ malfunction = 1
+ locked = pick(0,1)
+ if(2)
+ if(prob(50))
+ src.health *= 0.3 //chop off a third of the health
+ malfunction = 1
+ checkhp()
+
+/obj/machinery/shieldgen/attack_hand(mob/user as mob)
+ if(locked)
+ user << "The machine is locked, you are unable to use it."
+ return
+ if(is_open)
+ user << "The panel must be closed before operating this machine."
+ return
+
+ if (src.active)
+ user.visible_message("\blue \icon[src] [user] deactivated the shield generator.", \
+ "\blue \icon[src] You deactivate the shield generator.", \
+ "You hear heavy droning fade out.")
+ src.shields_down()
+ else
+ if(anchored)
+ user.visible_message("\blue \icon[src] [user] activated the shield generator.", \
+ "\blue \icon[src] You activate the shield generator.", \
+ "You hear heavy droning.")
+ src.shields_up()
+ else
+ user << "The device must first be secured to the floor."
+ return
+
+/obj/machinery/shieldgen/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/weapon/card/emag))
+ malfunction = 1
+ update_icon()
+
+ else if(istype(W, /obj/item/weapon/screwdriver))
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ if(is_open)
+ user << "\blue You close the panel."
+ is_open = 0
+ else
+ user << "\blue You open the panel and expose the wiring."
+ is_open = 1
+
+ else if(istype(W, /obj/item/weapon/cable_coil) && malfunction && is_open)
+ var/obj/item/weapon/cable_coil/coil = W
+ user << "\blue You begin to replace the wires."
+ //if(do_after(user, min(60, round( ((maxhealth/health)*10)+(malfunction*10) ))) //Take longer to repair heavier damage
+ if(do_after(user, 30))
+ if(!src || !coil) return
+ coil.use(1)
+ health = max_health
+ malfunction = 0
+ user << "\blue You repair the [src]!"
+ update_icon()
+
+ else if(istype(W, /obj/item/weapon/wrench))
+ if(locked)
+ user << "The bolts are covered, unlocking this would retract the covers."
+ return
+ if(anchored)
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
+ user << "\blue You unsecure the [src] from the floor!"
+ if(active)
+ user << "\blue The [src] shuts off!"
+ src.shields_down()
+ anchored = 0
+ else
+ if(istype(get_turf(src), /turf/space)) return //No wrenching these in space!
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
+ user << "\blue You secure the [src] to the floor!"
+ anchored = 1
+
+
+ else if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))
+ if(src.allowed(user))
+ src.locked = !src.locked
+ user << "The controls are now [src.locked ? "locked." : "unlocked."]"
+ else
+ user << "\red Access denied."
+
+ else
+ ..()
+
+
+/obj/machinery/shieldgen/update_icon()
+ if(active)
+ src.icon_state = malfunction ? "shieldonbr":"shieldon"
+ else
+ src.icon_state = malfunction ? "shieldoffbr":"shieldoff"
+ return
\ No newline at end of file
diff --git a/code/WorkInProgress/Cael_Aislinn/ShieldGen/energy_field.dm b/code/modules/shieldgen/energy_field.dm
similarity index 92%
rename from code/WorkInProgress/Cael_Aislinn/ShieldGen/energy_field.dm
rename to code/modules/shieldgen/energy_field.dm
index d154d591eba..06dd2bdadee 100644
--- a/code/WorkInProgress/Cael_Aislinn/ShieldGen/energy_field.dm
+++ b/code/modules/shieldgen/energy_field.dm
@@ -1,61 +1,61 @@
-
-//---------- actual energy field
-
-/obj/effect/energy_field
- name = "energy field"
- desc = "Impenetrable field of energy, capable of blocking anything as long as it's active."
- icon = 'code/WorkInProgress/Cael_Aislinn/ShieldGen/shielding.dmi'
- icon_state = "shieldsparkles"
- anchored = 1
- layer = 4.1 //just above mobs
- density = 0
- invisibility = 101
- var/strength = 0
- var/ticks_recovering = 10
-
-/obj/effect/energy_field/ex_act(var/severity)
- Stress(0.5 + severity)
-
-/obj/effect/energy_field/bullet_act(var/obj/item/projectile/Proj)
- Stress(Proj.damage / 10)
-
-/obj/effect/energy_field/meteorhit(obj/effect/meteor/M as obj)
- if(M)
- walk(M,0)
- Stress(2)
-
-/obj/effect/energy_field/proc/Stress(var/severity)
- strength -= severity
-
- //if we take too much damage, drop out - the generator will bring us back up if we have enough power
- ticks_recovering = min(ticks_recovering + 2, 10)
- if(strength < 1)
- invisibility = 101
- density = 0
- ticks_recovering = 10
- strength = 0
- else if(strength >= 1)
- invisibility = 0
- density = 1
-
-/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)
- invisibility = 0
- density = 1
- else if(strength < 1)
- invisibility = 101
- density = 0
-
-/obj/effect/energy_field/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0)
- //Purpose: Determines if the object (or airflow) can pass this atom.
- //Called by: Movement, airflow.
- //Inputs: The moving atom (optional), target turf, "height" and air group
- //Outputs: Boolean if can pass.
-
- //return (!density || !height || air_group)
- return !density
+
+//---------- actual energy field
+
+/obj/effect/energy_field
+ name = "energy field"
+ desc = "Impenetrable field of energy, capable of blocking anything as long as it's active."
+ icon = 'icons/obj/machines/shielding.dmi'
+ icon_state = "shieldsparkles"
+ anchored = 1
+ layer = 4.1 //just above mobs
+ density = 0
+ invisibility = 101
+ var/strength = 0
+ var/ticks_recovering = 10
+
+/obj/effect/energy_field/ex_act(var/severity)
+ Stress(0.5 + severity)
+
+/obj/effect/energy_field/bullet_act(var/obj/item/projectile/Proj)
+ Stress(Proj.damage / 10)
+
+/obj/effect/energy_field/meteorhit(obj/effect/meteor/M as obj)
+ if(M)
+ walk(M,0)
+ Stress(2)
+
+/obj/effect/energy_field/proc/Stress(var/severity)
+ strength -= severity
+
+ //if we take too much damage, drop out - the generator will bring us back up if we have enough power
+ ticks_recovering = min(ticks_recovering + 2, 10)
+ if(strength < 1)
+ invisibility = 101
+ density = 0
+ ticks_recovering = 10
+ strength = 0
+ else if(strength >= 1)
+ invisibility = 0
+ density = 1
+
+/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)
+ invisibility = 0
+ density = 1
+ else if(strength < 1)
+ invisibility = 101
+ density = 0
+
+/obj/effect/energy_field/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0)
+ //Purpose: Determines if the object (or airflow) can pass this atom.
+ //Called by: Movement, airflow.
+ //Inputs: The moving atom (optional), target turf, "height" and air group
+ //Outputs: Boolean if can pass.
+
+ //return (!density || !height || air_group)
+ return !density
diff --git a/code/modules/shieldgen/sheldwallgen.dm b/code/modules/shieldgen/sheldwallgen.dm
new file mode 100644
index 00000000000..0c084abdef8
--- /dev/null
+++ b/code/modules/shieldgen/sheldwallgen.dm
@@ -0,0 +1,324 @@
+////FIELD GEN START //shameless copypasta from fieldgen, powersink, and grille
+/obj/machinery/shieldwallgen
+ name = "Shield Generator"
+ desc = "A shield generator."
+ icon = 'icons/obj/stationobjs.dmi'
+ icon_state = "Shield_Gen"
+ anchored = 0
+ density = 1
+ req_access = list(access_teleporter)
+ var/active = 0
+ var/power = 0
+ var/state = 0
+ var/steps = 0
+ var/last_check = 0
+ var/check_delay = 10
+ var/recalc = 0
+ var/locked = 1
+ var/destroyed = 0
+ var/directwired = 1
+// var/maxshieldload = 200
+ var/obj/structure/cable/attached // the attached cable
+ var/storedpower = 0
+ flags = FPRINT | CONDUCT
+ //There have to be at least two posts, so these are effectively doubled
+ var/power_draw = 30000 //30 kW. How much power is drawn from powernet. Increase this to allow the generator to sustain longer shields, at the cost of more power draw.
+ var/max_stored_power = 50000 //50 kW
+ use_power = 0 //Draws directly from power net. Does not use APC power.
+
+/obj/machinery/shieldwallgen/attack_hand(mob/user as mob)
+ if(state != 1)
+ user << "\red The shield generator needs to be firmly secured to the floor first."
+ return 1
+ if(src.locked && !istype(user, /mob/living/silicon))
+ user << "\red The controls are locked!"
+ return 1
+ if(power != 1)
+ user << "\red The shield generator needs to be powered by wire underneath."
+ return 1
+
+ if(src.active >= 1)
+ src.active = 0
+ icon_state = "Shield_Gen"
+
+ user.visible_message("[user] turned the shield generator off.", \
+ "You turn off the shield generator.", \
+ "You hear heavy droning fade out.")
+ for(var/dir in list(1,2,4,8)) src.cleanup(dir)
+ else
+ src.active = 1
+ icon_state = "Shield_Gen +a"
+ user.visible_message("[user] turned the shield generator on.", \
+ "You turn on the shield generator.", \
+ "You hear heavy droning.")
+ src.add_fingerprint(user)
+
+/obj/machinery/shieldwallgen/proc/power()
+ if(!anchored)
+ power = 0
+ return 0
+ var/turf/T = src.loc
+
+ var/obj/structure/cable/C = T.get_cable_node()
+ var/datum/powernet/PN
+ if(C) PN = C.powernet // find the powernet of the connected cable
+
+ if(!PN)
+ power = 0
+ return 0
+
+ var/shieldload = between(500, max_stored_power - storedpower, power_draw) //what we try to draw
+ shieldload = PN.draw_power(shieldload) //what we actually get
+ storedpower += shieldload
+
+ //If we're still in the red, then there must not be enough available power to cover our load.
+ if(storedpower <= 0)
+ power = 0
+ return 0
+
+ power = 1 // IVE GOT THE POWER!
+ return 1
+
+/obj/machinery/shieldwallgen/process()
+ spawn(100)
+ power()
+ if(power)
+ storedpower -= 2500 //the generator post itself uses some power
+ if(storedpower >= max_stored_power)
+ storedpower = max_stored_power
+ if(storedpower <= 0)
+ storedpower = 0
+// if(shieldload >= maxshieldload) //there was a loop caused by specifics of process(), so this was needed.
+// shieldload = maxshieldload
+
+ if(src.active == 1)
+ if(!src.state == 1)
+ src.active = 0
+ return
+ spawn(1)
+ setup_field(1)
+ spawn(2)
+ setup_field(2)
+ spawn(3)
+ setup_field(4)
+ spawn(4)
+ setup_field(8)
+ src.active = 2
+ if(src.active >= 1)
+ if(src.power == 0)
+ src.visible_message("\red The [src.name] shuts down due to lack of power!", \
+ "You hear heavy droning fade out")
+ icon_state = "Shield_Gen"
+ src.active = 0
+ for(var/dir in list(1,2,4,8)) src.cleanup(dir)
+
+/obj/machinery/shieldwallgen/proc/setup_field(var/NSEW = 0)
+ var/turf/T = src.loc
+ var/turf/T2 = src.loc
+ var/obj/machinery/shieldwallgen/G
+ var/steps = 0
+ var/oNSEW = 0
+
+ if(!NSEW)//Make sure its ran right
+ return
+
+ if(NSEW == 1)
+ oNSEW = 2
+ else if(NSEW == 2)
+ oNSEW = 1
+ else if(NSEW == 4)
+ oNSEW = 8
+ else if(NSEW == 8)
+ oNSEW = 4
+
+ for(var/dist = 0, dist <= 9, dist += 1) // checks out to 8 tiles away for another generator
+ T = get_step(T2, NSEW)
+ T2 = T
+ steps += 1
+ if(locate(/obj/machinery/shieldwallgen) in T)
+ G = (locate(/obj/machinery/shieldwallgen) in T)
+ steps -= 1
+ if(!G.active)
+ return
+ G.cleanup(oNSEW)
+ break
+
+ if(isnull(G))
+ return
+
+ T2 = src.loc
+
+ for(var/dist = 0, dist < steps, dist += 1) // creates each field tile
+ var/field_dir = get_dir(T2,get_step(T2, NSEW))
+ T = get_step(T2, NSEW)
+ T2 = T
+ var/obj/machinery/shieldwall/CF = new/obj/machinery/shieldwall/(src, G) //(ref to this gen, ref to connected gen)
+ CF.loc = T
+ CF.dir = field_dir
+
+
+/obj/machinery/shieldwallgen/attackby(obj/item/W, mob/user)
+ if(istype(W, /obj/item/weapon/wrench))
+ if(active)
+ user << "Turn off the field generator first."
+ return
+
+ else if(state == 0)
+ state = 1
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ user << "You secure the external reinforcing bolts to the floor."
+ src.anchored = 1
+ return
+
+ else if(state == 1)
+ state = 0
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ user << "You undo the external reinforcing bolts."
+ src.anchored = 0
+ return
+
+ 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)
+ visible_message("\red The [src.name] has been hit with \the [W.name] by [user.name]!")
+
+/obj/machinery/shieldwallgen/proc/cleanup(var/NSEW)
+ var/obj/machinery/shieldwall/F
+ var/obj/machinery/shieldwallgen/G
+ var/turf/T = src.loc
+ var/turf/T2 = src.loc
+
+ for(var/dist = 0, dist <= 9, dist += 1) // checks out to 8 tiles away for fields
+ T = get_step(T2, NSEW)
+ T2 = T
+ if(locate(/obj/machinery/shieldwall) in T)
+ F = (locate(/obj/machinery/shieldwall) in T)
+ del(F)
+
+ if(locate(/obj/machinery/shieldwallgen) in T)
+ G = (locate(/obj/machinery/shieldwallgen) in T)
+ if(!G.active)
+ break
+
+/obj/machinery/shieldwallgen/Del()
+ src.cleanup(1)
+ src.cleanup(2)
+ src.cleanup(4)
+ src.cleanup(8)
+ ..()
+
+/obj/machinery/shieldwallgen/bullet_act(var/obj/item/projectile/Proj)
+ storedpower -= 400 * Proj.damage
+ ..()
+ return
+
+
+//////////////Containment Field START
+/obj/machinery/shieldwall
+ name = "Shield"
+ desc = "An energy shield."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "shieldwall"
+ anchored = 1
+ density = 1
+ unacidable = 1
+ luminosity = 3
+ var/needs_power = 0
+ var/active = 1
+// var/power = 10
+ var/delay = 5
+ var/last_active
+ var/mob/U
+ var/obj/machinery/shieldwallgen/gen_primary
+ var/obj/machinery/shieldwallgen/gen_secondary
+ var/power_usage = 2500 //how much power it takes to sustain the shield
+ var/generate_power_usage = 7500 //how much power it takes to start up the shield
+
+/obj/machinery/shieldwall/New(var/obj/machinery/shieldwallgen/A, var/obj/machinery/shieldwallgen/B)
+ ..()
+ src.gen_primary = A
+ src.gen_secondary = B
+ if(A && B && A.active && B.active)
+ needs_power = 1
+ if(prob(50))
+ A.storedpower -= generate_power_usage
+ else
+ B.storedpower -= generate_power_usage
+ else
+ del(src) //need at least two generator posts
+
+/obj/machinery/shieldwall/attack_hand(mob/user as mob)
+ return
+
+
+/obj/machinery/shieldwall/process()
+ if(needs_power)
+ if(isnull(gen_primary)||isnull(gen_secondary))
+ del(src)
+ return
+
+ if(!(gen_primary.active)||!(gen_secondary.active))
+ del(src)
+ return
+
+ if(prob(50))
+ gen_primary.storedpower -= power_usage
+ else
+ gen_secondary.storedpower -= power_usage
+
+
+/obj/machinery/shieldwall/bullet_act(var/obj/item/projectile/Proj)
+ if(needs_power)
+ var/obj/machinery/shieldwallgen/G
+ if(prob(50))
+ G = gen_primary
+ else
+ G = gen_secondary
+ G.storedpower -= 400 * Proj.damage
+ ..()
+ return
+
+
+/obj/machinery/shieldwall/ex_act(severity)
+ if(needs_power)
+ var/obj/machinery/shieldwallgen/G
+ switch(severity)
+ if(1.0) //big boom
+ if(prob(50))
+ G = gen_primary
+ else
+ G = gen_secondary
+ G.storedpower -= 120000
+
+ if(2.0) //medium boom
+ if(prob(50))
+ G = gen_primary
+ else
+ G = gen_secondary
+ G.storedpower -= 30000
+
+ if(3.0) //lil boom
+ if(prob(50))
+ G = gen_primary
+ else
+ G = gen_secondary
+ G.storedpower -= 12000
+ return
+
+
+/obj/machinery/shieldwall/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+ if(air_group || (height==0)) return 1
+
+ if(istype(mover) && mover.checkpass(PASSGLASS))
+ return prob(20)
+ else
+ if (istype(mover, /obj/item/projectile))
+ return prob(10)
+ else
+ return !src.density
\ No newline at end of file
diff --git a/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_capacitor.dm b/code/modules/shieldgen/shield_capacitor.dm
similarity index 97%
rename from code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_capacitor.dm
rename to code/modules/shieldgen/shield_capacitor.dm
index dc1a2e0d87d..6bfc5b664fb 100644
--- a/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_capacitor.dm
+++ b/code/modules/shieldgen/shield_capacitor.dm
@@ -5,7 +5,7 @@
/obj/machinery/shield_capacitor
name = "shield capacitor"
desc = "Machine that charges a shield generator."
- icon = 'code/WorkInProgress/Cael_Aislinn/ShieldGen/shielding.dmi'
+ icon = 'icons/obj/machines/shielding.dmi'
icon_state = "capacitor"
var/active = 0
density = 1
@@ -87,7 +87,7 @@
else
t += "This capacitor is: [active ? "Online" : "Offline" ] [active ? "\[Deactivate\]" : "\[Activate\]"]
"
t += "Capacitor Status: [time_since_fail > 2 ? "OK." : "Discharging!"]
"
- t += "Charge: [stored_charge] J ([100 * stored_charge/max_charge]%)
"
+ t += "Stored Energy: [round(stored_charge/1000, 0.1)] kJ ([100 * round(stored_charge/max_charge, 0.1)]%)
"
t += "Charge Rate: \
\[----\] \
\[---\] \
diff --git a/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm
similarity index 98%
rename from code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_gen.dm
rename to code/modules/shieldgen/shield_gen.dm
index 873022b566c..b330b7cac9e 100644
--- a/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_gen.dm
+++ b/code/modules/shieldgen/shield_gen.dm
@@ -8,7 +8,7 @@
/obj/machinery/shield_gen
name = "bubble shield generator"
desc = "Machine that generates an impenetrable field of energy when activated."
- icon = 'code/WorkInProgress/Cael_Aislinn/ShieldGen/shielding.dmi'
+ icon = 'icons/obj/machines/shielding.dmi'
icon_state = "generator0"
var/active = 0
var/field_radius = 3
@@ -112,7 +112,7 @@
+ \
++ \
+++
"
- t += "Overall Field Strength: [round(average_field_strength, 0.01)] Renwick ([target_field_strength ? round(100 * average_field_strength / target_field_strength) : "NA"]%)
"
+ t += "Overall Field Strength: [round(average_field_strength, 0.01)] Renwick ([target_field_strength ? round(100 * average_field_strength / target_field_strength, 0.1) : "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 \
diff --git a/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_gen_external.dm b/code/modules/shieldgen/shield_gen_external.dm
similarity index 100%
rename from code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_gen_external.dm
rename to code/modules/shieldgen/shield_gen_external.dm
diff --git a/code/WorkInProgress/Cael_Aislinn/ShieldGen/shielding.dmi b/icons/obj/machines/shielding.dmi
similarity index 100%
rename from code/WorkInProgress/Cael_Aislinn/ShieldGen/shielding.dmi
rename to icons/obj/machines/shielding.dmi