From 58e0b659d41040e9f48cfa92d086fd260c5b3df9 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sun, 10 Aug 2014 11:58:25 -0400 Subject: [PATCH] Reorganizes shieldgen source code and icon files --- baystation12.dme | 13 +- code/game/machinery/shieldgen.dm | 673 ------------------ .../shieldgen}/circuits_and_designs.dm | 0 code/modules/shieldgen/emergency_shield.dm | 348 +++++++++ .../shieldgen}/energy_field.dm | 122 ++-- code/modules/shieldgen/sheldwallgen.dm | 324 +++++++++ .../shieldgen}/shield_capacitor.dm | 4 +- .../shieldgen}/shield_gen.dm | 4 +- .../shieldgen}/shield_gen_external.dm | 0 .../obj/machines}/shielding.dmi | Bin 10 files changed, 744 insertions(+), 744 deletions(-) delete mode 100644 code/game/machinery/shieldgen.dm rename code/{WorkInProgress/Cael_Aislinn/ShieldGen => modules/shieldgen}/circuits_and_designs.dm (100%) create mode 100644 code/modules/shieldgen/emergency_shield.dm rename code/{WorkInProgress/Cael_Aislinn/ShieldGen => modules/shieldgen}/energy_field.dm (92%) create mode 100644 code/modules/shieldgen/sheldwallgen.dm rename code/{WorkInProgress/Cael_Aislinn/ShieldGen => modules/shieldgen}/shield_capacitor.dm (97%) rename code/{WorkInProgress/Cael_Aislinn/ShieldGen => modules/shieldgen}/shield_gen.dm (98%) rename code/{WorkInProgress/Cael_Aislinn/ShieldGen => modules/shieldgen}/shield_gen_external.dm (100%) rename {code/WorkInProgress/Cael_Aislinn/ShieldGen => icons/obj/machines}/shielding.dmi (100%) diff --git a/baystation12.dme b/baystation12.dme index 90020c0864..52a2cd5319 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 b67b2cee3a..0000000000 --- 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 0000000000..7ab3afd006 --- /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 d154d591eb..06dd2bdade 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 0000000000..0c084abdef --- /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 dc1a2e0d87..6bfc5b664f 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 873022b566..b330b7cac9 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