diff --git a/baystation12.dme b/baystation12.dme
index 43610980ad7..adb5f39af0f 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -1200,9 +1200,9 @@
#include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle_turfs.dm"
#include "code\WorkInProgress\Cael_Aislinn\Jungle\misc_helpers.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\areas.dm"
+#include "code\WorkInProgress\Cael_Aislinn\Rust\core_control.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"
#include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_assembly.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_assembly_port.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_compressor.dm"
diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/core_control.dm b/code/WorkInProgress/Cael_Aislinn/Rust/core_control.dm
new file mode 100644
index 00000000000..19d8e07dd85
--- /dev/null
+++ b/code/WorkInProgress/Cael_Aislinn/Rust/core_control.dm
@@ -0,0 +1,142 @@
+
+/obj/machinery/computer/rust_core_control
+ name = "RUST Core Control"
+ icon_state = "power"
+ var/list/connected_devices = list()
+ var/id_tag = "allan remember to update this before you leave"
+ var/scan_range = 25
+
+ //currently viewed
+ var/obj/machinery/power/rust_core/cur_viewed_device
+
+/obj/machinery/computer/rust_core_control/process()
+ if(stat & (BROKEN|NOPOWER))
+ return
+
+/obj/machinery/computer/rust_core_control/attack_ai(mob/user)
+ attack_hand(user)
+
+/obj/machinery/computer/rust_core_control/attack_hand(mob/user)
+ add_fingerprint(user)
+ interact(user)
+
+/obj/machinery/computer/rust_core_control/interact(mob/user)
+ if(stat & BROKEN)
+ user.unset_machine()
+ user << browse(null, "window=core_control")
+ return
+ if (!istype(user, /mob/living/silicon) && (get_dist(src, user) > 1 ))
+ user.unset_machine()
+ user << browse(null, "window=core_control")
+ return
+
+ var/dat = ""
+ if(stat & NOPOWER)
+ dat += "The console is dark and nonresponsive."
+ else
+ dat += "Reactor Core Primary Monitor
"
+ if(cur_viewed_device && cur_viewed_device.stat & (BROKEN|NOPOWER))
+ cur_viewed_device = null
+ if(cur_viewed_device && !cur_viewed_device.remote_access_enabled)
+ cur_viewed_device = null
+
+ if(cur_viewed_device)
+ dat += "Device tag: [cur_viewed_device.id_tag ? cur_viewed_device.id_tag : "UNSET"]
"
+ dat += "Device [cur_viewed_device.owned_field ? "activated" : "deactivated"].
"
+ dat += "\[Bring field [cur_viewed_device.owned_field ? "offline" : "online"]\]
"
+ dat += "Device [cur_viewed_device.anchored ? "secured" : "unsecured"].
"
+ dat += "
"
+ dat += "Field encumbrance: [cur_viewed_device.owned_field ? 0 : "NA"]
"
+ dat += "Field strength: [cur_viewed_device.field_strength] Wm^3
"
+ dat += "\[----\] \
+ \[--- \] \
+ \[-- \] \
+ \[- \] \
+ \[+ \] \
+ \[++ \] \
+ \[+++ \] \
+ \[++++\]
"
+ dat += "Field frequency: [cur_viewed_device.field_frequency] MHz
"
+ dat += "\[----\] \
+ \[--- \] \
+ \[-- \] \
+ \[- \] \
+ \[+ \] \
+ \[++ \] \
+ \[+++ \] \
+ \[++++\]
"
+
+ var/power_stat = "Good"
+ if(cur_viewed_device.cached_power_avail < cur_viewed_device.active_power_usage)
+ power_stat = "Insufficient"
+ else if(cur_viewed_device.cached_power_avail < cur_viewed_device.active_power_usage * 2)
+ power_stat = "Check"
+ dat += "Power status: [power_stat]
"
+ else
+ dat += "\[Refresh device list\]
"
+ if(connected_devices.len)
+ dat += ""
+ dat += ""
+ dat += "| Device tag | "
+ dat += " | "
+ dat += "
"
+ for(var/obj/machinery/power/rust_core/C in connected_devices)
+ if(!check_core_status(C))
+ connected_devices.Remove(C)
+ continue
+
+ dat += ""
+ dat += "| [C.id_tag] | "
+ dat += "\[Manage\] | "
+ dat += "
"
+ dat += "
"
+ else
+ dat += "No devices connected.
"
+
+ dat += "
"
+ dat += "Refresh "
+ dat += "Close"
+
+ user << browse(dat, "window=core_control;size=500x400")
+ onclose(user, "core_control")
+ user.set_machine(src)
+
+/obj/machinery/computer/rust_core_control/Topic(href, href_list)
+ ..()
+
+ if( href_list["goto_scanlist"] )
+ cur_viewed_device = null
+
+ if( href_list["manage_individual"] )
+ cur_viewed_device = locate(href_list["manage_individual"])
+
+ if( href_list["scan"] )
+ connected_devices = list()
+ for(var/obj/machinery/power/rust_core/C in range(scan_range, src))
+ if(check_core_status(C))
+ connected_devices.Add(C)
+
+ if( href_list["startup"] )
+ if(cur_viewed_device)
+ cur_viewed_device.Startup()
+
+ if( href_list["shutdown"] )
+ if(cur_viewed_device)
+ cur_viewed_device.Shutdown()
+
+ if( href_list["close"] )
+ usr << browse(null, "window=core_control")
+ usr.unset_machine()
+
+ updateDialog()
+
+/obj/machinery/computer/rust_core_control/proc/check_core_status(var/obj/machinery/power/rust_core/C)
+ if(!C)
+ return 0
+
+ if(C.stat & (BROKEN|NOPOWER) || !C.remote_access_enabled || !C.id_tag)
+ if(connected_devices.Find(C))
+ connected_devices.Remove(C)
+ return 0
+
+ return 1
diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/core_field.dm b/code/WorkInProgress/Cael_Aislinn/Rust/core_field.dm
index ec887bc1cc5..9442ced3a46 100644
--- a/code/WorkInProgress/Cael_Aislinn/Rust/core_field.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Rust/core_field.dm
@@ -6,23 +6,21 @@ Deuterium-tritium fusion: 4.5 x 10^7 K
//#DEFINE MAX_STORED_ENERGY (held_plasma.toxins * held_plasma.toxins * SPECIFIC_HEAT_TOXIN)
-/obj/machinery/rust/em_field
+/obj/effect/rust_em_field
name = "EM Field"
desc = "A coruscating, barely visible field of energy. It is shaped like a slightly flattened torus."
- icon = 'emfield.dmi'
+ icon = 'code/WorkInProgress/Cael_Aislinn/Rust/emfield.dmi'
icon_state = "emfield_s1"
- density = 0
- layer = 3.1
- anchored = 1
//
var/major_radius = 0 //longer radius in meters = field_strength * 0.21875, max = 8.75
var/minor_radius = 0 //shorter radius in meters = field_strength * 0.2125, max = 8.625
var/size = 1 //diameter in tiles
var/volume_covered = 0 //atmospheric volume covered
//
- var/obj/machinery/rust/core/owned_core
+ var/obj/machinery/power/rust_core/owned_core
var/list/dormant_reactant_quantities = new
- luminosity = 1
+ //luminosity = 1
+ layer = 3.1
//
var/energy = 0
var/mega_energy = 0
@@ -34,420 +32,410 @@ Deuterium-tritium fusion: 4.5 x 10^7 K
var/datum/gas_mixture/held_plasma = new
var/particle_catchers[13]
- New()
- ..()
- //create radiator
- for(var/obj/machinery/rust/rad_source/rad in range(0))
- radiator = rad
- if(!radiator)
- radiator = new()
+ var/emp_overload = 0
- //make sure there's a field generator
- for(var/obj/machinery/rust/core/em_core in loc)
- owned_core = em_core
+/obj/effect/rust_em_field/New()
+ ..()
+ //create radiator
+ for(var/obj/machinery/rust/rad_source/rad in range(0))
+ radiator = rad
+ if(!radiator)
+ radiator = new()
- if(!owned_core)
- del(src)
- if(!owned_core.on)
- del(src)
+ //make sure there's a field generator
+ for(var/obj/machinery/power/rust_core/core in loc)
+ owned_core = core
- //create the gimmicky things to handle field collisions
- var/obj/machinery/rust/particle_catcher/catcher
+ if(!owned_core)
+ del(src)
+
+ //create the gimmicky things to handle field collisions
+ var/obj/effect/rust_particle_catcher/catcher
+ //
+ catcher = new (locate(src.x,src.y,src.z))
+ catcher.parent = src
+ catcher.SetSize(1)
+ particle_catchers.Add(catcher)
+ //
+ catcher = new (locate(src.x-1,src.y,src.z))
+ catcher.parent = src
+ catcher.SetSize(3)
+ particle_catchers.Add(catcher)
+ catcher = new (locate(src.x+1,src.y,src.z))
+ catcher.parent = src
+ catcher.SetSize(3)
+ particle_catchers.Add(catcher)
+ catcher = new (locate(src.x,src.y+1,src.z))
+ catcher.parent = src
+ catcher.SetSize(3)
+ particle_catchers.Add(catcher)
+ catcher = new (locate(src.x,src.y-1,src.z))
+ catcher.parent = src
+ catcher.SetSize(3)
+ particle_catchers.Add(catcher)
+ //
+ catcher = new (locate(src.x-2,src.y,src.z))
+ catcher.parent = src
+ catcher.SetSize(5)
+ particle_catchers.Add(catcher)
+ catcher = new (locate(src.x+2,src.y,src.z))
+ catcher.parent = src
+ catcher.SetSize(5)
+ particle_catchers.Add(catcher)
+ catcher = new (locate(src.x,src.y+2,src.z))
+ catcher.parent = src
+ catcher.SetSize(5)
+ particle_catchers.Add(catcher)
+ catcher = new (locate(src.x,src.y-2,src.z))
+ catcher.parent = src
+ catcher.SetSize(5)
+ particle_catchers.Add(catcher)
+ //
+ catcher = new (locate(src.x-3,src.y,src.z))
+ catcher.parent = src
+ catcher.SetSize(7)
+ particle_catchers.Add(catcher)
+ catcher = new (locate(src.x+3,src.y,src.z))
+ catcher.parent = src
+ catcher.SetSize(7)
+ particle_catchers.Add(catcher)
+ catcher = new (locate(src.x,src.y+3,src.z))
+ catcher.parent = src
+ catcher.SetSize(7)
+ particle_catchers.Add(catcher)
+ catcher = new (locate(src.x,src.y-3,src.z))
+ catcher.parent = src
+ catcher.SetSize(7)
+ particle_catchers.Add(catcher)
+
+ //init values
+ major_radius = field_strength * 0.21875// max = 8.75
+ minor_radius = field_strength * 0.2125// max = 8.625
+ volume_covered = PI * major_radius * minor_radius * 2.5 * 2.5 * 1000
+
+/obj/effect/rust_em_field/process()
+ //make sure the field generator is still intact
+ if(!owned_core)
+ del(src)
+
+ //handle radiation
+ if(!radiator)
+ radiator = new /obj/machinery/rust/rad_source()
+ radiator.mega_energy += radiation
+ radiator.source_alive++
+ radiation = 0
+
+ //update values
+ var/transfer_ratio = field_strength / 50 //higher field strength will result in faster plasma aggregation
+ major_radius = field_strength * 0.21875// max = 8.75m
+ minor_radius = field_strength * 0.2125// max = 8.625m
+ volume_covered = PI * major_radius * minor_radius * 2.5 * 2.5 * 2.5 * 7 * 7 * transfer_ratio //one tile = 2.5m*2.5m*2.5m
+
+ //add plasma from the surrounding environment
+ var/datum/gas_mixture/environment = loc.return_air()
+
+ //hack in some stuff to remove plasma from the air because SCIENCE
+ //the amount of plasma pulled in each update is relative to the field strength, with 50T (max field strength) = 100% of area covered by the field
+ //at minimum strength, 0.25% of the field volume is pulled in per update (?)
+ //have a max of 1000 moles suspended
+ if(held_plasma.toxins < transfer_ratio * 1000)
+ var/moles_covered = environment.return_pressure()*volume_covered/(environment.temperature * R_IDEAL_GAS_EQUATION)
+ //world << "\blue moles_covered: [moles_covered]"
//
- catcher = new (locate(src.x,src.y,src.z))
- catcher.parent = src
- catcher.SetSize(1)
- particle_catchers.Add(catcher)
+ var/datum/gas_mixture/gas_covered = environment.remove(moles_covered)
+ var/datum/gas_mixture/plasma_captured = new /datum/gas_mixture()
//
- catcher = new (locate(src.x-1,src.y,src.z))
- catcher.parent = src
- catcher.SetSize(3)
- particle_catchers.Add(catcher)
- catcher = new (locate(src.x+1,src.y,src.z))
- catcher.parent = src
- catcher.SetSize(3)
- particle_catchers.Add(catcher)
- catcher = new (locate(src.x,src.y+1,src.z))
- catcher.parent = src
- catcher.SetSize(3)
- particle_catchers.Add(catcher)
- catcher = new (locate(src.x,src.y-1,src.z))
- catcher.parent = src
- catcher.SetSize(3)
- particle_catchers.Add(catcher)
+ plasma_captured.toxins = round(gas_covered.toxins * transfer_ratio)
+ //world << "\blue[plasma_captured.toxins] moles of plasma captured"
+ plasma_captured.temperature = gas_covered.temperature
+ plasma_captured.update_values()
//
- catcher = new (locate(src.x-2,src.y,src.z))
- catcher.parent = src
- catcher.SetSize(5)
- particle_catchers.Add(catcher)
- catcher = new (locate(src.x+2,src.y,src.z))
- catcher.parent = src
- catcher.SetSize(5)
- particle_catchers.Add(catcher)
- catcher = new (locate(src.x,src.y+2,src.z))
- catcher.parent = src
- catcher.SetSize(5)
- particle_catchers.Add(catcher)
- catcher = new (locate(src.x,src.y-2,src.z))
- catcher.parent = src
- catcher.SetSize(5)
- particle_catchers.Add(catcher)
+ gas_covered.toxins -= plasma_captured.toxins
+ gas_covered.update_values()
//
- catcher = new (locate(src.x-3,src.y,src.z))
- catcher.parent = src
- catcher.SetSize(7)
- particle_catchers.Add(catcher)
- catcher = new (locate(src.x+3,src.y,src.z))
- catcher.parent = src
- catcher.SetSize(7)
- particle_catchers.Add(catcher)
- catcher = new (locate(src.x,src.y+3,src.z))
- catcher.parent = src
- catcher.SetSize(7)
- particle_catchers.Add(catcher)
- catcher = new (locate(src.x,src.y-3,src.z))
- catcher.parent = src
- catcher.SetSize(7)
- particle_catchers.Add(catcher)
-
- //init values
- major_radius = field_strength * 0.21875// max = 8.75
- minor_radius = field_strength * 0.2125// max = 8.625
- volume_covered = PI * major_radius * minor_radius * 2.5 * 2.5 * 1000
-
- process()
- //make sure the field generator is still intact
- if(!owned_core)
- del(src)
- if(!owned_core.on)
- del(src)
-
- //handle radiation
- if(!radiator)
- radiator = new /obj/machinery/rust/rad_source()
- radiator.mega_energy += radiation
- radiator.source_alive++
- radiation = 0
-
- //update values
- var/transfer_ratio = field_strength / 50 //higher field strength will result in faster plasma aggregation
- major_radius = field_strength * 0.21875// max = 8.75m
- minor_radius = field_strength * 0.2125// max = 8.625m
- volume_covered = PI * major_radius * minor_radius * 2.5 * 2.5 * 2.5 * 7 * 7 * transfer_ratio //one tile = 2.5m*2.5m*2.5m
-
- //add plasma from the surrounding environment
- var/datum/gas_mixture/environment = loc.return_air()
-
- //hack in some stuff to remove plasma from the air because SCIENCE
- //the amount of plasma pulled in each update is relative to the field strength, with 50T (max field strength) = 100% of area covered by the field
- //at minimum strength, 0.25% of the field volume is pulled in per update (?)
- //have a max of 1000 moles suspended
- if(held_plasma.toxins < transfer_ratio * 1000)
- var/moles_covered = environment.return_pressure()*volume_covered/(environment.temperature * R_IDEAL_GAS_EQUATION)
- //world << "\blue moles_covered: [moles_covered]"
- //
- var/datum/gas_mixture/gas_covered = environment.remove(moles_covered)
- var/datum/gas_mixture/plasma_captured = new /datum/gas_mixture()
- //
- plasma_captured.toxins = round(gas_covered.toxins * transfer_ratio)
- //world << "\blue[plasma_captured.toxins] moles of plasma captured"
- plasma_captured.temperature = gas_covered.temperature
- plasma_captured.update_values()
- //
- gas_covered.toxins -= plasma_captured.toxins
- gas_covered.update_values()
- //
- held_plasma.merge(plasma_captured)
- //
- environment.merge(gas_covered)
-
- //let the particles inside the field react
- React()
-
- //forcibly radiate any excess energy
- var/energy_max = transfer_ratio * 100000
- if(mega_energy > energy_max)
- var/energy_lost = rand( 1.5 * (mega_energy - energy_max), 2.5 * (mega_energy - energy_max) )
- mega_energy -= energy_lost
- radiation += energy_lost
-
- //change held plasma temp according to energy levels
- //SPECIFIC_HEAT_TOXIN
- if(mega_energy > 0 && held_plasma.toxins)
- var/heat_capacity = held_plasma.heat_capacity()//200 * number of plasma moles
- if(heat_capacity > 0.0003) //formerly MINIMUM_HEAT_CAPACITY
- held_plasma.temperature = (heat_capacity + mega_energy * 35000)/heat_capacity
-
- //if there is too much plasma in the field, lose some
- /*if( held_plasma.toxins > (MOLES_CELLSTANDARD * 7) * (50 / field_strength) )
- LosePlasma()*/
- if(held_plasma.toxins > 1)
- //lose a random amount of plasma back into the air, increased by the field strength (want to switch this over to frequency eventually)
- var/loss_ratio = rand() * (0.05 + (0.05 * 50 / field_strength))
- //world << "lost [loss_ratio*100]% of held plasma"
- //
- var/datum/gas_mixture/plasma_lost = new
- plasma_lost.temperature = held_plasma.temperature
- //
- plasma_lost.toxins = held_plasma.toxins * loss_ratio
- //plasma_lost.update_values()
- held_plasma.toxins -= held_plasma.toxins * loss_ratio
- //held_plasma.update_values()
- //
- environment.merge(plasma_lost)
- radiation += loss_ratio * mega_energy * 0.1
- mega_energy -= loss_ratio * mega_energy * 0.1
- else
- held_plasma.toxins = 0
- //held_plasma.update_values()
-
- //handle some reactants formatting
- //helium-4 has no use at the moment, but a buttload of it is produced
- if(dormant_reactant_quantities["Helium-4"] > 1000)
- dormant_reactant_quantities["Helium-4"] = rand(0,dormant_reactant_quantities["Helium-4"])
- for(var/reactant in dormant_reactant_quantities)
- if(!dormant_reactant_quantities[reactant])
- dormant_reactant_quantities.Remove(reactant)
-
- return 1
-
- Del()
- ..()
- //radiate everything in one giant burst
- for(var/obj/machinery/rust/particle_catcher/catcher in particle_catchers)
- del (catcher)
- RadiateAll()
-
- proc/ChangeFieldStrength(var/new_strength)
- field_strength = new_strength
- var/newsize
- if(new_strength <= 5)
- newsize = 1
- else if(new_strength <= 12)
- newsize = 3
- else if(new_strength <= 25)
- newsize = 5
- else if(new_strength <= 50)
- newsize = 7
+ held_plasma.merge(plasma_captured)
//
- change_size(newsize)
+ environment.merge(gas_covered)
- proc/AddEnergy(var/a_energy, var/a_mega_energy, var/a_frequency)
- var/energy_loss_ratio = abs(a_frequency - src.frequency) / 1e9
- energy += a_energy - a_energy * a_frequency
- mega_energy += a_mega_energy - a_mega_energy * energy_loss_ratio
+ //let the particles inside the field react
+ React()
- proc/AddParticles(var/name, var/quantity = 1)
- if(name in dormant_reactant_quantities)
- dormant_reactant_quantities[name] += quantity
- else if(name != "proton" && name != "electron" && name != "neutron")
- dormant_reactant_quantities.Add(name)
- dormant_reactant_quantities[name] = quantity
+ //forcibly radiate any excess energy
+ var/energy_max = transfer_ratio * 100000
+ if(mega_energy > energy_max)
+ var/energy_lost = rand( 1.5 * (mega_energy - energy_max), 2.5 * (mega_energy - energy_max) )
+ mega_energy -= energy_lost
+ radiation += energy_lost
- proc/RadiateAll(var/ratio_lost = 1)
- for(var/particle in dormant_reactant_quantities)
- radiation += dormant_reactant_quantities[particle]
- dormant_reactant_quantities.Remove(particle)
- radiation += mega_energy
- mega_energy = 0
+ //change held plasma temp according to energy levels
+ //SPECIFIC_HEAT_TOXIN
+ if(mega_energy > 0 && held_plasma.toxins)
+ var/heat_capacity = held_plasma.heat_capacity()//200 * number of plasma moles
+ if(heat_capacity > 0.0003) //formerly MINIMUM_HEAT_CAPACITY
+ held_plasma.temperature = (heat_capacity + mega_energy * 35000)/heat_capacity
- //lose all held plasma back into the air
- var/datum/gas_mixture/environment = loc.return_air()
- environment.merge(held_plasma)
-
- proc/change_size(var/newsize = 1)
+ //if there is too much plasma in the field, lose some
+ /*if( held_plasma.toxins > (MOLES_CELLSTANDARD * 7) * (50 / field_strength) )
+ LosePlasma()*/
+ if(held_plasma.toxins > 1)
+ //lose a random amount of plasma back into the air, increased by the field strength (want to switch this over to frequency eventually)
+ var/loss_ratio = rand() * (0.05 + (0.05 * 50 / field_strength))
+ //world << "lost [loss_ratio*100]% of held plasma"
//
- var/changed = 0
- switch(newsize)
- if(1)
- size = 1
- icon = 'emfield.dmi'
- icon_state = "emfield_s1"
- //
- src.loc = get_turf(owned_core)
- //
- changed = 1
- if(3)
- size = 3
- icon = '96x96.dmi'
- icon_state = "emfield_s3"
- //
- var/turf/newloc = get_turf(owned_core)
- newloc = get_step(newloc, SOUTHWEST)
- src.loc = newloc
- //
- changed = 3
- if(5)
- size = 5
- icon = '160x160.dmi'
- icon_state = "emfield_s5"
- //
- var/turf/newloc = get_turf(owned_core)
- newloc = get_step(newloc, SOUTHWEST)
- newloc = get_step(newloc, SOUTHWEST)
- src.loc = newloc
- //
- changed = 5
- if(7)
- size = 7
- icon = '224x224.dmi'
- icon_state = "emfield_s7"
- //
- var/turf/newloc = get_turf(owned_core)
- newloc = get_step(newloc, SOUTHWEST)
- newloc = get_step(newloc, SOUTHWEST)
- newloc = get_step(newloc, SOUTHWEST)
- src.loc = newloc
- //
- changed = 7
+ var/datum/gas_mixture/plasma_lost = new
+ plasma_lost.temperature = held_plasma.temperature
+ //
+ plasma_lost.toxins = held_plasma.toxins * loss_ratio
+ //plasma_lost.update_values()
+ held_plasma.toxins -= held_plasma.toxins * loss_ratio
+ //held_plasma.update_values()
+ //
+ environment.merge(plasma_lost)
+ radiation += loss_ratio * mega_energy * 0.1
+ mega_energy -= loss_ratio * mega_energy * 0.1
+ else
+ held_plasma.toxins = 0
+ //held_plasma.update_values()
- for(var/obj/machinery/rust/particle_catcher/catcher in particle_catchers)
- catcher.UpdateSize()
- return changed
+ //handle some reactants formatting
+ //helium-4 has no use at the moment, but a buttload of it is produced
+ if(dormant_reactant_quantities["Helium-4"] > 1000)
+ dormant_reactant_quantities["Helium-4"] = rand(0,dormant_reactant_quantities["Helium-4"])
+ for(var/reactant in dormant_reactant_quantities)
+ if(!dormant_reactant_quantities[reactant])
+ dormant_reactant_quantities.Remove(reactant)
- //the !!fun!! part
- //reactions have to be individually hardcoded, see AttemptReaction() below this
- proc/React()
- //world << "React()"
- //loop through the reactants in random order
- var/list/reactants_reacting_pool = dormant_reactant_quantities.Copy()
- /*
- for(var/reagent in dormant_reactant_quantities)
- world << " before: [reagent]: [dormant_reactant_quantities[reagent]]"
- */
+ return 1
- //cant have any reactions if there aren't any reactants present
- if(reactants_reacting_pool.len)
- //determine a random amount to actually react this cycle, and remove it from the standard pool
- //this is a hack, and quite nonrealistic :(
- for(var/reactant in reactants_reacting_pool)
- reactants_reacting_pool[reactant] = rand(0,reactants_reacting_pool[reactant])
- dormant_reactant_quantities[reactant] -= reactants_reacting_pool[reactant]
- if(!reactants_reacting_pool[reactant])
- reactants_reacting_pool -= reactant
+/obj/effect/rust_em_field/proc/ChangeFieldStrength(var/new_strength)
+ var/calc_size = 1
+ emp_overload = 0
+ if(new_strength <= 50)
+ calc_size = 1
+ else if(new_strength <= 200)
+ calc_size = 3
+ else if(new_strength <= 500)
+ calc_size = 5
+ else
+ calc_size = 7
+ if(new_strength > 900)
+ emp_overload = 1
+ //
+ field_strength = new_strength
+ change_size(calc_size)
- var/list/produced_reactants = new/list
- //loop through all the reacting reagents, picking out random reactions for them
- var/list/primary_reactant_pool = reactants_reacting_pool.Copy()
- while(primary_reactant_pool.len)
- //pick one of the unprocessed reacting reagents randomly
- var/cur_primary_reactant = pick(primary_reactant_pool)
- primary_reactant_pool.Remove(cur_primary_reactant)
- //world << "\blue primary reactant chosen: [cur_primary_reactant]"
+/obj/effect/rust_em_field/proc/ChangeFieldFrequency(var/new_frequency)
+ frequency = new_frequency
- //grab all the possible reactants to have a reaction with
- var/list/possible_secondary_reactants = reactants_reacting_pool.Copy()
- //if there is only one of a particular reactant, then it can not react with itself so remove it
- possible_secondary_reactants[cur_primary_reactant] -= 1
- if(possible_secondary_reactants[cur_primary_reactant] < 1)
- possible_secondary_reactants.Remove(cur_primary_reactant)
- var/list/possible_reactions = new/list
+/obj/effect/rust_em_field/proc/AddEnergy(var/a_energy, var/a_mega_energy, var/a_frequency)
+ var/energy_loss_ratio = src.frequency / abs(a_frequency - src.frequency)
+ if(a_frequency == src.frequency)
+ energy_loss_ratio = 0
+ energy += a_energy - a_energy * energy_loss_ratio
+ mega_energy += a_mega_energy - a_mega_energy * energy_loss_ratio
- //loop through and work out all the possible reactions
- while(possible_secondary_reactants.len)
- var/cur_secondary_reactant = pick(possible_secondary_reactants)
- if(possible_secondary_reactants[cur_secondary_reactant] < 1)
- possible_secondary_reactants.Remove(cur_secondary_reactant)
- continue
+/obj/effect/rust_em_field/proc/AddParticles(var/name, var/quantity = 1)
+ if(name in dormant_reactant_quantities)
+ dormant_reactant_quantities[name] += quantity
+ else if(name != "proton" && name != "electron" && name != "neutron")
+ dormant_reactant_quantities.Add(name)
+ dormant_reactant_quantities[name] = quantity
+
+/obj/effect/rust_em_field/proc/RadiateAll(var/ratio_lost = 1)
+ for(var/particle in dormant_reactant_quantities)
+ radiation += dormant_reactant_quantities[particle]
+ dormant_reactant_quantities.Remove(particle)
+ radiation += mega_energy
+ mega_energy = 0
+
+ //lose all held plasma back into the air
+ var/datum/gas_mixture/environment = loc.return_air()
+ environment.merge(held_plasma)
+
+/obj/effect/rust_em_field/proc/change_size(var/newsize = 1)
+ //
+ var/changed = 0
+ switch(newsize)
+ if(1)
+ size = 1
+ icon = 'emfield.dmi'
+ icon_state = "emfield_s1"
+ pixel_x = 0
+ pixel_y = 0
+ //
+ changed = 1
+ if(3)
+ size = 3
+ icon = '96x96.dmi'
+ icon_state = "emfield_s3"
+ pixel_x = -32
+ pixel_y = -32
+ //
+ changed = 3
+ if(5)
+ size = 5
+ icon = '160x160.dmi'
+ icon_state = "emfield_s5"
+ pixel_x = -64
+ pixel_y = -64
+ //
+ changed = 5
+ if(7)
+ size = 7
+ icon = '224x224.dmi'
+ icon_state = "emfield_s7"
+ pixel_x = -96
+ pixel_y = -96
+ //
+ changed = 7
+
+ for(var/obj/effect/rust_particle_catcher/catcher in particle_catchers)
+ catcher.UpdateSize()
+ return changed
+
+//the !!fun!! part
+//reactions have to be individually hardcoded, see AttemptReaction() below this
+/obj/effect/rust_em_field/proc/React()
+ //world << "React()"
+ //loop through the reactants in random order
+ var/list/reactants_reacting_pool = dormant_reactant_quantities.Copy()
+ /*
+ for(var/reagent in dormant_reactant_quantities)
+ world << " before: [reagent]: [dormant_reactant_quantities[reagent]]"
+ */
+
+ //cant have any reactions if there aren't any reactants present
+ if(reactants_reacting_pool.len)
+ //determine a random amount to actually react this cycle, and remove it from the standard pool
+ //this is a hack, and quite nonrealistic :(
+ for(var/reactant in reactants_reacting_pool)
+ reactants_reacting_pool[reactant] = rand(0,reactants_reacting_pool[reactant])
+ dormant_reactant_quantities[reactant] -= reactants_reacting_pool[reactant]
+ if(!reactants_reacting_pool[reactant])
+ reactants_reacting_pool -= reactant
+
+ var/list/produced_reactants = new/list
+ //loop through all the reacting reagents, picking out random reactions for them
+ var/list/primary_reactant_pool = reactants_reacting_pool.Copy()
+ while(primary_reactant_pool.len)
+ //pick one of the unprocessed reacting reagents randomly
+ var/cur_primary_reactant = pick(primary_reactant_pool)
+ primary_reactant_pool.Remove(cur_primary_reactant)
+ //world << "\blue primary reactant chosen: [cur_primary_reactant]"
+
+ //grab all the possible reactants to have a reaction with
+ var/list/possible_secondary_reactants = reactants_reacting_pool.Copy()
+ //if there is only one of a particular reactant, then it can not react with itself so remove it
+ possible_secondary_reactants[cur_primary_reactant] -= 1
+ if(possible_secondary_reactants[cur_primary_reactant] < 1)
+ possible_secondary_reactants.Remove(cur_primary_reactant)
+ var/list/possible_reactions = new/list
+
+ //loop through and work out all the possible reactions
+ while(possible_secondary_reactants.len)
+ var/cur_secondary_reactant = pick(possible_secondary_reactants)
+ if(possible_secondary_reactants[cur_secondary_reactant] < 1)
possible_secondary_reactants.Remove(cur_secondary_reactant)
- var/list/reaction_products = AttemptReaction(cur_primary_reactant, cur_secondary_reactant)
- if(reaction_products.len)
- //world << "\blue secondary reactant: [cur_secondary_reactant], [reaction_products.len]"
- possible_reactions[cur_secondary_reactant] = reaction_products
- //if there are no possible reactions here, abandon this primary reactant and move on
- if(!possible_reactions.len)
- //world << "\blue no reactions"
continue
+ possible_secondary_reactants.Remove(cur_secondary_reactant)
+ var/list/reaction_products = AttemptReaction(cur_primary_reactant, cur_secondary_reactant)
+ if(reaction_products.len)
+ //world << "\blue secondary reactant: [cur_secondary_reactant], [reaction_products.len]"
+ possible_reactions[cur_secondary_reactant] = reaction_products
+ //if there are no possible reactions here, abandon this primary reactant and move on
+ if(!possible_reactions.len)
+ //world << "\blue no reactions"
+ continue
- //split up the reacting atoms between the possible reactions
- //the problem is in this while statement below
- while(possible_reactions.len)
- //pick another substance to react with
- var/cur_secondary_reactant = pick(possible_reactions)
- if(!reactants_reacting_pool[cur_secondary_reactant])
- possible_reactions.Remove(cur_secondary_reactant)
- continue
- var/list/cur_reaction_products = possible_reactions[cur_secondary_reactant]
-
- //set the randmax to be the lower of the two involved reactants
- var/max_num_reactants = reactants_reacting_pool[cur_primary_reactant] > reactants_reacting_pool[cur_secondary_reactant] ? reactants_reacting_pool[cur_secondary_reactant] : reactants_reacting_pool[cur_primary_reactant]
-
- //make sure we have enough energy
- if( mega_energy < max_num_reactants*cur_reaction_products["consumption"])
- max_num_reactants = round(mega_energy / cur_reaction_products["consumption"])
-
- //randomly determined amount to react
- var/amount_reacting = rand(1, max_num_reactants)
-
- //removing the reacting substances from the list of substances that are primed to react this cycle
- //if there aren't enough of that substance (there should be) then modify the reactant amounts accordingly
- if( reactants_reacting_pool[cur_primary_reactant] - amount_reacting > -1 )
- reactants_reacting_pool[cur_primary_reactant] -= amount_reacting
- else
- amount_reacting = reactants_reacting_pool[cur_primary_reactant]
- reactants_reacting_pool[cur_primary_reactant] = 0
- //
- if( reactants_reacting_pool[cur_secondary_reactant] - amount_reacting > -1 )
- reactants_reacting_pool[cur_secondary_reactant] -= amount_reacting
- else
- reactants_reacting_pool[cur_primary_reactant] += amount_reacting - reactants_reacting_pool[cur_primary_reactant]
- amount_reacting = reactants_reacting_pool[cur_secondary_reactant]
- reactants_reacting_pool[cur_secondary_reactant] = 0
-
- //remove the consumed energy
- if(cur_reaction_products["consumption"])
- mega_energy -= max_num_reactants * cur_reaction_products["consumption"]
- cur_reaction_products.Remove("consumption")
-
- //grab any radiation and put it separate
- //var/new_radiation = 0
- if("production" in cur_reaction_products)
- mega_energy += max_num_reactants * cur_reaction_products["production"]
- cur_reaction_products.Remove("production")
- /*for(var/i=0, i reactants_reacting_pool[cur_secondary_reactant] ? reactants_reacting_pool[cur_secondary_reactant] : reactants_reacting_pool[cur_primary_reactant]
- //loop through the newly produced reactants and add them to the pool
- //var/list/neutronic_radiation = new
- //var/list/protonic_radiation = new
- for(var/reactant in produced_reactants)
- AddParticles(reactant, dormant_reactant_quantities[reactant])
- //world << "produced: [reactant], [dormant_reactant_quantities[reactant]]"
+ //make sure we have enough energy
+ if( mega_energy < max_num_reactants*cur_reaction_products["consumption"])
+ max_num_reactants = round(mega_energy / cur_reaction_products["consumption"])
- //check whether there are reactants left, and add them back to the pool
- for(var/reactant in reactants_reacting_pool)
- AddParticles(reactant, reactants_reacting_pool[reactant])
- //world << "retained: [reactant], [reactants_reacting_pool[reactant]]"
+ //randomly determined amount to react
+ var/amount_reacting = rand(1, max_num_reactants)
+
+ //removing the reacting substances from the list of substances that are primed to react this cycle
+ //if there aren't enough of that substance (there should be) then modify the reactant amounts accordingly
+ if( reactants_reacting_pool[cur_primary_reactant] - amount_reacting > -1 )
+ reactants_reacting_pool[cur_primary_reactant] -= amount_reacting
+ else
+ amount_reacting = reactants_reacting_pool[cur_primary_reactant]
+ reactants_reacting_pool[cur_primary_reactant] = 0
+ //
+ if( reactants_reacting_pool[cur_secondary_reactant] - amount_reacting > -1 )
+ reactants_reacting_pool[cur_secondary_reactant] -= amount_reacting
+ else
+ reactants_reacting_pool[cur_primary_reactant] += amount_reacting - reactants_reacting_pool[cur_primary_reactant]
+ amount_reacting = reactants_reacting_pool[cur_secondary_reactant]
+ reactants_reacting_pool[cur_secondary_reactant] = 0
+
+ //remove the consumed energy
+ if(cur_reaction_products["consumption"])
+ mega_energy -= max_num_reactants * cur_reaction_products["consumption"]
+ cur_reaction_products.Remove("consumption")
+
+ //grab any radiation and put it separate
+ //var/new_radiation = 0
+ if("production" in cur_reaction_products)
+ mega_energy += max_num_reactants * cur_reaction_products["production"]
+ cur_reaction_products.Remove("production")
+ /*for(var/i=0, i 0.1)
+/obj/effect/rust_em_field/proc/AttemptReaction(var/reactant_one, var/reactant_two)
+ //any charge on the atomic reactants / protons produced is abstracted away to enter the core energy pool straightaway
+ //atomic products remain in the core and produce more reactions next cycle
+ //any charged neutrons escape as radiation
+ var/check = 1
+ recheck_reactions:
+ var/list/products = new/list
+ switch(reactant_one)
+ if("Tritium")
+ switch(reactant_two)
+ if("Tritium")
+ if(mega_energy > 0.1)
+ products["Helium-4"] = 1
+ //
+ products["production"] = 11.3
+ products["radiation"] = 1
+ /*products["photon"] = 11.3
+ //
+ products["neutron_quantity"] = 1
+ products["neutron_charge"] = 0*/
+ //
+ mega_energy -= 0.1
+ if("Deuterium")
+ if(mega_energy > 0.1)
+ products["Helium-4"] = 1
+ //
+ products["production"] = 3.5
+ products["radiation"] = 14.1
+ /*products["photon"] = 3.5
+ //
+ products["neutron_quantity"] = 1
+ products["neutron_charge"] = 14.1
+ //
+ products["consumption"] = 0.1*/
+ if("Helium-3")
+ if(mega_energy > 0.4)
+ if(prob(51))
products["Helium-4"] = 1
//
- products["production"] = 11.3
+ products["production"] = 13.1
products["radiation"] = 1
- /*products["photon"] = 11.3
+ /*products["photon"] = 12.1
+ //
+ products["proton_quantity"] = 1
+ products["proton_charge"] = 0
//
products["neutron_quantity"] = 1
products["neutron_charge"] = 0*/
- //
- mega_energy -= 0.1
- if("Deuterium")
- if(mega_energy > 0.1)
+ else if (prob(43))
products["Helium-4"] = 1
+ products["Deuterium"] = 1
//
- products["production"] = 3.5
- products["radiation"] = 14.1
- /*products["photon"] = 3.5
+ products["production"] = 14.3
+ /*products["photon"] = 4.8 + 9.5//14.3
+ */
+ else
+ products["Helium-4"] = 1
+ products["production"] = 2.4
+ products["radiation"] = 11.9
+ /*products["photon"] = 0.5//12.4
+ //
+ products["proton_quantity"] = 1
+ products["proton_charge"] = 1.9
//
products["neutron_quantity"] = 1
- products["neutron_charge"] = 14.1
+ products["neutron_charge"] = 11.9*/
+ //
+ products["consumption"] = 0.4
+ if("Deuterium")
+ switch(reactant_two)
+ if("Deuterium")
+ if(mega_energy > 0.1)
+ if(prob(50))
+ products["Tritium"] = 1
//
- products["consumption"] = 0.1*/
- if("Helium-3")
- if(mega_energy > 0.4)
- if(prob(51))
- products["Helium-4"] = 1
- //
- products["production"] = 13.1
- products["radiation"] = 1
- /*products["photon"] = 12.1
- //
- products["proton_quantity"] = 1
- products["proton_charge"] = 0
- //
- products["neutron_quantity"] = 1
- products["neutron_charge"] = 0*/
- else if (prob(43))
- products["Helium-4"] = 1
- products["Deuterium"] = 1
- //
- products["production"] = 14.3
- /*products["photon"] = 4.8 + 9.5//14.3
- */
- else
- products["Helium-4"] = 1
- products["production"] = 2.4
- products["radiation"] = 11.9
- /*products["photon"] = 0.5//12.4
- //
- products["proton_quantity"] = 1
- products["proton_charge"] = 1.9
- //
- products["neutron_quantity"] = 1
- products["neutron_charge"] = 11.9*/
- //
- products["consumption"] = 0.4
- if("Deuterium")
- switch(reactant_two)
- if("Deuterium")
- if(mega_energy > 0.1)
- if(prob(50))
- products["Tritium"] = 1
- //
- products["production"] = 4.03
- /*products["photon"] = 1.01
- //
- products["proton_quantity"] = 1
- products["proton_charge"] = 3.02*/
- else
- products["Helium-3"] = 1
- //
- products["production"] = 0.82
- products["radiation"] = 2.45
- /*products["photon"] = 0.82
- //
- products["neutron_quantity"] = 1
- products["neutron_charge"] = 2.45*/
- //
- products["consumption"] = 0.1
- if("Helium-3")
- if(mega_energy > 0.4)
- products["Helium-4"] = 1
- //
- products["production"] = 18.3
- /*products["photon"] = 3.6
+ products["production"] = 4.03
+ /*products["photon"] = 1.01
//
products["proton_quantity"] = 1
- products["proton_charge"] = 14.7*/
- //
- products["consumption"] = 0.4
- if("Lithium-6")
- if(mega_energy > 0.6)
- if(prob(25))
- products["Helium-4"] = 2
- products["production"] = 1
- /*products["photon"] = 22.4*/
- else if(prob(33))
- products["Helium-3"] = 1
- products["Helium-4"] = 1
- //
- products["radiation"] = 1
- /*products["neutron_quantity"] = 1
- products["neutron_charge"] = 0*/
- else if(prob(50))
- products["Lithium-7"] = 1
- //
- products["production"] = 1
- /*products["proton_quantity"] = 1
- products["proton_charge"] = 0*/
- else
- products["Beryllium-7"] = 1
- products["production"] = 3.4
- products["radiation"] = 1
- /*products["photon"] = 3.4
- //
- products["neutron_quantity"] = 1
- products["neutron_charge"] = 0*/
- //
- products["consumption"] = 0.6
- if("Helium-3")
- switch(reactant_two)
- if("Helium-3")
- if(mega_energy > 0.4)
- products["Helium-4"] = 1
- products["production"] = 14.9
- /*products["photon"] = 12.9
- //
- products["proton_quantity"] = 2
- products["proton_charge"] = 0*/
- //
- products["consumption"] = 0.4
- if("Lithium-6")
- if(mega_energy > 0.6)
- products["Helium-4"] = 2
- //
- products["production"] = 17.9
- /*products["photon"] = 16.9
- //
- products["proton_quantity"] = 1
- products["proton_charge"] = 0*/
- //
- products["consumption"] = 0.6
- /*
- if("proton")
- switch(reactant_two)
- if("Lithium-6")
- if(mega_energy > 0.6)
- products["Helium-4"] = 1
+ products["proton_charge"] = 3.02*/
+ else
products["Helium-3"] = 1
- products["photon"] = 4
//
- mega_energy -= 0.6
- if("Boron-11")
- if(mega_energy > 1)
- products["Helium-4"] = 3
- products["photon"] = 8.7
+ products["production"] = 0.82
+ products["radiation"] = 2.45
+ /*products["photon"] = 0.82
//
- mega_energy -= 1
- */
+ products["neutron_quantity"] = 1
+ products["neutron_charge"] = 2.45*/
+ //
+ products["consumption"] = 0.1
+ if("Helium-3")
+ if(mega_energy > 0.4)
+ products["Helium-4"] = 1
+ //
+ products["production"] = 18.3
+ /*products["photon"] = 3.6
+ //
+ products["proton_quantity"] = 1
+ products["proton_charge"] = 14.7*/
+ //
+ products["consumption"] = 0.4
+ if("Lithium-6")
+ if(mega_energy > 0.6)
+ if(prob(25))
+ products["Helium-4"] = 2
+ products["production"] = 1
+ /*products["photon"] = 22.4*/
+ else if(prob(33))
+ products["Helium-3"] = 1
+ products["Helium-4"] = 1
+ //
+ products["radiation"] = 1
+ /*products["neutron_quantity"] = 1
+ products["neutron_charge"] = 0*/
+ else if(prob(50))
+ products["Lithium-7"] = 1
+ //
+ products["production"] = 1
+ /*products["proton_quantity"] = 1
+ products["proton_charge"] = 0*/
+ else
+ products["Beryllium-7"] = 1
+ products["production"] = 3.4
+ products["radiation"] = 1
+ /*products["photon"] = 3.4
+ //
+ products["neutron_quantity"] = 1
+ products["neutron_charge"] = 0*/
+ //
+ products["consumption"] = 0.6
+ if("Helium-3")
+ switch(reactant_two)
+ if("Helium-3")
+ if(mega_energy > 0.4)
+ products["Helium-4"] = 1
+ products["production"] = 14.9
+ /*products["photon"] = 12.9
+ //
+ products["proton_quantity"] = 2
+ products["proton_charge"] = 0*/
+ //
+ products["consumption"] = 0.4
+ if("Lithium-6")
+ if(mega_energy > 0.6)
+ products["Helium-4"] = 2
+ //
+ products["production"] = 17.9
+ /*products["photon"] = 16.9
+ //
+ products["proton_quantity"] = 1
+ products["proton_charge"] = 0*/
+ //
+ products["consumption"] = 0.6
+ /*
+ if("proton")
+ switch(reactant_two)
+ if("Lithium-6")
+ if(mega_energy > 0.6)
+ products["Helium-4"] = 1
+ products["Helium-3"] = 1
+ products["photon"] = 4
+ //
+ mega_energy -= 0.6
+ if("Boron-11")
+ if(mega_energy > 1)
+ products["Helium-4"] = 3
+ products["photon"] = 8.7
+ //
+ mega_energy -= 1
+ */
- //if no reaction happened, switch the two reactants and try again
- if(!products.len && check)
- check = 0
- var/temp = reactant_one
- reactant_one = reactant_two
- reactant_two = temp
- goto recheck_reactions
- /*if(products.len)
- world << "\blue [reactant_one] + [reactant_two] reaction occured"
- for(var/reagent in products)
- world << "\blue [reagent]: [products[reagent]]"*/
- /*if(products["neutron"])
- products -= "neutron"
- if(products["proton"])
- products -= "proton"
- if(products["photon"])
- products -= "photon"
- if(products["radiated charge"])
- products -= "radiated charge"*/
- return products
+ //if no reaction happened, switch the two reactants and try again
+ if(!products.len && check)
+ check = 0
+ var/temp = reactant_one
+ reactant_one = reactant_two
+ reactant_two = temp
+ goto recheck_reactions
+ /*if(products.len)
+ world << "\blue [reactant_one] + [reactant_two] reaction occured"
+ for(var/reagent in products)
+ world << "\blue [reagent]: [products[reagent]]"*/
+ /*if(products["neutron"])
+ products -= "neutron"
+ if(products["proton"])
+ products -= "proton"
+ if(products["photon"])
+ products -= "photon"
+ if(products["radiated charge"])
+ products -= "radiated charge"*/
+ return products
+
+/obj/effect/rust_em_field/Del()
+ //radiate everything in one giant burst
+ for(var/obj/effect/rust_particle_catcher/catcher in particle_catchers)
+ del (catcher)
+ RadiateAll()
+
+ ..()
diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/core_gen.dm b/code/WorkInProgress/Cael_Aislinn/Rust/core_gen.dm
index 3a491b10770..7dadb4943a6 100644
--- a/code/WorkInProgress/Cael_Aislinn/Rust/core_gen.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Rust/core_gen.dm
@@ -40,80 +40,248 @@ max volume of plasma storeable by the field = the total volume of a number of ti
*/
-/obj/machinery/rust/core
- name = "Tokamak core"
+#define MAX_FIELD_FREQ 1000
+#define MIN_FIELD_FREQ 1
+#define MAX_FIELD_STR 1000
+#define MIN_FIELD_STR 1
+
+/obj/machinery/power/rust_core
+ name = "RUST Tokamak core"
desc = "Enormous solenoid for generating extremely high power electromagnetic fields"
icon = 'core.dmi'
icon_state = "core0"
anchored = 1
- var/on = 0
- var/obj/machinery/rust/em_field/owned_field
- var/field_strength = 0.01
- //
+ density = 1
+ var/obj/effect/rust_em_field/owned_field
+ var/field_strength = 1//0.01
+ var/field_frequency = 1
+ var/id_tag = "allan, don't forget to set the ID of this one too"
req_access = list(access_engine)
//
use_power = 1
- idle_power_usage = 10
- active_power_usage = 300
+ idle_power_usage = 50
+ active_power_usage = 500 //multiplied by field strength
+ var/cached_power_avail = 0
+ directwired = 1
+ var/state = 0
+ var/locked = 0
+ var/remote_access_enabled = 1
- Topic(href, href_list)
- ..()
- if( href_list["startup"] )
- Startup()
- return
- if( href_list["shutdown"] )
- Shutdown()
- return
- if( href_list["modify_field_strength"] )
- var/new_field_str = text2num(input("Enter new field strength", "Modifying field strength", owned_field.field_strength))
- if(!new_field_str)
- usr << "\red That's not a valid number."
- return
- field_strength = max(new_field_str,0.1)
- field_strength = min(new_field_str,50)
- if(owned_field)
- owned_field.ChangeFieldStrength(field_strength)
- return
+/obj/machinery/power/rust_core/process()
+ if(stat & BROKEN || !powernet)
+ Shutdown()
- proc/Startup()
+ cached_power_avail = avail()
+ //luminosity = round(owned_field.field_strength/10)
+ //luminosity = max(luminosity,1)
+
+/obj/machinery/power/rust_core/attackby(obj/item/W, mob/user)
+
+ if(istype(W, /obj/item/weapon/wrench))
if(owned_field)
+ user << "Turn off [src] first."
return
- on = 1
- owned_field = new(src.loc)
+ switch(state)
+ if(0)
+ state = 1
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ user.visible_message("[user.name] secures [src.name] to the floor.", \
+ "You secure the external reinforcing bolts to the floor.", \
+ "You hear a ratchet")
+ src.anchored = 1
+ if(1)
+ state = 0
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \
+ "You undo the external reinforcing bolts.", \
+ "You hear a ratchet")
+ src.anchored = 0
+ if(2)
+ user << "\red The [src.name] needs to be unwelded from the floor."
+ return
+
+ if(istype(W, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = W
+ if(owned_field)
+ user << "Turn off the [src] first."
+ return
+ switch(state)
+ if(0)
+ user << "\red The [src.name] needs to be wrenched to the floor."
+ if(1)
+ if (WT.remove_fuel(0,user))
+ playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
+ user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \
+ "You start to weld the [src] to the floor.", \
+ "You hear welding")
+ if (do_after(user,20))
+ if(!src || !WT.isOn()) return
+ state = 2
+ user << "You weld the [src] to the floor."
+ connect_to_network()
+ src.directwired = 1
+ else
+ user << "\red You need more welding fuel to complete this task."
+ if(2)
+ if (WT.remove_fuel(0,user))
+ playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
+ user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \
+ "You start to cut the [src] free from the floor.", \
+ "You hear welding")
+ if (do_after(user,20))
+ if(!src || !WT.isOn()) return
+ state = 1
+ user << "You cut the [src] free from the floor."
+ disconnect_from_network()
+ src.directwired = 0
+ else
+ user << "\red You need more welding fuel to complete this task."
+ return
+
+ if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))
+ if(emagged)
+ user << "\red The lock seems to be broken"
+ return
+ if(src.allowed(user))
+ if(owned_field)
+ src.locked = !src.locked
+ user << "The controls are now [src.locked ? "locked." : "unlocked."]"
+ else
+ src.locked = 0 //just in case it somehow gets locked
+ user << "\red The controls can only be locked when the [src] is online"
+ else
+ user << "\red Access denied."
+ return
+
+ if(istype(W, /obj/item/weapon/card/emag) && !emagged)
+ locked = 0
+ emagged = 1
+ user.visible_message("[user.name] emags the [src.name].","\red You short out the lock.")
+ return
+
+ ..()
+ return
+
+/obj/machinery/power/rust_core/attack_ai(mob/user)
+ attack_hand(user)
+
+/obj/machinery/power/rust_core/attack_hand(mob/user)
+ add_fingerprint(user)
+ interact(user)
+
+/obj/machinery/power/rust_core/interact(mob/user)
+ if(stat & BROKEN)
+ user.unset_machine()
+ user << browse(null, "window=core_gen")
+ return
+ if(!istype(user, /mob/living/silicon) && get_dist(src, user) > 1)
+ user.unset_machine()
+ user << browse(null, "window=core_gen")
+ return
+
+ var/dat = ""
+ if(!powernet || locked)
+ dat += "The console is dark and nonresponsive."
+ else
+ dat += "RUST Tokamak pattern Electromagnetic Field Generator
"
+ dat += "Device ID tag: [id_tag ? id_tag : "UNSET"] \[Modify\]
"
+ dat += "\[[owned_field ? "Deactivate" : "Activate"]\]
"
+ dat += "\[[remote_access_enabled ? "Disable remote access to this device" : "Enable remote access to this device"]\]
"
+ dat += "
"
+ dat += "Field strength: [field_strength]Wm^3
"
+ dat += "\[----\] \
+ \[--- \] \
+ \[-- \] \
+ \[- \] \
+ \[+ \] \
+ \[++ \] \
+ \[+++ \] \
+ \[++++\]
"
+
+ dat += "Field frequency: [field_frequency]MHz
"
+ dat += "\[----\] \
+ \[--- \] \
+ \[-- \] \
+ \[- \] \
+ \[+ \] \
+ \[++ \] \
+ \[+++ \] \
+ \[++++\]
"
+
+ var/font_colour = "green"
+ if(cached_power_avail < active_power_usage)
+ font_colour = "red"
+ else if(cached_power_avail < active_power_usage * 2)
+ font_colour = "orange"
+ dat += "Power status: [active_power_usage]/[cached_power_avail] W
"
+
+ user << browse(dat, "window=core_gen;size=500x300")
+ onclose(user, "core_gen")
+ user.set_machine(src)
+
+/obj/machinery/power/rust_core/Topic(href, href_list)
+ if(href_list["str"])
+ var/dif = text2num(href_list["str"])
+ field_strength = min(max(field_strength + dif, MIN_FIELD_STR), MAX_FIELD_STR)
+ active_power_usage = 5 * field_strength //change to 500 later
if(owned_field)
owned_field.ChangeFieldStrength(field_strength)
- icon_state = "core1"
- luminosity = 1
- return 1
- proc/Shutdown()
+ if(href_list["freq"])
+ var/dif = text2num(href_list["freq"])
+ field_frequency = min(max(field_frequency + dif, MIN_FIELD_FREQ), MAX_FIELD_FREQ)
+ if(owned_field)
+ owned_field.ChangeFieldFrequency(field_frequency)
+
+ if(href_list["toggle_active"])
+ if(!Startup())
+ Shutdown()
+
+ if( href_list["toggle_remote"] )
+ remote_access_enabled = !remote_access_enabled
+
+ if(href_list["new_id_tag"])
+ if(usr)
+ id_tag = input("Enter a new ID tag", "Tokamak core ID tag", id_tag) as text|null
+
+ if(href_list["close"])
+ usr << browse(null, "window=core_gen")
+ usr.unset_machine()
+
+ if(href_list["extern_update"])
+ var/obj/machinery/computer/rust_core_control/C = locate(href_list["extern_update"])
+ if(C)
+ C.updateDialog()
+
+ src.updateDialog()
+
+/obj/machinery/power/rust_core/proc/Startup()
+ if(owned_field)
+ return
+ owned_field = new(src.loc)
+ owned_field.ChangeFieldStrength(field_strength)
+ owned_field.ChangeFieldFrequency(field_frequency)
+ icon_state = "core1"
+ luminosity = 1
+ use_power = 2
+ return 1
+
+/obj/machinery/power/rust_core/proc/Shutdown()
+ //todo: safety checks for field status
+ if(owned_field)
icon_state = "core0"
- on = 0
del(owned_field)
luminosity = 0
+ use_power = 1
- proc/AddParticles(var/name, var/quantity = 1)
- if(owned_field)
- owned_field.AddParticles(name, quantity)
- return 1
- return 0
+/obj/machinery/power/rust_core/proc/AddParticles(var/name, var/quantity = 1)
+ if(owned_field)
+ owned_field.AddParticles(name, quantity)
+ return 1
+ return 0
- process()
- ..()
- use_power(100 * field_strength + 500)
- if(on && !owned_field)
- Shutdown()
- return
- //
- luminosity = round(owned_field.field_strength/10)
- luminosity = max(luminosity,1)
- //
- if(stat & (NOPOWER|BROKEN))
- Shutdown()
-
- bullet_act(var/obj/item/projectile/Proj)
- if(Proj.flag != "bullet" && owned_field)
- var/obj/item/projectile/beam/laserbeam = Proj
- owned_field.AddEnergy(0, laserbeam.damage / 5000, laserbeam.frequency)
- return 0
+/obj/machinery/power/rust_core/bullet_act(var/obj/item/projectile/Proj)
+ if(Proj.flag != "bullet" && owned_field)
+ owned_field.AddEnergy(Proj.damage, 0, 1)
+ return 0
diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/core_monitor.dm b/code/WorkInProgress/Cael_Aislinn/Rust/core_monitor.dm
deleted file mode 100644
index 4ced2ffb2bb..00000000000
--- a/code/WorkInProgress/Cael_Aislinn/Rust/core_monitor.dm
+++ /dev/null
@@ -1,78 +0,0 @@
-
-/obj/machinery/computer/rust_radiation_monitor
- name = "Radiation Monitor"
- icon_state = "power"
-
-/obj/machinery/computer/rust_energy_monitor
- name = "Core Primary Monitor"
- icon_state = "power"
- var/obj/machinery/rust/core/core_generator = null
- var/updating = 1
-
- New()
- ..()
- spawn(0)
- core_generator = locate() in world
-
- Topic(href, href_list)
- ..()
- if( href_list["shutdown"] )
- updating = 0
- core_generator.Topic(href, href_list)
- updateDialog()
- updating = 1
- return
- if( href_list["startup"] )
- updating = 0
- core_generator.Topic(href, href_list)
- updateDialog()
- updating = 1
- return
- if( href_list["modify_field_strength"] )
- updating = 0
- core_generator.Topic(href, href_list)
- updateDialog()
- updating = 1
- return
- if( href_list["close"] )
- usr << browse(null, "window=core_monitor")
- usr.machine = null
- return
-
- process()
- ..()
- if(updating)
- src.updateDialog()
-
- 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=core_monitor")
- return
- var/t = "Reactor Core Primary Monitor
"
- if(core_generator)
- t += "[core_generator.on ? "Core Generator connected" : "Core Generator operational"]
"
- if(core_generator.owned_field)
- t += "Core suspension field online \[Bring field offline\]
"
- t += "Electromagnetic plasma suspension field status:
"
- t += " Strength (T): [core_generator.owned_field.field_strength] \[Modify\]
"
- t += " Energy levels (MeV): [core_generator.owned_field.mega_energy]
"
- t += " Core frequency: [core_generator.owned_field.frequency]
"
- t += " Moles of plasma: [core_generator.owned_field.held_plasma.toxins]
"
- t += " Core temperature: [core_generator.owned_field.held_plasma.temperature]
"
- t += "
"
- t += "Core atomic and subatomic constituents:
"
- if(core_generator.owned_field.dormant_reactant_quantities && core_generator.owned_field.dormant_reactant_quantities.len)
- for(var/reagent in core_generator.owned_field.dormant_reactant_quantities)
- t += " [reagent]: [core_generator.owned_field.dormant_reactant_quantities[reagent]]
"
- else
- t += " No reactants present.
"
- else
- t += "Core suspension field offline \[Bring field online\]
"
- else
- t += "Core Generator unresponsive
"
- t += "
"
- t += "Close
"
- user << browse(t, "window=core_monitor;size=500x400")
- user.machine = src
diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_assembly.dm b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_assembly.dm
index 681d38f9aae..d2f348b8931 100644
--- a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_assembly.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_assembly.dm
@@ -4,7 +4,7 @@
icon_state = "fuel_assembly"
name = "Fuel Rod Assembly"
var/list/rod_quantities
- var/percent_depleted = 0
+ var/percent_depleted = 1
//
New()
rod_quantities = new/list
diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_assembly_port.dm b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_assembly_port.dm
index af1037bd724..d0e23e290c2 100644
--- a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_assembly_port.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_assembly_port.dm
@@ -1,31 +1,126 @@
-/obj/machinery/rust/fuel_assembly_port
+/obj/machinery/rust_fuel_assembly_port
name = "Fuel Assembly Port"
icon = 'fuel_assembly_port.dmi'
icon_state = "port0"
density = 0
- var/obj/item/weapon/fuel_assembly/cur_assembly = null
+ var/obj/item/weapon/fuel_assembly/cur_assembly
layer = 4
+ var/busy = 0
+ anchored = 1
- attackby(var/obj/item/I, var/mob/user)
- if(istype(I,/obj/item/weapon/fuel_assembly))
- if(cur_assembly)
- del cur_assembly
+/obj/machinery/rust_fuel_assembly_port/attackby(var/obj/item/I, var/mob/user)
+ if(istype(I,/obj/item/weapon/fuel_assembly))
+ if(cur_assembly)
+ user << "\red There is already a fuel rod assembly in there!"
+ else
cur_assembly = I
user.drop_item()
I.loc = src
icon_state = "port1"
- attack_hand(mob/user)
- add_fingerprint(user)
- /*if(stat & (BROKEN|NOPOWER))
- return*/
+/obj/machinery/rust_fuel_assembly_port/attack_hand(mob/user)
+ add_fingerprint(user)
+ if(stat & (BROKEN|NOPOWER))
+ return
+
+ if(!busy)
+ busy = 1
if(cur_assembly)
- cur_assembly.loc = src.loc
+ spawn(30)
+ if(!try_insert_assembly())
+ spawn(30)
+ eject_assembly()
+ busy = 0
+ else
+ busy = 0
+ else
+ spawn(30)
+ try_draw_assembly()
+ busy = 0
+
+/obj/machinery/rust_fuel_assembly_port/proc/try_insert_assembly()
+ var/success = 0
+ if(cur_assembly)
+ var/turf/check_turf = get_step(get_turf(src), src.dir)
+ check_turf = get_step(check_turf, src.dir)
+ for(var/obj/machinery/power/rust_fuel_injector/I in check_turf)
+ if(I.stat & (BROKEN|NOPOWER))
+ break
+ if(I.cur_assembly)
+ break
+
+ I.cur_assembly = cur_assembly
+ cur_assembly.loc = I
cur_assembly = null
icon_state = "port0"
+ success = 1
- New()
- //embed the fuel port into a wall
- pixel_x = (dir & 3)? 0 : (dir == 4 ? 24 : -24)
- pixel_y = (dir & 3)? (dir ==1 ? 24 : -24) : 0
+ if(success)
+ src.visible_message("\blue \icon[src] a green light flashes on [src] as it inserts it's fuel rod assembly into an injector.")
+ else
+ src.visible_message("\red \icon[src] a red light flashes on [src] as it attempts to insert it's fuel rod assembly into an injector.")
+ return success
+
+/obj/machinery/rust_fuel_assembly_port/proc/eject_assembly()
+ if(cur_assembly)
+ var/turf/check_turf = get_step(get_turf(src), src.dir)
+ cur_assembly.loc = check_turf
+ cur_assembly = null
+ icon_state = "port0"
+ return 1
+ else
+ src.visible_message("\red \icon[src] a red light flashes on [src] as it attempts to eject it's fuel rod assembly.")
+
+/obj/machinery/rust_fuel_assembly_port/proc/try_draw_assembly()
+ var/success = 0
+ if(cur_assembly)
+ var/turf/check_turf = get_step(get_turf(src), src.dir)
+ check_turf = get_step(check_turf, src.dir)
+ for(var/obj/machinery/power/rust_fuel_injector/I in check_turf)
+ if(I.stat & (BROKEN|NOPOWER))
+ break
+ if(!I.cur_assembly)
+ break
+ if(I.injecting)
+ break
+ if(I.stat != 2)
+ break
+
+ cur_assembly = I.cur_assembly
+ cur_assembly.loc = src
+ I.cur_assembly = null
+ icon_state = "port1"
+ success = 1
+
+ if(success)
+ src.visible_message("\icon[src] a blue light flashes on [src] as it draws a fuel rod assembly from an injector.")
+ else
+ src.visible_message("\red \icon[src] a red light flashes on [src] as it attempts to draw a fuel rod assembly from an injector.")
+ return success
+
+/*
+/obj/machinery/rust_fuel_assembly_port/verb/try_insert_assembly_verb()
+ set name = "Attempt to insert assembly from port into injector"
+ set category = "Object"
+ set src in oview(1)
+
+ if(!busy)
+ try_insert_assembly()
+
+/obj/machinery/rust_fuel_assembly_port/verb/eject_assembly_verb()
+ set name = "Attempt to eject assembly from port"
+ set category = "Object"
+ set src in oview(1)
+
+ if(!busy)
+ eject_assembly()
+
+/obj/machinery/rust_fuel_assembly_port/verb/try_draw_assembly_verb()
+ set name = "Draw assembly from injector"
+ set category = "Object"
+ set src in oview(1)
+
+ if(!busy)
+ try_draw_assembly()
+*/
diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_compressor.dm b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_compressor.dm
index a1e28294262..3b0589008c6 100644
--- a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_compressor.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_compressor.dm
@@ -1,87 +1,89 @@
var/const/max_assembly_amount = 300
-/obj/machinery/rust/fuel_compressor
+/obj/machinery/rust_fuel_compressor
icon = 'fuel_compressor.dmi'
icon_state = "fuel_compressor"
name = "Fuel Compressor"
var/list/new_assembly_quantities
- //
- New()
- new_assembly_quantities = new/list
- spawn(0)
- new_assembly_quantities["Deuterium"] = 200
- new_assembly_quantities["Tritium"] = 100
- //
- new_assembly_quantities["Helium-3"] = 0
- new_assembly_quantities["Lithium-6"] = 0
- new_assembly_quantities["Silver"] = 0
+ anchored = 1
- attack_ai(mob/user)
- attack_hand(user)
-
- attack_hand(mob/user)
- add_fingerprint(user)
- /*if(stat & (BROKEN|NOPOWER))
- return*/
- interact(user)
-
- /*power_change()
- if(stat & BROKEN)
- icon_state = "broken"
- else
- if( powered() )
- icon_state = initial(icon_state)
- stat &= ~NOPOWER
- else
- spawn(rand(0, 15))
- src.icon_state = "c_unpowered"
- stat |= NOPOWER*/
-
- Topic(href, href_list)
- ..()
- if( href_list["close"] )
- usr << browse(null, "window=fuelcomp")
- usr.machine = null
- return
+/obj/machinery/rust_fuel_compressor/New()
+ new_assembly_quantities = new/list
+ spawn(0)
+ new_assembly_quantities["Deuterium"] = 200
+ new_assembly_quantities["Tritium"] = 100
//
- for(var/reagent in new_assembly_quantities)
- if(href_list[reagent])
- var/new_amount = text2num(input("Enter new rod amount", "Fuel Assembly Rod Composition ([reagent])", new_assembly_quantities[reagent]) as text|null)
- if(!new_amount)
- usr << "\red That's not a valid number."
- return
- var/sum_reactants = new_amount - new_assembly_quantities[reagent]
- for(var/rod in new_assembly_quantities)
- sum_reactants += new_assembly_quantities[rod]
- if(sum_reactants > max_assembly_amount)
- usr << "\red You have entered too many rods."
- else
- new_assembly_quantities[reagent] = new_amount
- updateDialog()
- return
- if( href_list["activate"] )
- var/obj/item/weapon/fuel_assembly/F = new(src)
- //world << "\blue New fuel rod assembly"
- for(var/reagent in new_assembly_quantities)
- F.rod_quantities[reagent] = new_assembly_quantities[reagent]
- //world << "\blue [reagent]: new_assembly_quantities[reagent]
"
- F.loc = src.loc
- return
+ new_assembly_quantities["Helium-3"] = 0
+ new_assembly_quantities["Lithium-6"] = 0
+ new_assembly_quantities["Silver"] = 0
- 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=fuelcomp")
- return*/
- var/t = "Reactor Fuel Rod Compressor / Assembler
"
- t += "Close
"
- t += "Activate Fuel Synthesis
(fuel assemblies require no more than [max_assembly_amount] rods).
"
- t += "
"
- t += "- New fuel assembly constituents:-
"
+/obj/machinery/rust_fuel_compressor/attack_ai(mob/user)
+ attack_hand(user)
+
+/obj/machinery/rust_fuel_compressor/attack_hand(mob/user)
+ add_fingerprint(user)
+ /*if(stat & (BROKEN|NOPOWER))
+ return*/
+ interact(user)
+
+/*/obj/machinery/rust_fuel_compressor/power_change()
+ if(stat & BROKEN)
+ icon_state = "broken"
+ else
+ if( powered() )
+ icon_state = initial(icon_state)
+ stat &= ~NOPOWER
+ else
+ spawn(rand(0, 15))
+ src.icon_state = "c_unpowered"
+ stat |= NOPOWER*/
+
+/obj/machinery/rust_fuel_compressor/Topic(href, href_list)
+ ..()
+ if( href_list["close"] )
+ usr << browse(null, "window=fuelcomp")
+ usr.machine = null
+ return
+ //
+ for(var/reagent in new_assembly_quantities)
+ if(href_list[reagent])
+ var/new_amount = text2num(input("Enter new rod amount", "Fuel Assembly Rod Composition ([reagent])", new_assembly_quantities[reagent]) as text|null)
+ if(!new_amount)
+ usr << "\red That's not a valid number."
+ return
+ var/sum_reactants = new_amount - new_assembly_quantities[reagent]
+ for(var/rod in new_assembly_quantities)
+ sum_reactants += new_assembly_quantities[rod]
+ if(sum_reactants > max_assembly_amount)
+ usr << "\red You have entered too many rods."
+ else
+ new_assembly_quantities[reagent] = new_amount
+ updateDialog()
+ return
+ if( href_list["activate"] )
+ var/obj/item/weapon/fuel_assembly/F = new(src)
+ //world << "\blue New fuel rod assembly"
for(var/reagent in new_assembly_quantities)
- t += " [reagent] rods: [new_assembly_quantities[reagent]] \[Modify\]
"
- t += "
"
- t += "Close
"
- user << browse(t, "window=fuelcomp;size=500x800")
- user.machine = src
+ F.rod_quantities[reagent] = new_assembly_quantities[reagent]
+ //world << "\blue [reagent]: new_assembly_quantities[reagent]
"
+ F.loc = src.loc
+ F.percent_depleted = 0
+ return
+
+/obj/machinery/rust_fuel_compressor/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=fuelcomp")
+ return*/
+ var/t = "Reactor Fuel Rod Compressor / Assembler
"
+ t += "Close
"
+ t += "Activate Fuel Synthesis
(fuel assemblies require no more than [max_assembly_amount] rods).
"
+ t += "
"
+ t += "- New fuel assembly constituents:-
"
+ for(var/reagent in new_assembly_quantities)
+ t += " [reagent] rods: [new_assembly_quantities[reagent]] \[Modify\]
"
+ t += "
"
+ t += "Close
"
+ user << browse(t, "window=fuelcomp;size=500x300")
+ user.machine = src
diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_control.dm b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_control.dm
index b766ab1e0b4..5218e386f72 100644
--- a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_control.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_control.dm
@@ -2,171 +2,190 @@
/obj/machinery/computer/rust_fuel_control
name = "Fuel Injection Control"
icon_state = "power"
- var/list/fuel_injectors
- var/list/stage_status
+ var/list/connected_injectors = list()
+ var/list/active_stages = list()
+ var/list/proceeding_stages = list()
+ var/list/stage_times = list()
+ //var/list/stage_status
var/announce_fueldepletion = 0
var/announce_stageprogression = 0
- //var/obj/machinery/rust/fuel_injector/Injector = null
- New()
- ..()
- //these are the only three stages we can accept
- //we have another console for SCRAM
- fuel_injectors = new/list
- stage_status = new/list
+ var/scan_range = 25
+ var/ticks_this_stage = 0
- fuel_injectors.Add("One")
- fuel_injectors["One"] = new/list
- stage_status.Add("One")
- stage_status["One"] = 0
- fuel_injectors.Add("Two")
- fuel_injectors["Two"] = new/list
- stage_status.Add("Two")
- stage_status["Two"] = 0
- fuel_injectors.Add("Three")
- fuel_injectors["Three"] = new/list
- stage_status.Add("Three")
- stage_status["Three"] = 0
- fuel_injectors.Add("SCRAM")
- fuel_injectors["SCRAM"] = new/list
- stage_status.Add("SCRAM")
- stage_status["SCRAM"] = 0
+/*/obj/machinery/computer/rust_fuel_control/New()
+ ..()
+ //these are the only three stages we can accept
+ //we have another console for SCRAM
+ fuel_injectors = new/list
+ stage_status = new/list
- spawn(0)
- for(var/obj/machinery/rust/fuel_injector/Injector in world)
- if(Injector.stage in fuel_injectors)
- var/list/targetlist = fuel_injectors[Injector.stage]
- targetlist.Add(Injector)
+ fuel_injectors.Add("One")
+ fuel_injectors["One"] = new/list
+ stage_status.Add("One")
+ stage_status["One"] = 0
+ fuel_injectors.Add("Two")
+ fuel_injectors["Two"] = new/list
+ stage_status.Add("Two")
+ stage_status["Two"] = 0
+ fuel_injectors.Add("Three")
+ fuel_injectors["Three"] = new/list
+ stage_status.Add("Three")
+ stage_status["Three"] = 0
+ fuel_injectors.Add("SCRAM")
+ fuel_injectors["SCRAM"] = new/list
+ stage_status.Add("SCRAM")
+ stage_status["SCRAM"] = 0
- attack_ai(mob/user)
- attack_hand(user)
+ spawn(0)
+ for(var/obj/machinery/power/rust_fuel_injector/Injector in world)
+ if(Injector.stage in fuel_injectors)
+ var/list/targetlist = fuel_injectors[Injector.stage]
+ targetlist.Add(Injector)*/
- attack_hand(mob/user)
- add_fingerprint(user)
- /*if(stat & (BROKEN|NOPOWER))
- return*/
- interact(user)
+/obj/machinery/computer/rust_fuel_control/attack_ai(mob/user)
+ attack_hand(user)
- /*updateDialog()
- for(var/mob/M in range(1))
- if(M.machine == src)
- interact(m)*/
+/obj/machinery/computer/rust_fuel_control/attack_hand(mob/user)
+ add_fingerprint(user)
+ interact(user)
- Topic(href, href_list)
- ..()
- if( href_list["close"] )
- usr << browse(null, "window=fuel_monitor")
- usr.machine = null
- return
- if( href_list["beginstage"] )
- var/stage_name = href_list["beginstage"]
- if(stage_name in fuel_injectors)
- var/success = 1
- for(var/obj/machinery/rust/fuel_injector/Injector in fuel_injectors[stage_name])
- if(!Injector.BeginInjecting())
- success = 0
- if(!success) //may still partially complete
- usr << "\red Unable to complete command."
- stage_status[stage_name] = 1
- updateDialog()
- return
- if( href_list["begincool"] )
- var/stage_name = href_list["begincool"]
- if(stage_name in fuel_injectors)
- for(var/obj/machinery/rust/fuel_injector/Injector in fuel_injectors[stage_name])
- Injector.StopInjecting()
- stage_status[stage_name] = 0
- updateDialog()
- return
- if( href_list["restart"] )
- updateDialog()
- return
- if( href_list["cooldown"] )
- for(var/stage_name in fuel_injectors)
- for(var/obj/machinery/rust/fuel_injector/Injector in fuel_injectors[stage_name])
- Injector.StopInjecting()
- stage_status[stage_name] = 0
- updateDialog()
- return
- if( href_list["update"] )
- updateDialog()
- return
- //
- if( href_list["disable_fueldepletion"] )
- announce_fueldepletion = 0
- updateDialog()
- return
- if( href_list["announce_fueldepletion"] )
- announce_fueldepletion = 1
- updateDialog()
- return
- if( href_list["broadcast_fueldepletion"] )
- announce_fueldepletion = 2
- updateDialog()
- return
- //
- if( href_list["disable_stageprogression"] )
- announce_stageprogression = 0
- updateDialog()
- return
- if( href_list["announce_stageprogression"] )
- announce_stageprogression = 1
- updateDialog()
- return
- if( href_list["broadcast_stageprogression"] )
- announce_stageprogression = 2
- updateDialog()
- return
+/obj/machinery/computer/rust_fuel_control/interact(mob/user)
+ if(stat & (BROKEN|NOPOWER))
+ user.unset_machine()
+ user << browse(null, "window=fuel_control")
+ return
- process()
- ..()
- src.updateDialog()
+ if (!istype(user, /mob/living/silicon) && get_dist(src, user) > 1)
+ user.unset_machine()
+ user << browse(null, "window=fuel_control")
+ return
- 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=fuel_monitor")
- return
- var/t = "Reactor Core Fuel Control
"
- var/cooling = 0
- for(var/stage in stage_status)
- if(stage_status[stage])
- t += "Fuel injection: Active
"
- t += "Enter cooldown phase
"
- cooling = 1
- break
- if(!cooling)
- t += "Fuel injection: Cooling
"
- t += "----
"
- //
- t += "Fuel depletion announcement: "
- t += "[announce_fueldepletion ? "Disable" : "Disabled"] "
- t += "[announce_fueldepletion == 1 ? "Announcing" : "Announce"] "
- t += "[announce_fueldepletion == 2 ? "Broadcasting" : "Broadcast"]
"
- t += "Stage progression announcement: "
- t += "[announce_stageprogression ? "Disable" : "Disabled"] "
- t += "[announce_stageprogression == 1 ? "Announcing" : "Announce"] "
- t += "[announce_stageprogression == 2 ? "Broadcasting" : "Broadcast"] "
- t += "
"
- t += ""
- t += "| Injector Status | "
- t += "Injection interval (sec) | "
- t += "Assembly consumption per injection | "
- t += "Fuel Assembly Port | "
- t += "Assembly depletion percentage | "
- t += "
"
- for(var/stage_name in fuel_injectors)
- var/list/cur_stage = fuel_injectors[stage_name]
- t += "| Fuel Injection Stage: [stage_name], [stage_status[stage_name] ? "Active \[Enter cooldown\]" : "Cooling \[Begin injection\]"] |
"
- for(var/obj/machinery/rust/fuel_injector/Injector in cur_stage)
- t += ""
- t += "| [Injector.on && Injector.remote_enabled ? "Operational" : "Unresponsive"] | "
- t += "[Injector.rate/10] Modify | "
- t += "[Injector.fuel_usage*100]% Modify | "
- t += "[Injector.owned_assembly_port ? "[Injector.owned_assembly_port.cur_assembly ? "Loaded": "Empty"]" : "Disconnected" ] | "
- t += "[Injector.owned_assembly_port && Injector.owned_assembly_port.cur_assembly ? "[Injector.owned_assembly_port.cur_assembly.percent_depleted]%" : ""] | "
- t += "
"
- t += "
"
- t += "Close
"
- user << browse(t, "window=fuel_monitor;size=500x600")
- user.machine = src
+ var/dat = "Reactor Core Fuel Control
"
+ dat += "Fuel depletion announcement: "
+ dat += "[announce_fueldepletion == 0 ? "Disabled" : "\[Disable\]"] "
+ dat += "[announce_fueldepletion == 1 ? "Announcing" : "\[Announce\]"] "
+ dat += "[announce_fueldepletion == 2 ? "Broadcasting" : "\[Broadcast\]"]
"
+ dat += "Stage progression announcement: "
+ dat += "[announce_stageprogression == 0 ? "Disabled" : "\[Disable\]"] "
+ dat += "[announce_stageprogression == 1 ? "Announcing" : "\[Announce\]"] "
+ dat += "[announce_stageprogression == 2 ? "Broadcasting" : "\[Broadcast\]"]
"
+ dat += "
"
+
+ dat += "Detected devices \[Refresh list\]"
+ dat += ""
+
+ dat += "
"
+ dat += "Refresh "
+ dat += "Close
"
+ user << browse(dat, "window=fuel_control;size=800x400")
+ user.set_machine(src)
+
+/obj/machinery/computer/rust_fuel_control/Topic(href, href_list)
+ ..()
+
+ if( href_list["scan"] )
+ connected_injectors = list()
+ for(var/obj/machinery/power/rust_fuel_injector/I in range(scan_range, src))
+ if(check_injector_status(I))
+ connected_injectors.Add(I)
+
+ if( href_list["toggle_stage"] )
+ var/cur_stage = href_list["toggle_stage"]
+ if(active_stages.Find(cur_stage))
+ active_stages.Remove(cur_stage)
+ for(var/obj/machinery/power/rust_fuel_injector/I in connected_injectors)
+ if(I.id_tag == cur_stage && check_injector_status(I))
+ I.StopInjecting()
+ else
+ active_stages.Add(cur_stage)
+ for(var/obj/machinery/power/rust_fuel_injector/I in connected_injectors)
+ if(I.id_tag == cur_stage && check_injector_status(I))
+ I.BeginInjecting()
+
+ if( href_list["cooldown"] )
+ for(var/obj/machinery/power/rust_fuel_injector/I in connected_injectors)
+ if(check_injector_status(I))
+ I.StopInjecting()
+ active_stages = list()
+
+ if( href_list["warmup"] )
+ for(var/obj/machinery/power/rust_fuel_injector/I in connected_injectors)
+ if(check_injector_status(I))
+ I.BeginInjecting()
+ if(!active_stages.Find(I.id_tag))
+ active_stages.Add(I.id_tag)
+
+ if( href_list["stage_time"] )
+ var/cur_stage = href_list["stage_time"]
+ var/new_duration = input("Enter new stage duration in seconds", "Stage duration") as num
+ if(new_duration)
+ stage_times[cur_stage] = new_duration
+ else if(stage_times.Find(cur_stage))
+ stage_times.Remove(cur_stage)
+
+ if( href_list["announce_fueldepletion"] )
+ announce_fueldepletion = text2num(href_list["announce_fueldepletion"])
+
+ if( href_list["announce_stageprogression"] )
+ announce_stageprogression = text2num(href_list["announce_stageprogression"])
+
+ if( href_list["close"] )
+ usr << browse(null, "window=fuel_control")
+ usr.unset_machine()
+
+ if( href_list["set_next_stage"] )
+ var/cur_stage = href_list["set_next_stage"]
+ if(!proceeding_stages.Find(cur_stage))
+ proceeding_stages.Add(cur_stage)
+ var/next_stage = input("Enter next stage ID", "Automated stage procession") as text|null
+ if(next_stage)
+ proceeding_stages[cur_stage] = next_stage
+ else
+ proceeding_stages.Remove(cur_stage)
+
+ updateDialog()
+
+/obj/machinery/computer/rust_fuel_control/proc/check_injector_status(var/obj/machinery/power/rust_fuel_injector/I)
+ if(!I)
+ return 0
+
+ if(I.stat & (BROKEN|NOPOWER) || !I.remote_access_enabled || !I.id_tag)
+ if(connected_injectors.Find(I))
+ connected_injectors.Remove(I)
+ return 0
+
+ return 1
diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_injector.dm b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_injector.dm
index e773939c9f5..69d4464eac1 100644
--- a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_injector.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_injector.dm
@@ -1,210 +1,290 @@
-/obj/machinery/rust/fuel_injector
+/obj/machinery/power/rust_fuel_injector
name = "Fuel Injector"
icon = 'fuel_injector.dmi'
icon_state = "injector0"
- anchored = 1
+ anchored = 0
density = 1
- var/obj/machinery/rust/fuel_assembly_port/owned_assembly_port
- //var/list/stageone_assemblyports
- //var/list/stagetwo_assemblyports
- //var/list/scram_assemblyports
- var/obj/machinery/rust/reactor_vessel/Vessel = null
- var/rate = 10 //microseconds between each cycle
- var/fuel_usage = 0.0001 //percentage of available fuel to use per cycle
- var/on = 1
- var/remote_enabled = 1
+ var/state = 0
+ var/locked = 0
+ var/obj/item/weapon/fuel_assembly/cur_assembly
+ var/fuel_usage = 0.0001 //percentage of available fuel to use per cycle
+ var/id_tag = "One"
var/injecting = 0
- var/stage = "One"
- var/targetting_field = 0
- layer = 4
+ var/trying_to_swap_fuel = 0
//
req_access = list(access_engine)
//
use_power = 1
idle_power_usage = 10
- active_power_usage = 300
+ active_power_usage = 500
+ var/remote_access_enabled = 1
+ var/cached_power_avail = 0
+ var/emergency_insert_ready = 0
- //fuel assembly should be embedded into the wall behind the injector
- New()
- ..()
- name = "Stage [stage] Fuel Injector"
- //pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
- //pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0
- /*
- stageone_assemblyports = new/list()
- stagetwo_assemblyports = new/list()
- scram_assemblyports = new/list()
- spawn(1)
- Vessel = locate() in range(6,src)
- for(var/obj/machinery/rust/fuel_assembly_port/S in range(6,src))
- switch(S.stage)
- if("One")
- stageone_assemblyports.Add(S)
- if("Two")
- stagetwo_assemblyports.Add(S)
- if("SCRAM")
- scram_assemblyports.Add(S)
- */
- spawn(1)
- var/rev_dir = reverse_direction(dir)
- var/turf/mid = get_step(src, rev_dir)
- for(var/obj/machinery/rust/fuel_assembly_port/port in get_step(mid, rev_dir))
- owned_assembly_port = port
- //
-
- Topic(href, href_list)
- ..()
- if( href_list["close"] )
- usr << browse(null, "window=fuel_injector")
- usr.machine = null
- return
- if( href_list["begin_injecting"] )
- BeginInjecting()
- updateDialog()
- return
- if( href_list["end_injecting"] )
+/obj/machinery/power/rust_fuel_injector/process()
+ if(injecting)
+ if(stat & BROKEN || !powernet)
StopInjecting()
- updateDialog()
- return
- if( href_list["cyclerate"] )
- var/new_rate = text2num(input("Enter new injection rate (0.1 - 10 sec)", "Modifying injection rate", rate/10))
- if(!new_rate)
- usr << "\red That's not a valid number."
- return
- new_rate = min(new_rate,0.1)
- new_rate = max(new_rate,10)
- rate = new_rate * 10
- updateDialog()
- return
- if( href_list["fuel_usage"] )
- var/new_rate = text2num(input("Enter new fuel usage (1 - 100%)", "Modifying fuel usage", rate/10))
- if(!new_rate)
- usr << "\red That's not a valid number."
- return
- new_rate = min(new_rate,0.1)
- new_rate = max(new_rate,10)
- rate = new_rate * 10
- updateDialog()
- return
-
- attack_ai(mob/user)
- attack_hand(user)
-
- attack_hand(mob/user)
- add_fingerprint(user)
- /*if(stat & (BROKEN|NOPOWER))
- return*/
- interact(user)
-
- 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=fuel_injector")
- return
- var/t = "Reactor Core Fuel Injector
"
- t += "Stage: [stage]
"
- t += "Status: [injecting ? "Active \[Disable\]" : "Standby \[Enable\]"]
"
- t += "Interval (sec): [rate/10] \[Modify\]
"
- t += "Fuel usage: [fuel_usage*100]% \[Modify\]
"
- /*
- var/t = "Reactor Core Fuel Control
"
- t += "Current fuel injection stage: [active_stage]
"
- if(active_stage == "Cooling")
- //t += "Restart injection cycle
"
- t += "----
"
else
- t += "Enter cooldown phase
"
- t += "Fuel depletion announcement: "
- t += "[announce_fueldepletion ? "Disable" : "Disabled"] "
- t += "[announce_fueldepletion == 1 ? "Announcing" : "Announce"] "
- t += "[announce_fueldepletion == 2 ? "Broadcasting" : "Broadcast"]
"
- t += "Stage progression announcement: "
- t += "[announce_stageprogression ? "Disable" : "Disabled"] "
- t += "[announce_stageprogression == 1 ? "Announcing" : "Announce"] "
- t += "[announce_stageprogression == 2 ? "Broadcasting" : "Broadcast"] "
- t += "
"
- t += ""
- t += "| Injector Status | "
- t += "Injection interval (sec) | "
- t += "Assembly consumption per injection | "
- t += "Fuel Assembly Port | "
- t += "Assembly depletion percentage | "
- t += "
"
- for(var/stage in fuel_injectors)
- var/list/cur_stage = fuel_injectors[stage]
- t += "| Fuel Injection Stage: [stage] [active_stage == stage ? " (Currently active)" : "Activate"] |
"
- for(var/obj/machinery/rust/fuel_injector/Injector in cur_stage)
- t += ""
- t += "| [Injector.on && Injector.remote_enabled ? "Operational" : "Unresponsive"] | "
- t += "[Injector.rate/10] Modify | "
- t += "[Injector.fuel_usage*100]% Modify | "
- t += "[Injector.owned_assembly_port ? "[Injector.owned_assembly_port.cur_assembly ? "Loaded": "Empty"]" : "Disconnected" ] | "
- t += "[Injector.owned_assembly_port && Injector.owned_assembly_port.cur_assembly ? "[100 - Injector.owned_assembly_port.cur_assembly.amount_depleted*100]%" : ""] | "
- t += "
"
- t += "
"
- */
- t += "
"
- t += "Close
"
- user << browse(t, "window=fuel_injector;size=500x800")
- user.machine = src
+ Inject()
- proc/BeginInjecting()
- if(!injecting && owned_assembly_port && owned_assembly_port.cur_assembly)
- icon_state = "injector1"
- injecting = 1
- spawn(rate)
- Inject()
- return 1
- return 0
+ cached_power_avail = avail()
- proc/StopInjecting()
+/obj/machinery/power/rust_fuel_injector/attackby(obj/item/W, mob/user)
+
+ if(istype(W, /obj/item/weapon/wrench))
if(injecting)
- injecting = 0
- icon_state = "injector0"
- return 1
- return 0
-
- proc/Inject()
- if(!injecting)
+ user << "Turn off the [src] first."
return
- if(owned_assembly_port.cur_assembly)
- var/obj/machinery/rust/em_field/target_field
- if(targetting_field)
- for(var/obj/machinery/rust/em_field/field in range(15))
- target_field = field
- var/amount_left = 0
- for(var/reagent in owned_assembly_port.cur_assembly.rod_quantities)
- //world << "checking [reagent]"
- if(owned_assembly_port.cur_assembly.rod_quantities[reagent] > 0)
- //world << " rods left: [owned_assembly_port.cur_assembly.rod_quantities[reagent]]"
- var/amount = owned_assembly_port.cur_assembly.rod_quantities[reagent] * fuel_usage
- var/numparticles = round(amount * 1000)
- if(numparticles < 1)
- numparticles = 1
- //world << " amount: [amount]"
- //world << " numparticles: [numparticles]"
- //
- var/obj/effect/accelerated_particle/particle = new/obj/effect/accelerated_particle(src.loc, src.dir)
- particle.particle_type = reagent
- particle.energy = 0
- particle.icon_state = "particle"
- particle.additional_particles = numparticles - 1
- particle.target = target_field
- //
- owned_assembly_port.cur_assembly.rod_quantities[reagent] -= amount
- amount_left += owned_assembly_port.cur_assembly.rod_quantities[reagent]
- owned_assembly_port.cur_assembly.percent_depleted = amount_left / 300
- flick("injector-emitting",src)
- use_power(fuel_usage * 10000 + 100) //0.0001
- if(injecting)
- spawn(rate)
- Inject()
- else
- injecting = 0
+ switch(state)
+ if(0)
+ state = 1
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ user.visible_message("[user.name] secures [src.name] to the floor.", \
+ "You secure the external reinforcing bolts to the floor.", \
+ "You hear a ratchet")
+ src.anchored = 1
+ if(1)
+ state = 0
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \
+ "You undo the external reinforcing bolts.", \
+ "You hear a ratchet")
+ src.anchored = 0
+ if(2)
+ user << "\red The [src.name] needs to be unwelded from the floor."
+ return
- process()
- ..()
+ if(istype(W, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = W
+ if(injecting)
+ user << "Turn off the [src] first."
+ return
+ switch(state)
+ if(0)
+ user << "\red The [src.name] needs to be wrenched to the floor."
+ if(1)
+ if (WT.remove_fuel(0,user))
+ playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
+ user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \
+ "You start to weld the [src] to the floor.", \
+ "You hear welding")
+ if (do_after(user,20))
+ if(!src || !WT.isOn()) return
+ state = 2
+ user << "You weld the [src] to the floor."
+ connect_to_network()
+ src.directwired = 1
+ else
+ user << "\red You need more welding fuel to complete this task."
+ if(2)
+ if (WT.remove_fuel(0,user))
+ playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
+ user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \
+ "You start to cut the [src] free from the floor.", \
+ "You hear welding")
+ if (do_after(user,20))
+ if(!src || !WT.isOn()) return
+ state = 1
+ user << "You cut the [src] free from the floor."
+ disconnect_from_network()
+ src.directwired = 0
+ else
+ user << "\red You need more welding fuel to complete this task."
+ return
+
+ if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))
+ if(emagged)
+ user << "\red The lock seems to be broken"
+ return
+ if(src.allowed(user))
+ src.locked = !src.locked
+ user << "The controls are now [src.locked ? "locked." : "unlocked."]"
+ else
+ user << "\red Access denied."
+ return
+
+ if(istype(W, /obj/item/weapon/card/emag) && !emagged)
+ locked = 0
+ emagged = 1
+ user.visible_message("[user.name] emags the [src.name].","\red You short out the lock.")
+ return
+
+ if(istype(W, /obj/item/weapon/fuel_assembly) && !cur_assembly)
+ if(emergency_insert_ready)
+ cur_assembly = W
+ user.drop_item()
+ W.loc = src
+ emergency_insert_ready = 0
+ return
+
+ ..()
+ return
+
+/obj/machinery/power/rust_fuel_injector/attack_ai(mob/user)
+ attack_hand(user)
+
+/obj/machinery/power/rust_fuel_injector/attack_hand(mob/user)
+ add_fingerprint(user)
+ interact(user)
+
+/obj/machinery/power/rust_fuel_injector/interact(mob/user)
+ if(stat & BROKEN)
+ user.unset_machine()
+ user << browse(null, "window=fuel_injector")
+ return
+ if(get_dist(src, user) > 1 )
+ if (!istype(user, /mob/living/silicon))
+ user.unset_machine()
+ user << browse(null, "window=fuel_injector")
+ return
+
+ var/dat = ""
+ if (!powernet || locked || state != 2)
+ dat += "The console is dark and nonresponsive."
+ else
+ dat += "Reactor Core Fuel Injector
"
+ dat += "Device ID tag: [id_tag] \[Modify\]
"
+ dat += "Status: [injecting ? "Active \[Disable\]" : "Standby \[Enable\]"]
"
+ dat += "Fuel usage: [fuel_usage*100]% \[Modify\]
"
+ dat += "Fuel assembly port: "
+ dat += "\[[cur_assembly ? "Eject assembly to port" : "Draw assembly from port"]\] "
+ if(cur_assembly)
+ dat += "\[Emergency eject\]
"
+ else
+ dat += "\[[emergency_insert_ready ? "Cancel emergency insertion" : "Emergency insert"]\]
"
+ var/font_colour = "green"
+ if(cached_power_avail < active_power_usage)
+ font_colour = "red"
+ else if(cached_power_avail < active_power_usage * 2)
+ font_colour = "orange"
+ dat += "Power status: [active_power_usage]/[cached_power_avail] W
"
+ dat += "\[[remote_access_enabled ? "Disable remote access" : "Enable remote access"]\]
"
+
+ dat += "
"
+ dat += "Refresh "
+ dat += "Close
"
+
+ user << browse(dat, "window=fuel_injector;size=500x300")
+ onclose(user, "fuel_injector")
+ user.set_machine(src)
+
+/obj/machinery/power/rust_fuel_injector/Topic(href, href_list)
+ ..()
+
+ if( href_list["modify_tag"] )
+ id_tag = input("Enter new ID tag", "Modifying ID tag") as text|null
+
+ if( href_list["fuel_assembly"] )
+ if(!trying_to_swap_fuel)
+ trying_to_swap_fuel = 1
+ spawn(50)
+ attempt_fuel_swap()
+ trying_to_swap_fuel = 0
+
+ if( href_list["emergency_fuel_assembly"] )
+ if(cur_assembly)
+ cur_assembly.loc = src.loc
+ cur_assembly = null
+ //irradiate!
+ else
+ emergency_insert_ready = !emergency_insert_ready
+
+ if( href_list["toggle_injecting"] )
+ if(injecting)
+ StopInjecting()
+ else
+ BeginInjecting()
+
+ if( href_list["toggle_remote"] )
+ remote_access_enabled = !remote_access_enabled
+
+ if( href_list["fuel_usage"] )
+ var/new_usage = text2num(input("Enter new fuel usage (0.01% - 100%)", "Modifying fuel usage", fuel_usage * 100))
+ if(!new_usage)
+ usr << "\red That's not a valid number."
+ return
+ new_usage = max(new_usage, 0.01)
+ new_usage = min(new_usage, 100)
+ fuel_usage = new_usage / 100
+ active_power_usage = 500 + 1000 * fuel_usage
+
+ if( href_list["update_extern"] )
+ var/obj/machinery/computer/rust_fuel_control/C = locate(href_list["update_extern"])
+ if(C)
+ C.updateDialog()
+
+ if( href_list["close"] )
+ usr << browse(null, "window=fuel_injector")
+ usr.unset_machine()
+
+ updateDialog()
+
+/obj/machinery/power/rust_fuel_injector/proc/BeginInjecting()
+ if(!injecting && cur_assembly)
+ icon_state = "injector1"
+ injecting = 1
+ use_power = 1
+
+/obj/machinery/power/rust_fuel_injector/proc/StopInjecting()
+ if(injecting)
+ injecting = 0
+ icon_state = "injector0"
+ use_power = 0
+
+/obj/machinery/power/rust_fuel_injector/proc/Inject()
+ if(!injecting)
+ return
+ if(cur_assembly)
+ var/amount_left = 0
+ for(var/reagent in cur_assembly.rod_quantities)
+ //world << "checking [reagent]"
+ if(cur_assembly.rod_quantities[reagent] > 0)
+ //world << " rods left: [cur_assembly.rod_quantities[reagent]]"
+ var/amount = cur_assembly.rod_quantities[reagent] * fuel_usage
+ var/numparticles = round(amount * 1000)
+ if(numparticles < 1)
+ numparticles = 1
+ //world << " amount: [amount]"
+ //world << " numparticles: [numparticles]"
+ //
+
+ var/obj/effect/accelerated_particle/A = new/obj/effect/accelerated_particle(get_turf(src), dir)
+ A.particle_type = reagent
+ A.additional_particles = numparticles - 1
+ //A.target = target_field
+ //
+ cur_assembly.rod_quantities[reagent] -= amount
+ amount_left += cur_assembly.rod_quantities[reagent]
+ cur_assembly.percent_depleted = amount_left / 300
+ flick("injector-emitting",src)
+ else
+ StopInjecting()
+
+/obj/machinery/power/rust_fuel_injector/proc/attempt_fuel_swap()
+ var/rev_dir = reverse_direction(dir)
+ var/turf/mid = get_step(src, rev_dir)
+ var/success = 0
+ for(var/obj/machinery/rust_fuel_assembly_port/check_port in get_step(mid, rev_dir))
+ if(cur_assembly)
+ if(!check_port.cur_assembly)
+ check_port.cur_assembly = cur_assembly
+ cur_assembly.loc = check_port
+ cur_assembly = null
+ check_port.icon_state = "port1"
+ success = 1
+ else
+ if(check_port.cur_assembly)
+ cur_assembly = check_port.cur_assembly
+ cur_assembly.loc = src
+ check_port.cur_assembly = null
+ check_port.icon_state = "port0"
+ success = 1
+
+ break
+ if(success)
+ src.visible_message("\blue \icon[src] a green light flashes on [src].")
updateDialog()
- //
+ else
+ src.visible_message("\red \icon[src] a red light flashes on [src].")
diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/radiation.dm b/code/WorkInProgress/Cael_Aislinn/Rust/radiation.dm
index 62b826532c4..155ef23c5c6 100644
--- a/code/WorkInProgress/Cael_Aislinn/Rust/radiation.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Rust/radiation.dm
@@ -67,4 +67,8 @@
//particle.invisibility = 2
//
return particle
-*/
\ No newline at end of file
+*/
+
+/obj/machinery/computer/rust_radiation_monitor
+ name = "Radiation Monitor"
+ icon_state = "power"
diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/virtual_particle_catcher.dm b/code/WorkInProgress/Cael_Aislinn/Rust/virtual_particle_catcher.dm
index b45d28259c8..b87a12a9aef 100644
--- a/code/WorkInProgress/Cael_Aislinn/Rust/virtual_particle_catcher.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Rust/virtual_particle_catcher.dm
@@ -1,49 +1,53 @@
//gimmicky hack to collect particles and direct them into the field
-//byond multitiles are basically... shit
-/obj/machinery/rust/particle_catcher
- invisibility = 101
+/obj/effect/rust_particle_catcher
icon = 'effects.dmi'
icon_state = "energynet"
density = 0
anchored = 1
- var/obj/machinery/rust/em_field/parent
+ //invisibility = 101
+ layer = 4
+ var/obj/effect/rust_em_field/parent
var/mysize = 0
- /*New()
- for(var/obj/machinery/rust/em_field/field in range(6))
- parent = field
- if(!parent)
- del(src)*/
+/*/obj/effect/rust_particle_catcher/New()
+ for(var/obj/machinery/rust/em_field/field in range(6))
+ parent = field
+ if(!parent)
+ del(src)*/
- proc/SetSize(var/newsize)
- name = "collector [newsize]"
- mysize = newsize
- UpdateSize()
+/obj/effect/rust_particle_catcher/process()
+ if(!parent)
+ del(src)
- proc/AddParticles(var/name, var/quantity = 1)
- if(parent && parent.size >= mysize)
- parent.AddParticles(name, quantity)
- return 1
- return 0
+/obj/effect/rust_particle_catcher/proc/SetSize(var/newsize)
+ name = "collector [newsize]"
+ mysize = newsize
+ UpdateSize()
- proc/UpdateSize()
- if(parent.size >= mysize)
- density = 1
- //invisibility = 101
- name = "collector [mysize] ON"
- else
- density = 0
- name = "collector [mysize] OFF"
- //invisibility = 101
+/obj/effect/rust_particle_catcher/proc/AddParticles(var/name, var/quantity = 1)
+ if(parent && parent.size >= mysize)
+ parent.AddParticles(name, quantity)
+ return 1
+ return 0
- bullet_act(var/obj/item/projectile/Proj)
- if(Proj.flag != "bullet" && parent)
- var/obj/item/projectile/beam/laserbeam = Proj
- parent.AddEnergy(0, laserbeam.damage / 5000, laserbeam.frequency)
- return 0
+/obj/effect/rust_particle_catcher/proc/UpdateSize()
+ if(parent.size >= mysize)
+ density = 1
+ invisibility = 0
+ name = "collector [mysize] ON"
+ else
+ density = 0
+ invisibility = 101
+ name = "collector [mysize] OFF"
- process()
- ..()
- if(!parent)
- del(src)
+/obj/effect/rust_particle_catcher/bullet_act(var/obj/item/projectile/Proj)
+ if(Proj.flag != "bullet" && parent)
+ parent.AddEnergy(Proj.damage, 0, 1)
+ update_icon()
+ return 0
+
+/obj/effect/rust_particle_catcher/Bumped(atom/AM)
+ if(ismob(AM) && density && prob(10))
+ AM << "\red A powerful force pushes you back."
+ ..()
diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm
index bb4bb6e7c4e..da4a32782bb 100644
--- a/code/modules/power/singularity/particle_accelerator/particle.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle.dm
@@ -43,14 +43,14 @@
toxmob(A)
if((istype(A,/obj/machinery/the_singularitygen))||(istype(A,/obj/machinery/singularity/)))
A:energy += energy
- else if( istype(A,/obj/machinery/rust/particle_catcher) )
- var/obj/machinery/rust/particle_catcher/collided_catcher = A
+ else if( istype(A,/obj/effect/rust_particle_catcher) )
+ var/obj/effect/rust_particle_catcher/collided_catcher = A
if(particle_type && particle_type != "neutron")
if(collided_catcher.AddParticles(particle_type, 1 + additional_particles))
collided_catcher.parent.AddEnergy(energy,mega_energy)
del (src)
- else if( istype(A,/obj/machinery/rust/core) )
- var/obj/machinery/rust/core/collided_core = A
+ else if( istype(A,/obj/machinery/power/rust_core) )
+ var/obj/machinery/power/rust_core/collided_core = A
if(particle_type && particle_type != "neutron")
if(collided_core.AddParticles(particle_type, 1 + additional_particles))
var/energy_loss_ratio = abs(collided_core.owned_field.frequency - frequency) / 1e9
diff --git a/maps/rust_test.dmm b/maps/rust_test.dmm
new file mode 100644
index 00000000000..3f6d35c9608
--- /dev/null
+++ b/maps/rust_test.dmm
@@ -0,0 +1,372 @@
+"aa" = (/turf/space,/area)
+"ab" = (/turf/simulated/wall/r_wall,/area)
+"ac" = (/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor,/area)
+"ad" = (/turf/simulated/floor,/area)
+"ae" = (/obj/machinery/power/monitor,/turf/simulated/floor,/area)
+"af" = (/obj/effect/landmark/start{name = "Chief Engineer"},/turf/simulated/floor,/area)
+"ag" = (/obj/machinery/computer/rust_fuel_control,/turf/simulated/floor,/area)
+"ah" = (/obj/machinery/computer/rust_core_control,/turf/simulated/floor,/area)
+"ai" = (/obj/machinery/computer/rust_radiation_monitor,/turf/simulated/floor,/area)
+"aj" = (/turf/space,/area/engine/engineering)
+"ak" = (/turf/simulated/wall/r_wall,/area/engine/engineering)
+"al" = (/obj/machinery/door/airlock/engineering,/turf/simulated/floor,/area/engine/engineering)
+"am" = (/obj/effect/landmark{name = "LateStart"},/turf/simulated/floor,/area/engine/engineering)
+"an" = (/turf/simulated/floor,/area/engine/engineering)
+"ao" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor,/area/engine/engineering)
+"ap" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/engine/engineering)
+"aq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/rust_fuel_compressor{pixel_x = 0; pixel_y = -32},/turf/simulated/floor,/area/engine/engineering)
+"ar" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/rust_fuel_assembly_port{pixel_y = -32},/turf/simulated/floor,/area/engine/engineering)
+"as" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor,/area/engine/engineering)
+"at" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering)
+"au" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/engine/engineering)
+"av" = (/obj/machinery/door/airlock/engineering,/turf/simulated/floor/plating,/area/engine/engineering)
+"aw" = (/turf/simulated/floor/plating,/area/engine/engineering)
+"ax" = (/obj/structure/closet/crate,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/turf/simulated/floor/plating,/area/engine/engineering)
+"ay" = (/obj/machinery/power/rust_fuel_injector,/turf/simulated/floor/plating,/area/engine/engineering)
+"az" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/engine/engineering)
+"aA" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/turf/space,/area)
+"aB" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/space,/area)
+"aC" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 10},/turf/space,/area)
+"aD" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/plating,/area/engine/engineering)
+"aE" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/space,/area)
+"aF" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 9},/turf/space,/area)
+"aG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/engine/engineering)
+"aH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engineering)
+"aI" = (/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = "icon-warnplate (SOUTHEAST)"},/area/engine/engineering)
+"aJ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/turf/simulated/floor/engine,/area/engine/engineering)
+"aK" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/turf/simulated/floor/engine,/area/engine/engineering)
+"aL" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/turf/simulated/floor/engine,/area/engine/engineering)
+"aM" = (/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/engine/engineering)
+"aN" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/space,/area)
+"aO" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/plating,/area/engine/engineering)
+"aP" = (/obj/machinery/power/apc{cell_type = 15000; dir = 4; name = "Engineering APC"; pixel_x = 25; pixel_y = 0},/turf/simulated/floor,/area/engine/engineering)
+"aQ" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/engine/engineering)
+"aR" = (/obj/machinery/door/poddoor,/turf/simulated/floor/engine,/area/engine/engineering)
+"aS" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8; icon_state = "manifold"; initialize_directions = 11; level = 2},/turf/simulated/floor/plating,/area/engine/engineering)
+"aT" = (/obj/machinery/atmospherics/pipe/manifold{icon_state = "manifold"; level = 2},/turf/simulated/floor/plating,/area/engine/engineering)
+"aU" = (/obj/machinery/atmospherics/pipe/simple{dir = 9; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area/engine/engineering)
+"aV" = (/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area/engine/engineering)
+"aW" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; initialize_directions = 11; level = 2},/turf/simulated/floor/plating,/area/engine/engineering)
+"aX" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/engine/engineering)
+"aY" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/turf/simulated/wall/r_wall,/area/engine/engineering)
+"aZ" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering)
+"ba" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/engine,/area/engine/engineering)
+"bb" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/turf/simulated/floor/engine,/area/engine/engineering)
+"bc" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/simulated/floor/engine,/area/engine/engineering)
+"bd" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 10},/turf/simulated/floor/engine,/area/engine/engineering)
+"be" = (/turf/simulated/floor/engine,/area/engine/engineering)
+"bf" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4},/turf/simulated/floor/plating,/area/engine/engineering)
+"bg" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/engine/engineering)
+"bh" = (/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold"; level = 2},/turf/simulated/floor/plating,/area/engine/engineering)
+"bi" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering)
+"bj" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; dir = 10; pixel_x = 0; level = 2; initialize_directions = 10},/obj/machinery/meter,/turf/simulated/floor/plating,/area/engine/engineering)
+"bk" = (/obj/machinery/atmospherics/pipe/simple{dir = 6; icon_state = "intact"; level = 2},/obj/machinery/meter,/turf/simulated/floor/plating,/area/engine/engineering)
+"bl" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor/plating,/area/engine/engineering)
+"bm" = (/obj/machinery/atmospherics/pipe/simple{dir = 6; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area/engine/engineering)
+"bn" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{dir = 4},/turf/simulated/wall/r_wall,/area/engine/engineering)
+"bo" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 9},/turf/simulated/floor/engine,/area/engine/engineering)
+"bp" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4},/turf/simulated/floor/engine,/area/engine/engineering)
+"bq" = (/obj/machinery/atmospherics/valve/digital{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engineering)
+"br" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area/engine/engineering)
+"bs" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plating,/area/engine/engineering)
+"bt" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 4},/turf/simulated/floor/plating,/area/engine/engineering)
+"bu" = (/obj/machinery/atmospherics/binary/circulator,/turf/simulated/floor/plating,/area/engine/engineering)
+"bv" = (/obj/machinery/power/generator,/obj/structure/cable{d1 = 0; d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/engine/engineering)
+"bw" = (/obj/machinery/atmospherics/binary/circulator{dir = 4; icon_state = "circ2-off"; side = 2},/turf/simulated/floor/plating,/area/engine/engineering)
+"bx" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area/engine/engineering)
+"by" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
+"bz" = (/obj/machinery/power/emitter{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engineering)
+"bA" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/turf/simulated/floor/engine,/area/engine/engineering)
+"bB" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/simulated/floor/engine,/area/engine/engineering)
+"bC" = (/obj/machinery/power/emitter{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/engineering)
+"bD" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
+"bE" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{dir = 1},/turf/space,/area)
+"bF" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/obj/machinery/meter,/turf/simulated/floor/plating,/area/engine/engineering)
+"bG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
+"bH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
+"bI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area/engine/engineering)
+"bJ" = (/obj/machinery/door/airlock/engineering,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
+"bK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
+"bL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
+"bM" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/turf/simulated/floor/engine,/area/engine/engineering)
+"bN" = (/obj/machinery/power/rust_core,/turf/simulated/floor/engine,/area/engine/engineering)
+"bO" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/simulated/floor/engine,/area/engine/engineering)
+"bP" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
+"bQ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engineering)
+"bR" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/plating,/area/engine/engineering)
+"bS" = (/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact"; level = 2},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor/plating,/area)
+"bT" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; initialize_directions = 11; level = 2},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor/plating,/area)
+"bU" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/turf/simulated/floor/plating,/area)
+"bV" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/turf/simulated/floor/plating,/area)
+"bW" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/turf/simulated/floor/plating,/area)
+"bX" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
+"bY" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/turf/simulated/floor/engine,/area/engine/engineering)
+"bZ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
+"ca" = (/turf/simulated/floor/plating,/area)
+"cb" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8; icon_state = "manifold"; initialize_directions = 11; level = 2},/turf/simulated/floor/plating,/area)
+"cc" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/plating,/area)
+"cd" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; dir = 10; pixel_x = 0; level = 2; initialize_directions = 10},/turf/simulated/floor/plating,/area)
+"ce" = (/obj/machinery/atmospherics/pipe/simple{dir = 6; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area)
+"cf" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area)
+"cg" = (/obj/structure/cable{d1 = 0; d2 = 2; icon_state = "0-2"},/obj/machinery/power/terminal{dir = 4; icon_state = "term"},/turf/simulated/floor/plating,/area)
+"ch" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area)
+"ci" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area)
+"cj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area)
+"ck" = (/obj/machinery/power/smes,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area)
+"cl" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable{d1 = 0; d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area)
+"cm" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/turf/simulated/floor,/area)
+"cn" = (/obj/machinery/computer/turbine_computer,/turf/simulated/floor,/area)
+"co" = (/obj/machinery/power/generator,/obj/structure/cable{d1 = 0; d2 = 2; icon_state = "0-2"},/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/engineering)
+"cp" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering)
+"cq" = (/obj/machinery/atmospherics/valve/digital{dir = 4},/turf/simulated/floor,/area/engine/engineering)
+"cr" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold{icon_state = "manifold"; level = 2},/turf/simulated/floor/plating,/area/engine/engineering)
+"cs" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; icon_state = "on"; on = 1},/turf/simulated/floor/engine,/area/engine/engineering)
+"ct" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 4},/turf/simulated/floor/plating,/area)
+"cu" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; initialize_directions = 11; level = 2},/turf/simulated/floor/plating,/area)
+"cv" = (/obj/machinery/atmospherics/binary/circulator,/turf/simulated/floor/plating,/area)
+"cw" = (/obj/machinery/power/generator,/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; icon_state = "on"; on = 1},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area)
+"cx" = (/obj/machinery/atmospherics/binary/circulator{dir = 4; icon_state = "circ2-off"; side = 2},/turf/simulated/floor/plating,/area)
+"cy" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area)
+"cz" = (/obj/structure/cable{d1 = 0; d2 = 2; icon_state = "0-2"},/obj/structure/cable,/obj/machinery/power/terminal{dir = 4; icon_state = "term"},/turf/simulated/floor/plating,/area)
+"cA" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable,/obj/structure/cable{d1 = 0; d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area)
+"cB" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/turf/simulated/floor,/area)
+"cC" = (/turf/simulated/floor/engine,/area)
+"cD" = (/obj/machinery/atmospherics/pipe/simple{dir = 9; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area)
+"cE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area)
+"cF" = (/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area)
+"cG" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area)
+"cH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor,/area)
+"cI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area)
+"cJ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor,/area)
+"cK" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area)
+"cL" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/turf/simulated/floor,/area)
+"cM" = (/obj/machinery/power/turbine{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/engine,/area)
+"cN" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area)
+"cO" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor,/area)
+"cP" = (/obj/machinery/door/airlock/engineering,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area)
+"cQ" = (/obj/machinery/power/monitor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor,/area)
+"cR" = (/obj/machinery/power/terminal{dir = 4; icon_state = "term"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area)
+"cS" = (/obj/machinery/power/smes,/obj/structure/cable,/turf/simulated/floor/plating,/area)
+"cT" = (/obj/machinery/compressor,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/engine,/area)
+"cU" = (/obj/machinery/power/smes,/turf/simulated/floor/plating,/area)
+"cV" = (/obj/structure/window/reinforced,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/engine/engineering)
+"cW" = (/obj/structure/window/reinforced,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (SOUTHEAST)"},/area/engine/engineering)
+"cX" = (/obj/structure/window/reinforced,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/engine/engineering)
+"cY" = (/obj/machinery/power/generator,/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; icon_state = "on"; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area)
+"cZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area)
+"da" = (/obj/machinery/door/window/northleft,/turf/simulated/floor/plating,/area)
+"db" = (/obj/machinery/door/window/northright,/turf/simulated/floor/plating,/area)
+"dc" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area)
+"dd" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area)
+"de" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHEAST)"; icon_state = "warnplate"; dir = 5},/area)
+"df" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/engine/engineering)
+"dg" = (/obj/machinery/door/airlock/engineering,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/engine/engineering)
+"dh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering)
+"di" = (/obj/machinery/power/monitor,/turf/simulated/floor,/area/engine/engineering)
+"dj" = (/obj/machinery/power/apc{cell_type = 15000; dir = 1; name = "Engineering APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable{d1 = 0; d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/engine/engineering)
+"dk" = (/obj/machinery/power/smes,/turf/simulated/floor/plating,/area/engine/engineering)
+"dl" = (/obj/machinery/compressor{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/engine,/area/engine/engineering)
+"dm" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/engineering)
+"dn" = (/obj/machinery/power/monitor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/engine/engineering)
+"do" = (/obj/machinery/computer/turbine_computer,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/engine/engineering)
+"dp" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor,/area/engine/engineering)
+"dq" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area)
+"dr" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = "icon-warnplate (SOUTHEAST)"},/area)
+"ds" = (/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area)
+"dt" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area)
+"du" = (/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = "icon-warnplate (SOUTHEAST)"},/area)
+"dv" = (/obj/machinery/door/poddoor,/turf/simulated/floor/engine,/area)
+"dw" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; initialize_directions = 11; level = 2},/turf/simulated/wall/r_wall,/area/engine/engineering)
+"dx" = (/obj/machinery/door/airlock/external,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
+"dy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/wall/r_wall,/area/engine/engineering)
+"dz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/engine/engineering)
+"dA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor,/area/engine/engineering)
+"dB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor,/area/engine/engineering)
+"dC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
+"dD" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engineering)
+"dE" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/turf/simulated/floor,/area/engine/engineering)
+"dF" = (/obj/machinery/power/turbine{dir = 2},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/engine,/area/engine/engineering)
+"dG" = (/obj/machinery/power/apc{cell_type = 15000; dir = 4; name = "Engineering APC"; pixel_x = 25; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/engine/engineering)
+"dH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area)
+"dI" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area)
+"dJ" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/turf/simulated/wall/r_wall,/area)
+"dK" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8},/turf/simulated/floor/plating,/area)
+"dL" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/engine,/area)
+"dM" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4},/turf/simulated/floor/plating,/area)
+"dN" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area)
+"dO" = (/obj/machinery/power/generator,/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/engineering)
+"dP" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/turf/simulated/wall/r_wall,/area/engine/engineering)
+"dQ" = (/obj/structure/cable{d1 = 0; d2 = 2; icon_state = "0-2"},/obj/machinery/power/terminal{dir = 4; icon_state = "term"},/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/engineering)
+"dR" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/engineering)
+"dS" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engineering)
+"dT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
+"dU" = (/obj/machinery/power/smes,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engineering)
+"dV" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable{d1 = 0; d2 = 2; icon_state = "0-2"},/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/engineering)
+"dW" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/turf/simulated/floor,/area/engine/engineering)
+"dX" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area)
+"dY" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/obj/machinery/meter,/turf/simulated/floor,/area)
+"dZ" = (/obj/machinery/atmospherics/valve/digital{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area)
+"ea" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/obj/machinery/meter,/turf/simulated/floor/plating,/area)
+"eb" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; icon_state = "on"; on = 1},/turf/simulated/floor/engine,/area)
+"ec" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4},/turf/simulated/floor/engine,/area)
+"ed" = (/obj/machinery/atmospherics/valve/digital{dir = 4},/turf/simulated/floor/plating,/area)
+"ee" = (/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold"; level = 2},/obj/machinery/meter,/turf/simulated/floor/plating,/area)
+"ef" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/turf/space,/area)
+"eg" = (/obj/machinery/atmospherics/pipe/simple{dir = 6; icon_state = "intact"; level = 2},/turf/simulated/wall/r_wall,/area/engine/engineering)
+"eh" = (/obj/machinery/atmospherics/pipe/simple{dir = 9; icon_state = "intact"; level = 2},/turf/simulated/wall/r_wall,/area/engine/engineering)
+"ei" = (/obj/structure/cable,/obj/machinery/power/terminal{dir = 4; icon_state = "term"},/turf/simulated/floor/plating,/area/engine/engineering)
+"ej" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
+"ek" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/engineering)
+"el" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor/plating,/area/engine/engineering)
+"em" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/turf/simulated/floor,/area/engine/engineering)
+"en" = (/obj/machinery/computer/turbine_computer,/turf/simulated/floor,/area/engine/engineering)
+"eo" = (/obj/machinery/power/emitter{dir = 4},/turf/simulated/floor/plating,/area)
+"ep" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/turf/simulated/floor/engine,/area)
+"eq" = (/obj/machinery/power/emitter{dir = 8},/turf/simulated/floor/plating,/area)
+"er" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction,/turf/simulated/wall/r_wall,/area/engine/engineering)
+"es" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area)
+"et" = (/obj/machinery/door/airlock/engineering,/turf/simulated/floor/plating,/area)
+"eu" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/turf/simulated/floor/engine,/area)
+"ev" = (/obj/machinery/power/rust_core,/turf/simulated/floor/engine,/area)
+"ew" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/obj/structure/lattice,/turf/space,/area)
+"ex" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/simulated/floor/plating,/area)
+"ey" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 10},/obj/structure/lattice,/turf/space,/area)
+"ez" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/turf/simulated/floor/engine,/area)
+"eA" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/obj/structure/lattice,/turf/space,/area)
+"eB" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 9},/obj/structure/lattice,/turf/space,/area)
+"eC" = (/obj/machinery/atmospherics/pipe/manifold{icon_state = "manifold"; level = 2},/turf/simulated/floor/plating,/area)
+"eD" = (/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold"; level = 2},/turf/simulated/floor/plating,/area)
+"eE" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area)
+"eF" = (/obj/machinery/atmospherics/unary/vent_pump/siphon/on{dir = 8},/turf/simulated/floor/engine,/area)
+"eG" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; icon_state = "on"; on = 1},/turf/simulated/floor/engine,/area)
+"eH" = (/obj/machinery/atmospherics/valve/digital{dir = 4},/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area)
+"eI" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold"; level = 2},/turf/simulated/floor/plating,/area)
+"eJ" = (/obj/structure/lattice,/turf/space,/area)
+"eK" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/space,/area)
+"eL" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area)
+"eM" = (/obj/machinery/atmospherics/binary/pump,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area)
+"eN" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor,/area)
+"eO" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/obj/structure/lattice,/turf/space,/area)
+"eP" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor/plating,/area)
+"eQ" = (/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area)
+"eR" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (SOUTHEAST)"},/area)
+"eS" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/turf/simulated/floor/engine,/area)
+"eT" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/turf/simulated/floor/engine,/area)
+"eU" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/turf/simulated/floor/engine,/area)
+"eV" = (/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area)
+"eW" = (/obj/machinery/atmospherics/portables_connector{dir = 1; name = "Connector Port (Air Supply)"},/turf/simulated/floor/plating,/area)
+"eX" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor/plating,/area)
+"eY" = (/obj/structure/closet/crate,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/turf/simulated/floor/plating,/area)
+"eZ" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area)
+"fa" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area)
+"fb" = (/obj/machinery/power/rust_fuel_injector{dir = 1},/turf/simulated/floor/plating,/area)
+"fc" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/plating,/area)
+"fd" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area)
+"fe" = (/obj/machinery/rust_fuel_compressor{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area)
+"ff" = (/obj/machinery/rust_fuel_assembly_port{pixel_y = 32},/turf/simulated/floor/plating,/area)
+"fg" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/turf/simulated/wall/r_wall,/area)
+"fh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area)
+"fi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/space,/area)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacadadadaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacadafadadacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacadadadadacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagahaiadadacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajajajajajajajajajajajakakakakakalakakakakakakakakakakakakakakakakakakakaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajajajajajajajajajajajakamamamamamamamamamananananananananananananananakaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajajajajajajajajajajajakaoapapapapapapaqarararaparararaqapapapapapasanakaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajajajajajajajajajajajakatanakakauauauakakakakavakakakakauauauakakatanakaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajajajajajajajajajajajakatanakakawaxaxakayayayawayayayakazazawakakatanakaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaAaBaBaBaBaBaBaBaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajajajajajajajajajajajakatanakakawaxaxakawawawawawawawakaDaDawakakatanakaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaEaAaBaBaBaBaBaBaFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakakakakakakakakakaGakakaHawaIawakakakakaJaKaLakaJaKaLakakakakawaMaHawakaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaEaNaBaBaBaBaBaBaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakaOaOaOaOaOaOaOaOataPakaHawaIaMaQaIawakaRaRaRakaRaRaRakawaMaQaIaMaHawakaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaEaAaBaBaBaBaBaBaFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakaSaTaTaUaVaTaTaWatanakaHawaIaXaYaZaMbabbbcbcbcbcbdbebaaIbfaYbgaMaHawakakakaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaEaNaBaBaBaBaBaBaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakaVbhbibjawbkblaWatanakaHbmaYaYaYaYaYbnbobbbcbcbcbobpaYaYaYaYaYaYbqbrbhbsakaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaEaAaBaBaBaBaBaBaFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakbtaWawbubvbwawbxatanakaHbxakawbybzbAaRbebBbcbcbcbcbdaRbAbCbDawakaHawaVbsakaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaabEbEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakawaSbFaUbGaVbFaWatanakbHbIbJbKbLbzbMaRbebebebNbebebOaRbMbCbPbKbJbQawbmbRakaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabbSbTbUbVbVbVbVbWabababababababababababaaaaaaaaaaaaaaabababababababababaaaaaaaaaaaaaaaaaaakawaSbibjbGbkblaWatanakaHbxakawbXbzbYaRbebbbcbcbcbcboaRbYbCbZawakaHawaSbRakaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabcacbcccdcacecfcdadadabcgchcicjckclcacmaaaaaaaaaaaaaacmcacacncncncncnabaaaaaaaaaaaaaaaaaaakbtaWawbucobwawaScpcqaYbqcraYaYaYaYaYbnbdbBbcbcbcbdcsaYaYaYaYaYaYbqbraTbRakaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabctcucacvcwcxcacyadadabczchcicjckcAcacBcCcCcCcCcCcCcCcBcacaadadadadadabaaaaaaaaaaaaaaaaaaakawaSbFaUbGaVbFaWatanakaHawaIaXaYaZaMbabBbcbcbcbcbobebaaIbfaYbgaMaHawakakakaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabcacbcfcDcEcFcdcyadadabcGcHcIcHcHcJcKcLcMcMcMcMcMcMcMcLcacaadadadadadabaaaaaaaaaaaaaaaaaaakawaSbibjbGbkblaWatanakaHawaIaMaQaIawakaRakaRaRaRaRaRakawaMaQaIaMaHawakaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabcacbcccdcEcecNcucOcHcPcHcHcIcHcQcRcSabcTcTcTcTcTcTcTabcUcaaecncnadadabaaaaaaaaaaaaaaaaaaakbtaWawbucobwawbxatanakaHawcVcWakakakakbeakbebebebebeakakakakcWcXaHawakaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabctcucacvcYcxcycycZadabdadbdcddababababcCcCcCcCcCcCcCababababdddedadbabaaaaaaaaaaaaaaaaaaakawaSbFaUbGaVbFaWdfapdgdhapasandidjdkakdlakdldldldldlakdkdmdndododpanakaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabcacbcfcDcEcFcucycZadabdqcjdrdsdtducaabdvdvdvdvdvdvdvabcadsdtdudscacaabaaaaaaaaaaaaaaaaaaakawaSbibjbGbkbldwdxdydydzdAdBdAdAdCdDdEdFakdFdFdFdFdFdEawawananandfdGakaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabcacbcccdcEcecNcucZadabdHcadudIdJdKdsdLcCcCcCcCcCcCcCdLdudMdJdNcacacaabaaaaaaaaaaaaaaaaaaakbtaWawbudObwawdPawawakdQdRdSdTdUdVawdWbebebebebebebedWawawanananananakaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabctcucacvcYcxcycbdXdYdJdZeadJdJdJdJdJdJebcCcCcCcCcCecdJdJdJdJdJdJedeedJefaaaaaaaaaaaaaaaaegbhaTbFaUawaVbFehawawakeidRejdTdUekelemajajajajajajajemelawenenenenenakaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabcacbcfcDcEcFcucycZadabdHcaabcacaeoepdvcCcCcCcCcCcCcCdvepeqcacaabcacyabaaaaaaaaaaaaaaaaaaererakakakakakakakakaQakakakakakakakakakajajajajajajajakakakakakakakakakaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabcacbcccdcEceescDcZadabdHcaetcacaeoeudvcCcCcCevcCcCcCdveueqcacaetcacyabaaaaaaaaaaaaaaaaaaewaNaBaBaBaBaBaBaBaBexaBaBaBaBaBaBaBaBeyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabctcucacvcYcxcycacZadabdHcaabcacaeoezdvcCcCcCcCcCcCcCdvezeqcacaabcecDabaaaaaaaaaaaaaaaaaaeAaBaBaBaBaBaBaBaBaCcaaAaBaBaBaBaBaBaBeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabcacbcfcDcEcFeCeDeEdYdJdZeadJdJdJdJdJdJeFcCcCcCcCcCeGdJdJdJdJdJdJeHeIdJefaaaaaaaaaaaaaaaaeJeJeJeJeJeJeJeJeJeKcaeKeJeJeJeJeJeJeJeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabcacycacaeLcjcjeMeNadabdHcadudIdJdKdsdLcCcCcCcCcCcCcCdLdudMdJdNdscycyabaaaaaaaaaaaaaaaaaaeOaBaBaBaBaBaBaBaBaFcaaNaBaBaBaBaBaBaBeyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabcacbcfcfcfcfcfcuadadabdHcadudsdtducaabdvdvdvabdvdvdvabcadsdtdudsePcyabaaaaaaaaaaaaaaaaaaeAaBaBaBaBaBaBaBaBaCcaaAaBaBaBaBaBaBaBeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabcecucacacacacacyadadabdHcaeQeRababababeSeTeUabeSeTeUababababeReVeWcyabaaaaaaaaaaaaaaaaaaeJeJeJeJeJeJeJeJeJeKcaeKeJeJeJeJeJeJeJeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabeXePcacacacacacyadadabdHcacacadueYeYabcacacacacacacaabeZeZfacacacacyabaaaaaaaaaaaaaaaaaaeOaBaBaBaBaBaBaBaBaFcaaNaBaBaBaBaBaBaBeyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabeWeWcacacacacacyadadabdHcacacadueYeYabfbfbfbcafbfbfbabfcfcfdcacacacyabaaaaaaaaaaaaaaaaaaeAaBaBaBaBaBaBaBaBaBexaBaBaBaBaBaBaBaBeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabcacacacacacacacyadadabdHcacacaeQeReRababababetababababeReReVcaceeDcuabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabcacacacacacacacyadadabdHcacacacacacafeffffffcafffffffecacacacaeXeXeXabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabcacacacacacacacyadadabdHcacacacacacacacacacacacacacacacacacacaeWeWeWabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaababababababababfgabababfhabababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}