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 += "" + 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 += "" + dat += "" + dat += "" + dat += "
Device tag
[C.id_tag]\[Manage\]
" + 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 += "" - t += "" - t += "" - t += "" - t += "" - t += "" - for(var/stage_name in fuel_injectors) - var/list/cur_stage = fuel_injectors[stage_name] - t += "" - for(var/obj/machinery/rust/fuel_injector/Injector in cur_stage) - t += "" - t += "" - t += "" - t += "" - t += "" - t += "" - t += "" - t += "
Injector StatusInjection interval (sec)Assembly consumption per injectionFuel Assembly PortAssembly depletion percentage
Fuel Injection Stage: [stage_name], [stage_status[stage_name] ? "Active \[Enter cooldown\]" : "Cooling \[Begin injection\]"]
[Injector.on && Injector.remote_enabled ? "Operational" : "Unresponsive"][Injector.rate/10] Modify[Injector.fuel_usage*100]% Modify[Injector.owned_assembly_port ? "[Injector.owned_assembly_port.cur_assembly ? "Loaded": "Empty"]" : "Disconnected" ][Injector.owned_assembly_port && Injector.owned_assembly_port.cur_assembly ? "[Injector.owned_assembly_port.cur_assembly.percent_depleted]%" : ""]
" - 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 += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + + for(var/obj/machinery/power/rust_fuel_injector/I in connected_injectors) + dat += "" + dat += "" + if(I.cur_assembly) + dat += "" + else + dat += "" + dat += "" + if(I.cur_assembly) + dat += "" + else + dat += "" + if(stage_times.Find(I.id_tag)) + dat += "" + else + dat += "" + if(proceeding_stages.Find(I.id_tag)) + dat += "" + else + dat += "" + dat += "" + dat += "" + dat += "
IDAssemblyConsumptionDepletionDurationNext stage
[I.id_tag]\[[I.injecting ? "Halt injecting" : "Begin injecting"]\]None[I.fuel_usage * 100]%[I.cur_assembly.percent_depleted * 100]%NA[ticks_this_stage]/[stage_times[I.id_tag]]s Modify[ticks_this_stage]s Set[proceeding_stages[I.id_tag]]None \[modify\]\[[active_stages.Find(I.id_tag) ? "Deactivate stage" : "Activate stage "] \]
" + + 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 += "" - t += "" - t += "" - t += "" - t += "" - t += "" - for(var/stage in fuel_injectors) - var/list/cur_stage = fuel_injectors[stage] - t += "" - for(var/obj/machinery/rust/fuel_injector/Injector in cur_stage) - t += "" - t += "" - t += "" - t += "" - t += "" - t += "" - t += "" - t += "
Injector StatusInjection interval (sec)Assembly consumption per injectionFuel Assembly PortAssembly depletion percentage
Fuel Injection Stage: [stage] [active_stage == stage ? " (Currently active)" : "Activate"]
[Injector.on && Injector.remote_enabled ? "Operational" : "Unresponsive"][Injector.rate/10] Modify[Injector.fuel_usage*100]% Modify[Injector.owned_assembly_port ? "[Injector.owned_assembly_port.cur_assembly ? "Loaded": "Empty"]" : "Disconnected" ][Injector.owned_assembly_port && Injector.owned_assembly_port.cur_assembly ? "[100 - Injector.owned_assembly_port.cur_assembly.amount_depleted*100]%" : ""]
" - */ - 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 +"}