Merge pull request #2862 from Baystation12/bleeding-edge-freeze

BEF merge
This commit is contained in:
Mloc
2013-05-26 11:41:10 -07:00
93 changed files with 2400 additions and 2053 deletions

View File

@@ -6,14 +6,235 @@
// BEGIN_FILE_DIR // BEGIN_FILE_DIR
#define FILE_DIR . #define FILE_DIR .
#define FILE_DIR "code" #define FILE_DIR "code"
#define FILE_DIR "code/__HELPERS"
#define FILE_DIR "code/ATMOSPHERICS"
#define FILE_DIR "code/ATMOSPHERICS/components"
#define FILE_DIR "code/ATMOSPHERICS/components/binary_devices"
#define FILE_DIR "code/ATMOSPHERICS/components/trinary_devices"
#define FILE_DIR "code/ATMOSPHERICS/components/unary"
#define FILE_DIR "code/controllers"
#define FILE_DIR "code/datums"
#define FILE_DIR "code/datums/diseases"
#define FILE_DIR "code/datums/diseases/advance"
#define FILE_DIR "code/datums/diseases/advance/symptoms"
#define FILE_DIR "code/datums/helper_datums"
#define FILE_DIR "code/datums/spells"
#define FILE_DIR "code/defines"
#define FILE_DIR "code/defines/obj"
#define FILE_DIR "code/defines/procs"
#define FILE_DIR "code/FEA"
#define FILE_DIR "code/game"
#define FILE_DIR "code/game/area"
#define FILE_DIR "code/game/gamemodes"
#define FILE_DIR "code/game/gamemodes/autotraitor"
#define FILE_DIR "code/game/gamemodes/blob"
#define FILE_DIR "code/game/gamemodes/blob/blobs"
#define FILE_DIR "code/game/gamemodes/changeling"
#define FILE_DIR "code/game/gamemodes/cult"
#define FILE_DIR "code/game/gamemodes/epidemic"
#define FILE_DIR "code/game/gamemodes/events"
#define FILE_DIR "code/game/gamemodes/events/holidays"
#define FILE_DIR "code/game/gamemodes/extended"
#define FILE_DIR "code/game/gamemodes/malfunction"
#define FILE_DIR "code/game/gamemodes/meme"
#define FILE_DIR "code/game/gamemodes/meteor"
#define FILE_DIR "code/game/gamemodes/nuclear"
#define FILE_DIR "code/game/gamemodes/revolution"
#define FILE_DIR "code/game/gamemodes/sandbox"
#define FILE_DIR "code/game/gamemodes/traitor"
#define FILE_DIR "code/game/gamemodes/wizard"
#define FILE_DIR "code/game/jobs"
#define FILE_DIR "code/game/jobs/job"
#define FILE_DIR "code/game/machinery"
#define FILE_DIR "code/game/machinery/atmoalter"
#define FILE_DIR "code/game/machinery/bots"
#define FILE_DIR "code/game/machinery/camera"
#define FILE_DIR "code/game/machinery/computer"
#define FILE_DIR "code/game/machinery/doors"
#define FILE_DIR "code/game/machinery/embedded_controller"
#define FILE_DIR "code/game/machinery/kitchen"
#define FILE_DIR "code/game/machinery/pipe"
#define FILE_DIR "code/game/machinery/telecomms"
#define FILE_DIR "code/game/magic"
#define FILE_DIR "code/game/mecha"
#define FILE_DIR "code/game/mecha/combat"
#define FILE_DIR "code/game/mecha/equipment"
#define FILE_DIR "code/game/mecha/equipment/tools"
#define FILE_DIR "code/game/mecha/equipment/weapons"
#define FILE_DIR "code/game/mecha/medical"
#define FILE_DIR "code/game/mecha/working"
#define FILE_DIR "code/game/objects"
#define FILE_DIR "code/game/objects/closets"
#define FILE_DIR "code/game/objects/closets/secure"
#define FILE_DIR "code/game/objects/effects"
#define FILE_DIR "code/game/objects/effects/decals"
#define FILE_DIR "code/game/objects/effects/decals/Cleanable"
#define FILE_DIR "code/game/objects/effects/spawners"
#define FILE_DIR "code/game/objects/items"
#define FILE_DIR "code/game/objects/items/devices"
#define FILE_DIR "code/game/objects/items/devices/PDA"
#define FILE_DIR "code/game/objects/items/devices/radio"
#define FILE_DIR "code/game/objects/items/robot"
#define FILE_DIR "code/game/objects/items/stacks"
#define FILE_DIR "code/game/objects/items/stacks/sheets"
#define FILE_DIR "code/game/objects/items/stacks/tiles"
#define FILE_DIR "code/game/objects/items/weapons"
#define FILE_DIR "code/game/objects/items/weapons/grenades"
#define FILE_DIR "code/game/objects/items/weapons/implants"
#define FILE_DIR "code/game/objects/items/weapons/melee"
#define FILE_DIR "code/game/objects/items/weapons/storage"
#define FILE_DIR "code/game/objects/items/weapons/tanks"
#define FILE_DIR "code/game/objects/storage"
#define FILE_DIR "code/game/objects/structures"
#define FILE_DIR "code/game/objects/structures/crates_lockers"
#define FILE_DIR "code/game/objects/structures/crates_lockers/closets"
#define FILE_DIR "code/game/objects/structures/crates_lockers/closets/secure"
#define FILE_DIR "code/game/objects/structures/stool_bed_chair_nest"
#define FILE_DIR "code/game/structure"
#define FILE_DIR "code/game/turfs"
#define FILE_DIR "code/game/turfs/simulated"
#define FILE_DIR "code/game/turfs/space"
#define FILE_DIR "code/game/turfs/unsimulated"
#define FILE_DIR "code/game/vehicles"
#define FILE_DIR "code/game/verbs"
#define FILE_DIR "code/js"
#define FILE_DIR "code/modules"
#define FILE_DIR "code/modules/admin"
#define FILE_DIR "code/modules/admin/DB ban"
#define FILE_DIR "code/modules/admin/permissionverbs"
#define FILE_DIR "code/modules/admin/verbs"
#define FILE_DIR "code/modules/assembly"
#define FILE_DIR "code/modules/awaymissions"
#define FILE_DIR "code/modules/awaymissions/maploader"
#define FILE_DIR "code/modules/client"
#define FILE_DIR "code/modules/clothing"
#define FILE_DIR "code/modules/clothing/glasses"
#define FILE_DIR "code/modules/clothing/gloves"
#define FILE_DIR "code/modules/clothing/head"
#define FILE_DIR "code/modules/clothing/masks"
#define FILE_DIR "code/modules/clothing/shoes"
#define FILE_DIR "code/modules/clothing/spacesuits"
#define FILE_DIR "code/modules/clothing/suits"
#define FILE_DIR "code/modules/clothing/under"
#define FILE_DIR "code/modules/clothing/under/jobs"
#define FILE_DIR "code/modules/customitems"
#define FILE_DIR "code/modules/destilery"
#define FILE_DIR "code/modules/DetectiveWork"
#define FILE_DIR "code/modules/events"
#define FILE_DIR "code/modules/flufftext"
#define FILE_DIR "code/modules/food"
#define FILE_DIR "code/modules/genetics"
#define FILE_DIR "code/modules/icon generation"
#define FILE_DIR "code/modules/library"
#define FILE_DIR "code/modules/liquid"
#define FILE_DIR "code/modules/maps"
#define FILE_DIR "code/modules/mining"
#define FILE_DIR "code/modules/mob"
#define FILE_DIR "code/modules/mob/dead"
#define FILE_DIR "code/modules/mob/dead/observer"
#define FILE_DIR "code/modules/mob/living"
#define FILE_DIR "code/modules/mob/living/blob"
#define FILE_DIR "code/modules/mob/living/carbon"
#define FILE_DIR "code/modules/mob/living/carbon/alien"
#define FILE_DIR "code/modules/mob/living/carbon/alien/humanoid"
#define FILE_DIR "code/modules/mob/living/carbon/alien/humanoid/caste"
#define FILE_DIR "code/modules/mob/living/carbon/alien/larva"
#define FILE_DIR "code/modules/mob/living/carbon/alien/special"
#define FILE_DIR "code/modules/mob/living/carbon/brain"
#define FILE_DIR "code/modules/mob/living/carbon/human"
#define FILE_DIR "code/modules/mob/living/carbon/metroid"
#define FILE_DIR "code/modules/mob/living/carbon/monkey"
#define FILE_DIR "code/modules/mob/living/silicon"
#define FILE_DIR "code/modules/mob/living/silicon/ai"
#define FILE_DIR "code/modules/mob/living/silicon/ai/freelook"
#define FILE_DIR "code/modules/mob/living/silicon/decoy"
#define FILE_DIR "code/modules/mob/living/silicon/pai"
#define FILE_DIR "code/modules/mob/living/silicon/robot"
#define FILE_DIR "code/modules/mob/living/simple_animal"
#define FILE_DIR "code/modules/mob/living/simple_animal/friendly"
#define FILE_DIR "code/modules/mob/living/simple_animal/hostile"
#define FILE_DIR "code/modules/mob/living/simple_animal/hostile/retaliate"
#define FILE_DIR "code/modules/mob/new_player"
#define FILE_DIR "code/modules/organs"
#define FILE_DIR "code/modules/paperwork"
#define FILE_DIR "code/modules/power"
#define FILE_DIR "code/modules/power/antimatter"
#define FILE_DIR "code/modules/power/singularity"
#define FILE_DIR "code/modules/power/singularity/particle_accelerator"
#define FILE_DIR "code/modules/projectiles"
#define FILE_DIR "code/modules/projectiles/ammunition"
#define FILE_DIR "code/modules/projectiles/guns"
#define FILE_DIR "code/modules/projectiles/guns/energy"
#define FILE_DIR "code/modules/projectiles/guns/projectile"
#define FILE_DIR "code/modules/projectiles/projectile"
#define FILE_DIR "code/modules/reagents"
#define FILE_DIR "code/modules/reagents/reagent_containers"
#define FILE_DIR "code/modules/reagents/reagent_containers/food"
#define FILE_DIR "code/modules/reagents/reagent_containers/food/drinks"
#define FILE_DIR "code/modules/reagents/reagent_containers/food/drinks/bottle"
#define FILE_DIR "code/modules/reagents/reagent_containers/food/snacks"
#define FILE_DIR "code/modules/reagents/reagent_containers/glass"
#define FILE_DIR "code/modules/reagents/reagent_containers/glass/bottle"
#define FILE_DIR "code/modules/recycling"
#define FILE_DIR "code/modules/research"
#define FILE_DIR "code/modules/research/xenoarchaeology"
#define FILE_DIR "code/modules/research/xenoarchaeology/artifact"
#define FILE_DIR "code/modules/research/xenoarchaeology/artifact/effects"
#define FILE_DIR "code/modules/research/xenoarchaeology/finds"
#define FILE_DIR "code/modules/research/xenoarchaeology/machinery"
#define FILE_DIR "code/modules/research/xenoarchaeology/tools"
#define FILE_DIR "code/modules/scripting"
#define FILE_DIR "code/modules/scripting/AST"
#define FILE_DIR "code/modules/scripting/AST/Operators"
#define FILE_DIR "code/modules/scripting/Implementations"
#define FILE_DIR "code/modules/scripting/Interpreter"
#define FILE_DIR "code/modules/scripting/Parser"
#define FILE_DIR "code/modules/scripting/Scanner"
#define FILE_DIR "code/modules/security levels"
#define FILE_DIR "code/modules/surgery"
#define FILE_DIR "code/TriDimension" #define FILE_DIR "code/TriDimension"
#define FILE_DIR "code/unused"
#define FILE_DIR "code/unused/beast"
#define FILE_DIR "code/unused/computer2"
#define FILE_DIR "code/unused/disease2"
#define FILE_DIR "code/unused/gamemodes"
#define FILE_DIR "code/unused/hivebot"
#define FILE_DIR "code/unused/mining"
#define FILE_DIR "code/unused/optics"
#define FILE_DIR "code/unused/pda2"
#define FILE_DIR "code/unused/powerarmor"
#define FILE_DIR "code/unused/spacecraft"
#define FILE_DIR "code/WorkInProgress" #define FILE_DIR "code/WorkInProgress"
#define FILE_DIR "code/WorkInProgress/AI_Visibility"
#define FILE_DIR "code/WorkInProgress/animusstation"
#define FILE_DIR "code/WorkInProgress/Apples"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn" #define FILE_DIR "code/WorkInProgress/Cael_Aislinn"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Economy"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Jungle" #define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Jungle"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Rust" #define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Rust"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/ShieldGen" #define FILE_DIR "code/WorkInProgress/Cael_Aislinn/ShieldGen"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Supermatter" #define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Supermatter"
#define FILE_DIR "code/WorkInProgress/carn"
#define FILE_DIR "code/WorkInProgress/Chinsky"
#define FILE_DIR "code/WorkInProgress/Cib"
#define FILE_DIR "code/WorkInProgress/Cib/amorph"
#define FILE_DIR "code/WorkInProgress/Mini"
#define FILE_DIR "code/WorkInProgress/Mloc"
#define FILE_DIR "code/WorkInProgress/organs"
#define FILE_DIR "code/WorkInProgress/Ported"
#define FILE_DIR "code/WorkInProgress/Ported/Abi79"
#define FILE_DIR "code/WorkInProgress/Ported/Bureaucracy"
#define FILE_DIR "code/WorkInProgress/Ported/Spawners"
#define FILE_DIR "code/WorkInProgress/Sigyn"
#define FILE_DIR "code/WorkInProgress/Sigyn/Department Sec"
#define FILE_DIR "code/WorkInProgress/Sigyn/Softcurity"
#define FILE_DIR "code/WorkInProgress/SkyMarshal"
#define FILE_DIR "code/WorkInProgress/Susan" #define FILE_DIR "code/WorkInProgress/Susan"
#define FILE_DIR "code/WorkInProgress/Tastyfish"
#define FILE_DIR "code/WorkInProgress/virus2"
#define FILE_DIR "code/WorkInProgress/virus2/Disease2"
#define FILE_DIR "code/WorkInProgress/Wrongnumber"
#define FILE_DIR "code/ZAS"
#define FILE_DIR "html" #define FILE_DIR "html"
#define FILE_DIR "icons" #define FILE_DIR "icons"
#define FILE_DIR "icons/48x48" #define FILE_DIR "icons/48x48"
@@ -36,6 +257,9 @@
#define FILE_DIR "icons/turf" #define FILE_DIR "icons/turf"
#define FILE_DIR "icons/vending_icons" #define FILE_DIR "icons/vending_icons"
#define FILE_DIR "icons/xenoarch_icons" #define FILE_DIR "icons/xenoarch_icons"
#define FILE_DIR "interface"
#define FILE_DIR "maps"
#define FILE_DIR "maps/RandomZLevels"
#define FILE_DIR "sound" #define FILE_DIR "sound"
#define FILE_DIR "sound/AI" #define FILE_DIR "sound/AI"
#define FILE_DIR "sound/ambience" #define FILE_DIR "sound/ambience"
@@ -51,7 +275,10 @@
#define FILE_DIR "sound/piano" #define FILE_DIR "sound/piano"
#define FILE_DIR "sound/violin" #define FILE_DIR "sound/violin"
#define FILE_DIR "sound/voice" #define FILE_DIR "sound/voice"
#define FILE_DIR "sound/voice/Serithi"
#define FILE_DIR "sound/weapons" #define FILE_DIR "sound/weapons"
#define FILE_DIR "tools"
#define FILE_DIR "tools/Redirector"
// END_FILE_DIR // END_FILE_DIR
// BEGIN_PREFERENCES // BEGIN_PREFERENCES
#define DEBUG #define DEBUG
@@ -478,6 +705,7 @@
#include "code\game\objects\items\trash.dm" #include "code\game\objects\items\trash.dm"
#include "code\game\objects\items\devices\aicard.dm" #include "code\game\objects\items\devices\aicard.dm"
#include "code\game\objects\items\devices\chameleonproj.dm" #include "code\game\objects\items\devices\chameleonproj.dm"
#include "code\game\objects\items\devices\debugger.dm"
#include "code\game\objects\items\devices\flash.dm" #include "code\game\objects\items\devices\flash.dm"
#include "code\game\objects\items\devices\flashlight.dm" #include "code\game\objects\items\devices\flashlight.dm"
#include "code\game\objects\items\devices\lightreplacer.dm" #include "code\game\objects\items\devices\lightreplacer.dm"
@@ -785,7 +1013,7 @@
#include "code\modules\DetectiveWork\detective_work.dm" #include "code\modules\DetectiveWork\detective_work.dm"
#include "code\modules\DetectiveWork\evidence.dm" #include "code\modules\DetectiveWork\evidence.dm"
#include "code\modules\DetectiveWork\footprints_and_rag.dm" #include "code\modules\DetectiveWork\footprints_and_rag.dm"
#include "code\modules\DetectiveWork\scanner.dm" #include "code\modules\detectivework\scanner.dm"
#include "code\modules\events\alien_infestation.dm" #include "code\modules\events\alien_infestation.dm"
#include "code\modules\events\blob.dm" #include "code\modules\events\blob.dm"
#include "code\modules\events\brand_intelligence.dm" #include "code\modules\events\brand_intelligence.dm"
@@ -804,6 +1032,7 @@
#include "code\modules\events\money_hacker.dm" #include "code\modules\events\money_hacker.dm"
#include "code\modules\events\money_lotto.dm" #include "code\modules\events\money_lotto.dm"
#include "code\modules\events\money_spam.dm" #include "code\modules\events\money_spam.dm"
#include "code\modules\events\organ_failure.dm"
#include "code\modules\events\prison_break.dm" #include "code\modules\events\prison_break.dm"
#include "code\modules\events\radiation_storm.dm" #include "code\modules\events\radiation_storm.dm"
#include "code\modules\events\rogue_drones.dm" #include "code\modules\events\rogue_drones.dm"
@@ -813,6 +1042,7 @@
#include "code\modules\events\spontaneous_appendicitis.dm" #include "code\modules\events\spontaneous_appendicitis.dm"
#include "code\modules\events\viral_infection.dm" #include "code\modules\events\viral_infection.dm"
#include "code\modules\events\viral_outbreak.dm" #include "code\modules\events\viral_outbreak.dm"
#include "code\modules\events\wallrot.dm"
#include "code\modules\flufftext\Dreaming.dm" #include "code\modules\flufftext\Dreaming.dm"
#include "code\modules\flufftext\Hallucination.dm" #include "code\modules\flufftext\Hallucination.dm"
#include "code\modules\flufftext\TextFilters.dm" #include "code\modules\flufftext\TextFilters.dm"
@@ -834,6 +1064,7 @@
#include "code\modules\mining\ores_coins.dm" #include "code\modules\mining\ores_coins.dm"
#include "code\modules\mining\satchel_ore_boxdm.dm" #include "code\modules\mining\satchel_ore_boxdm.dm"
#include "code\modules\mob\death.dm" #include "code\modules\mob\death.dm"
#include "code\modules\mob\emote.dm"
#include "code\modules\mob\inventory.dm" #include "code\modules\mob\inventory.dm"
#include "code\modules\mob\login.dm" #include "code\modules\mob\login.dm"
#include "code\modules\mob\logout.dm" #include "code\modules\mob\logout.dm"
@@ -1245,6 +1476,7 @@
#include "code\WorkInProgress\autopsy.dm" #include "code\WorkInProgress\autopsy.dm"
#include "code\WorkInProgress\buildmode.dm" #include "code\WorkInProgress\buildmode.dm"
#include "code\WorkInProgress\explosion_particles.dm" #include "code\WorkInProgress\explosion_particles.dm"
#include "code\WorkInProgress\periodic_news.dm"
#include "code\WorkInProgress\Cael_Aislinn\meteor_battery.dm" #include "code\WorkInProgress\Cael_Aislinn\meteor_battery.dm"
#include "code\WorkInProgress\Cael_Aislinn\sculpture.dm" #include "code\WorkInProgress\Cael_Aislinn\sculpture.dm"
#include "code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm" #include "code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm"
@@ -1275,6 +1507,7 @@
#include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_compressor_construction.dm" #include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_compressor_construction.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_control.dm" #include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_control.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_injector.dm" #include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_injector.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\fusion_reactions.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\gyrotron.dm" #include "code\WorkInProgress\Cael_Aislinn\Rust\gyrotron.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\gyrotron_controller.dm" #include "code\WorkInProgress\Cael_Aislinn\Rust\gyrotron_controller.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\radiation.dm" #include "code\WorkInProgress\Cael_Aislinn\Rust\radiation.dm"

View File

@@ -1,14 +1,6 @@
//node1, air1, network1 correspond to input //node1, air1, network1 correspond to input
//node2, air2, network2 correspond to output //node2, air2, network2 correspond to output
#define CIRCULATOR_MIN_PRESSURE 10 //KPA to move the mechanism
#define CIRCULATOR_VOLUME 100 //Litres
#define CIRCULATOR_EFFICIENCY 0.65 //Out of 1.
#define TURBINE_EFFICIENCY 0.1 //Uses more power than is generated.
#define TURBINE_PRESSURE_DIFFERENCE 20 //Simulates a 20KPa difference
#define GENRATE 800
/obj/machinery/atmospherics/binary/circulator /obj/machinery/atmospherics/binary/circulator
name = "circulator/heat exchanger" name = "circulator/heat exchanger"
desc = "A gas circulator pump and heat exchanger." desc = "A gas circulator pump and heat exchanger."
@@ -16,97 +8,60 @@
icon_state = "circ-off" icon_state = "circ-off"
anchored = 0 anchored = 0
//var/side = 1 // 1=left 2=right var/recent_moles_transferred = 0
var/status = 0 var/last_heat_capacity = 0
var/last_temperature = 0
var/datum/gas_mixture/gas_contents
var/last_pressure_delta = 0 var/last_pressure_delta = 0
var/turbine_pumping = 0 //For when there is not enough pressure difference and we need to induce one or something. var/last_worldtime_transfer = 0
var/last_power_generation = 0
density = 1 density = 1
/obj/machinery/atmospherics/binary/circulator/New() /obj/machinery/atmospherics/binary/circulator/New()
..() ..()
desc = initial(desc) + " Its outlet port is to the [dir2text(dir)]." desc = initial(desc) + " Its outlet port is to the [dir2text(dir)]."
gas_contents = new
gas_contents.volume = CIRCULATOR_VOLUME
/obj/machinery/atmospherics/binary/circulator/proc/return_transfer_air() /obj/machinery/atmospherics/binary/circulator/proc/return_transfer_air()
if(!anchored) var/datum/gas_mixture/removed
return null if(anchored && !(stat&BROKEN) )
var/input_starting_pressure = air1.return_pressure()
var/output_starting_pressure = air2.return_pressure()
last_pressure_delta = max(input_starting_pressure - output_starting_pressure + 10, 0)
var/output_starting_pressure = air2.return_pressure() //only circulate air if there is a pressure difference (plus 10 kPa to represent friction in the machine)
var/input_starting_pressure = air1.return_pressure() if(air1.temperature > 0 && last_pressure_delta > 0)
var/internal_gas_pressure = gas_contents.return_pressure()
var/intake_pressure_delta = input_starting_pressure - internal_gas_pressure //Calculate necessary moles to transfer using PV = nRT
var/output_pressure_delta = internal_gas_pressure - output_starting_pressure recent_moles_transferred = last_pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION)
var/pressure_delta = max(intake_pressure_delta, output_pressure_delta, 0) //Actually transfer the gas
removed = air1.remove(recent_moles_transferred)
if(removed)
last_heat_capacity = removed.heat_capacity()
last_temperature = removed.temperature
last_power_generation = 0 //Update the gas networks.
//If the turbine is running, we need to consider that. if(network1)
if(turbine_pumping) network1.update = 1
//Make it use powah
if(pressure_delta < TURBINE_PRESSURE_DIFFERENCE)
last_power_generation = (pressure_delta - TURBINE_PRESSURE_DIFFERENCE)*(1/TURBINE_EFFICIENCY)
pressure_delta = TURBINE_PRESSURE_DIFFERENCE
//If the force is already above what the turbine can do, shut it off and generate power instead! last_worldtime_transfer = world.time
else else
turbine_pumping = 0 recent_moles_transferred = 0
//Calculate necessary moles to transfer using PV = nRT
if(air1.temperature > 0)
var/transfer_moles = pressure_delta*gas_contents.volume/(air1.temperature * R_IDEAL_GAS_EQUATION)
last_pressure_delta = pressure_delta
//Actually transfer the gas
//Internal to output.
air2.merge(gas_contents.remove(transfer_moles))
//Intake to internal.
gas_contents.merge(air1.remove(transfer_moles))
//Update the gas networks.
if(network1)
network1.update = 1
if(network2)
network2.update = 1
else
last_pressure_delta = 0
//Needs at least 10 KPa difference to move the mechanism and make power
if(pressure_delta < CIRCULATOR_MIN_PRESSURE)
last_pressure_delta = 0
last_power_generation += pressure_delta*CIRCULATOR_EFFICIENCY
return gas_contents
//Used by the TEG to know how much power to use/produce.
/obj/machinery/atmospherics/binary/circulator/proc/ReturnPowerGeneration()
return GENRATE*last_power_generation
update_icon()
return removed
/obj/machinery/atmospherics/binary/circulator/process() /obj/machinery/atmospherics/binary/circulator/process()
..() ..()
update_icon()
if(last_worldtime_transfer < world.time - 50)
recent_moles_transferred = 0
update_icon()
/obj/machinery/atmospherics/binary/circulator/update_icon() /obj/machinery/atmospherics/binary/circulator/update_icon()
if(stat & (BROKEN|NOPOWER) || !anchored) if(stat & (BROKEN|NOPOWER) || !anchored)
icon_state = "circ-p" icon_state = "circ-p"
else if(last_pressure_delta > 0) else if(last_pressure_delta > 0 && recent_moles_transferred > 0)
if(last_pressure_delta > ONE_ATMOSPHERE) if(last_pressure_delta > 5*ONE_ATMOSPHERE)
icon_state = "circ-run" icon_state = "circ-run"
else else
icon_state = "circ-slow" icon_state = "circ-slow"

View File

@@ -130,207 +130,202 @@
desc = "a mysterious and ancient piece of machinery" desc = "a mysterious and ancient piece of machinery"
var/list/animal_spawners = list() var/list/animal_spawners = list()
New()
..()
Initialise()
/obj/machinery/jungle_controller/proc/Initialise() /obj/machinery/jungle_controller/initialize()
set background = 1 world << "\red \b Setting up jungle, this may take a bleeding eternity..."
spawn(0)
world << "\red \b Setting up jungle, this may take a moment..."
//crash dat shuttle //crash dat shuttle
var/area/start_location = locate(/area/jungle/crash_ship_source) var/area/start_location = locate(/area/jungle/crash_ship_source)
var/area/clean_location = locate(/area/jungle/crash_ship_clean) var/area/clean_location = locate(/area/jungle/crash_ship_clean)
var/list/ship_locations = list(/area/jungle/crash_ship_one, /area/jungle/crash_ship_two, /area/jungle/crash_ship_three, /area/jungle/crash_ship_four) var/list/ship_locations = list(/area/jungle/crash_ship_one, /area/jungle/crash_ship_two, /area/jungle/crash_ship_three, /area/jungle/crash_ship_four)
var/area/end_location = locate( pick(ship_locations) ) var/area/end_location = locate( pick(ship_locations) )
ship_locations -= end_location.type ship_locations -= end_location.type
start_location.move_contents_to(end_location) start_location.move_contents_to(end_location)
for(var/area_type in ship_locations) for(var/area_type in ship_locations)
var/area/cur_location = locate(area_type) var/area/cur_location = locate(area_type)
clean_location.copy_turfs_to(cur_location) clean_location.copy_turfs_to(cur_location)
//drop some random river nodes //drop some random river nodes
var/list/river_nodes = list() var/list/river_nodes = list()
var/max = rand(1,3) var/max = rand(1,3)
var/num_spawned = 0 var/num_spawned = 0
while(num_spawned < max) while(num_spawned < max)
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z) var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
if(!istype(J)) if(!istype(J))
continue continue
if(!J.bushes_spawn) if(!J.bushes_spawn)
continue continue
river_nodes.Add(new /obj/effect/landmark/river_waypoint(J)) river_nodes.Add(new /obj/effect/landmark/river_waypoint(J))
num_spawned++ num_spawned++
//make some randomly pathing rivers //make some randomly pathing rivers
for(var/obj/effect/landmark/river_waypoint/W in world) for(var/obj/effect/landmark/river_waypoint/W in world)
if (W.z != src.z || W.connected) if (W.z != src.z || W.connected)
continue continue
W.connected = 1 W.connected = 1
var/turf/cur_turf = new /turf/unsimulated/jungle/water(get_turf(W)) var/turf/cur_turf = new /turf/unsimulated/jungle/water(get_turf(W))
var/turf/target_turf = get_turf(pick(river_nodes)) var/turf/target_turf = get_turf(pick(river_nodes))
var/detouring = 0 var/detouring = 0
var/cur_dir = get_dir(cur_turf, target_turf) var/cur_dir = get_dir(cur_turf, target_turf)
// //
while(cur_turf != target_turf) while(cur_turf != target_turf)
//randomly snake around a bit //randomly snake around a bit
if(detouring) if(detouring)
if(prob(20)) if(prob(20))
detouring = 0
cur_dir = get_dir(cur_turf, target_turf)
else if(prob(20))
detouring = 1
if(prob(50))
cur_dir = turn(cur_dir, 45)
else
cur_dir = turn(cur_dir, -45)
else
cur_dir = get_dir(cur_turf, target_turf)
cur_turf = get_step(cur_turf, cur_dir)
var/skip = 0
if(!istype(cur_turf, /turf/unsimulated/jungle) || istype(cur_turf, /turf/unsimulated/jungle/rock))
detouring = 0 detouring = 0
cur_dir = get_dir(cur_turf, target_turf) cur_dir = get_dir(cur_turf, target_turf)
cur_turf = get_step(cur_turf, cur_dir) else if(prob(20))
continue detouring = 1
if(prob(50))
if(!skip) cur_dir = turn(cur_dir, 45)
var/turf/unsimulated/jungle/water/water_turf = new(cur_turf)
water_turf.Spread(75, rand(65, 25))
var/list/path_nodes = list()
//place some ladders leading down to pre-generated temples
max = rand(2,5)
num_spawned = 0
while(num_spawned < max)
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
if(!J || !J.bushes_spawn)
continue
new /obj/effect/landmark/temple(J)
path_nodes.Add(new /obj/effect/landmark/path_waypoint(J))
num_spawned++
//put a native tribe somewhere
num_spawned = 0
while(num_spawned < 1)
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
if(!J || !J.bushes_spawn)
continue
new /obj/effect/jungle_tribe_spawn(J)
path_nodes.Add(new /obj/effect/landmark/path_waypoint(J))
num_spawned++
//place some random path waypoints to confuse players
max = rand(1,3)
num_spawned = 0
while(num_spawned < max)
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
if(!J || !J.bushes_spawn)
continue
path_nodes.Add(new /obj/effect/landmark/path_waypoint(J))
num_spawned++
//get any path nodes placed on the map
for(var/obj/effect/landmark/path_waypoint/W in world)
if (W.z == src.z)
path_nodes.Add(W)
//make random, connecting paths
for(var/obj/effect/landmark/path_waypoint/W in path_nodes)
if (W.connected)
continue
W.connected = 1
var/turf/cur_turf = get_turf(W)
path_nodes.Remove(W)
var/turf/target_turf = get_turf(pick(path_nodes))
path_nodes.Add(W)
//
cur_turf = new /turf/unsimulated/jungle/path(cur_turf)
var/detouring = 0
var/cur_dir = get_dir(cur_turf, target_turf)
//
while(cur_turf != target_turf)
//randomly snake around a bit
if(detouring)
if(prob(20) || get_dist(cur_turf, target_turf) < 5)
detouring = 0
cur_dir = get_dir(cur_turf, target_turf)
else if(prob(20) && get_dist(cur_turf, target_turf) > 5)
detouring = 1
if(prob(50))
cur_dir = turn(cur_dir, 45)
else
cur_dir = turn(cur_dir, -45)
else else
cur_dir = get_dir(cur_turf, target_turf) cur_dir = turn(cur_dir, -45)
else
cur_dir = get_dir(cur_turf, target_turf)
//move a step forward cur_turf = get_step(cur_turf, cur_dir)
var/skip = 0
if(!istype(cur_turf, /turf/unsimulated/jungle) || istype(cur_turf, /turf/unsimulated/jungle/rock))
detouring = 0
cur_dir = get_dir(cur_turf, target_turf)
cur_turf = get_step(cur_turf, cur_dir) cur_turf = get_step(cur_turf, cur_dir)
continue
//if we're not a jungle turf, get back to what we were doing if(!skip)
if(!istype(cur_turf, /turf/unsimulated/jungle/)) var/turf/unsimulated/jungle/water/water_turf = new(cur_turf)
water_turf.Spread(75, rand(65, 25))
var/list/path_nodes = list()
//place some ladders leading down to pre-generated temples
max = rand(2,5)
num_spawned = 0
while(num_spawned < max)
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
if(!J || !J.bushes_spawn)
continue
new /obj/effect/landmark/temple(J)
path_nodes.Add(new /obj/effect/landmark/path_waypoint(J))
num_spawned++
//put a native tribe somewhere
num_spawned = 0
while(num_spawned < 1)
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
if(!J || !J.bushes_spawn)
continue
new /obj/effect/jungle_tribe_spawn(J)
path_nodes.Add(new /obj/effect/landmark/path_waypoint(J))
num_spawned++
//place some random path waypoints to confuse players
max = rand(1,3)
num_spawned = 0
while(num_spawned < max)
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
if(!J || !J.bushes_spawn)
continue
path_nodes.Add(new /obj/effect/landmark/path_waypoint(J))
num_spawned++
//get any path nodes placed on the map
for(var/obj/effect/landmark/path_waypoint/W in world)
if (W.z == src.z)
path_nodes.Add(W)
//make random, connecting paths
for(var/obj/effect/landmark/path_waypoint/W in path_nodes)
if (W.connected)
continue
W.connected = 1
var/turf/cur_turf = get_turf(W)
path_nodes.Remove(W)
var/turf/target_turf = get_turf(pick(path_nodes))
path_nodes.Add(W)
//
cur_turf = new /turf/unsimulated/jungle/path(cur_turf)
var/detouring = 0
var/cur_dir = get_dir(cur_turf, target_turf)
//
while(cur_turf != target_turf)
//randomly snake around a bit
if(detouring)
if(prob(20) || get_dist(cur_turf, target_turf) < 5)
detouring = 0
cur_dir = get_dir(cur_turf, target_turf) cur_dir = get_dir(cur_turf, target_turf)
cur_turf = get_step(cur_turf, cur_dir) else if(prob(20) && get_dist(cur_turf, target_turf) > 5)
continue detouring = 1
if(prob(50))
cur_dir = turn(cur_dir, 45)
else
cur_dir = turn(cur_dir, -45)
else
cur_dir = get_dir(cur_turf, target_turf)
var/turf/unsimulated/jungle/J = cur_turf //move a step forward
if(istype(J, /turf/unsimulated/jungle/impenetrable) || istype(J, /turf/unsimulated/jungle/water/deep)) cur_turf = get_step(cur_turf, cur_dir)
cur_dir = get_dir(cur_turf, target_turf)
cur_turf = get_step(cur_turf, cur_dir)
continue
if(!istype(J, /turf/unsimulated/jungle/water)) //if we're not a jungle turf, get back to what we were doing
J = new /turf/unsimulated/jungle/path(cur_turf) if(!istype(cur_turf, /turf/unsimulated/jungle/))
J.Spread(PATH_SPREAD_CHANCE_START, rand(PATH_SPREAD_CHANCE_LOSS_UPPER, PATH_SPREAD_CHANCE_LOSS_LOWER)) cur_dir = get_dir(cur_turf, target_turf)
cur_turf = get_step(cur_turf, cur_dir)
//create monkey spawners
num_spawned = 0
max = rand(3,6)
while(num_spawned < max)
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
if(!J || !J.bushes_spawn)
continue continue
animal_spawners.Add(new /obj/effect/landmark/animal_spawner/monkey(J))
num_spawned++
//create panther spawners var/turf/unsimulated/jungle/J = cur_turf
num_spawned = 0 if(istype(J, /turf/unsimulated/jungle/impenetrable) || istype(J, /turf/unsimulated/jungle/water/deep))
max = rand(6,12) cur_dir = get_dir(cur_turf, target_turf)
while(num_spawned < max) cur_turf = get_step(cur_turf, cur_dir)
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
if(!J || !istype(J) || !J.bushes_spawn)
continue continue
animal_spawners.Add(new /obj/effect/landmark/animal_spawner/panther(J))
num_spawned++
//create snake spawners if(!istype(J, /turf/unsimulated/jungle/water))
num_spawned = 0 J = new /turf/unsimulated/jungle/path(cur_turf)
max = rand(6,12) J.Spread(PATH_SPREAD_CHANCE_START, rand(PATH_SPREAD_CHANCE_LOSS_UPPER, PATH_SPREAD_CHANCE_LOSS_LOWER))
while(num_spawned < max)
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
if(!J || !istype(J) || !J.bushes_spawn)
continue
animal_spawners.Add(new /obj/effect/landmark/animal_spawner/snake(J))
num_spawned++
//create parrot spawners //create monkey spawners
num_spawned = 0 num_spawned = 0
max = rand(3,6) max = rand(3,6)
while(num_spawned < max) while(num_spawned < max)
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z) var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
if(!J || !istype(J) || !J.bushes_spawn) if(!J || !J.bushes_spawn)
continue continue
animal_spawners.Add(new /obj/effect/landmark/animal_spawner/parrot(J)) animal_spawners.Add(new /obj/effect/landmark/animal_spawner/monkey(J))
num_spawned++ num_spawned++
//create panther spawners
num_spawned = 0
max = rand(6,12)
while(num_spawned < max)
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
if(!J || !istype(J) || !J.bushes_spawn)
continue
animal_spawners.Add(new /obj/effect/landmark/animal_spawner/panther(J))
num_spawned++
//create snake spawners
num_spawned = 0
max = rand(6,12)
while(num_spawned < max)
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
if(!J || !istype(J) || !J.bushes_spawn)
continue
animal_spawners.Add(new /obj/effect/landmark/animal_spawner/snake(J))
num_spawned++
//create parrot spawners
num_spawned = 0
max = rand(3,6)
while(num_spawned < max)
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
if(!J || !istype(J) || !J.bushes_spawn)
continue
animal_spawners.Add(new /obj/effect/landmark/animal_spawner/parrot(J))
num_spawned++
#undef PATH_SPREAD_CHANCE_START #undef PATH_SPREAD_CHANCE_START
#undef PATH_SPREAD_CHANCE_LOSS_UPPER #undef PATH_SPREAD_CHANCE_LOSS_UPPER

View File

@@ -163,11 +163,11 @@ Deuterium-tritium fusion: 4.5 x 10^7 K
React() React()
//forcibly radiate any excess energy //forcibly radiate any excess energy
var/energy_max = transfer_ratio * 100000 /*var/energy_max = transfer_ratio * 100000
if(mega_energy > energy_max) if(mega_energy > energy_max)
var/energy_lost = rand( 1.5 * (mega_energy - energy_max), 2.5 * (mega_energy - energy_max) ) var/energy_lost = rand( 1.5 * (mega_energy - energy_max), 2.5 * (mega_energy - energy_max) )
mega_energy -= energy_lost mega_energy -= energy_lost
radiation += energy_lost radiation += energy_lost*/
//change held plasma temp according to energy levels //change held plasma temp according to energy levels
//SPECIFIC_HEAT_TOXIN //SPECIFIC_HEAT_TOXIN
@@ -200,12 +200,14 @@ Deuterium-tritium fusion: 4.5 x 10^7 K
//held_plasma.update_values() //held_plasma.update_values()
//handle some reactants formatting //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) for(var/reactant in dormant_reactant_quantities)
if(!dormant_reactant_quantities[reactant]) var/amount = dormant_reactant_quantities[reactant]
if(amount < 1)
dormant_reactant_quantities.Remove(reactant) dormant_reactant_quantities.Remove(reactant)
else if(amount >= 1000000)
var/radiate = rand(3 * amount / 4, amount / 4)
dormant_reactant_quantities[reactant] -= radiate
radiation += radiate
return 1 return 1
@@ -236,6 +238,10 @@ Deuterium-tritium fusion: 4.5 x 10^7 K
energy += a_energy - a_energy * energy_loss_ratio energy += a_energy - a_energy * energy_loss_ratio
mega_energy += a_mega_energy - a_mega_energy * energy_loss_ratio mega_energy += a_mega_energy - a_mega_energy * energy_loss_ratio
while(energy > 100000)
energy -= 100000
mega_energy += 0.1
/obj/effect/rust_em_field/proc/AddParticles(var/name, var/quantity = 1) /obj/effect/rust_em_field/proc/AddParticles(var/name, var/quantity = 1)
if(name in dormant_reactant_quantities) if(name in dormant_reactant_quantities)
dormant_reactant_quantities[name] += quantity dormant_reactant_quantities[name] += quantity
@@ -296,9 +302,7 @@ Deuterium-tritium fusion: 4.5 x 10^7 K
return changed return changed
//the !!fun!! part //the !!fun!! part
//reactions have to be individually hardcoded, see AttemptReaction() below this
/obj/effect/rust_em_field/proc/React() /obj/effect/rust_em_field/proc/React()
//world << "React()"
//loop through the reactants in random order //loop through the reactants in random order
var/list/reactants_reacting_pool = dormant_reactant_quantities.Copy() var/list/reactants_reacting_pool = dormant_reactant_quantities.Copy()
/* /*
@@ -316,8 +320,8 @@ Deuterium-tritium fusion: 4.5 x 10^7 K
if(!reactants_reacting_pool[reactant]) if(!reactants_reacting_pool[reactant])
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 //loop through all the reacting reagents, picking out random reactions for them
var/list/produced_reactants = new/list
var/list/primary_reactant_pool = reactants_reacting_pool.Copy() var/list/primary_reactant_pool = reactants_reacting_pool.Copy()
while(primary_reactant_pool.len) while(primary_reactant_pool.len)
//pick one of the unprocessed reacting reagents randomly //pick one of the unprocessed reacting reagents randomly
@@ -331,95 +335,80 @@ Deuterium-tritium fusion: 4.5 x 10^7 K
possible_secondary_reactants[cur_primary_reactant] -= 1 possible_secondary_reactants[cur_primary_reactant] -= 1
if(possible_secondary_reactants[cur_primary_reactant] < 1) if(possible_secondary_reactants[cur_primary_reactant] < 1)
possible_secondary_reactants.Remove(cur_primary_reactant) possible_secondary_reactants.Remove(cur_primary_reactant)
var/list/possible_reactions = new/list
//loop through and work out all the possible reactions //loop through and work out all the possible reactions
while(possible_secondary_reactants.len) var/list/possible_reactions = new/list
var/cur_secondary_reactant = pick(possible_secondary_reactants) for(var/cur_secondary_reactant in possible_secondary_reactants)
if(possible_secondary_reactants[cur_secondary_reactant] < 1) if(possible_secondary_reactants[cur_secondary_reactant] < 1)
possible_secondary_reactants.Remove(cur_secondary_reactant)
continue continue
possible_secondary_reactants.Remove(cur_secondary_reactant) var/datum/fusion_reaction/cur_reaction = get_fusion_reaction(cur_primary_reactant, cur_secondary_reactant)
var/list/reaction_products = AttemptReaction(cur_primary_reactant, cur_secondary_reactant) if(cur_reaction)
if(reaction_products.len)
//world << "\blue secondary reactant: [cur_secondary_reactant], [reaction_products.len]" //world << "\blue secondary reactant: [cur_secondary_reactant], [reaction_products.len]"
possible_reactions[cur_secondary_reactant] = reaction_products possible_reactions.Add(cur_reaction)
//if there are no possible reactions here, abandon this primary reactant and move on //if there are no possible reactions here, abandon this primary reactant and move on
if(!possible_reactions.len) if(!possible_reactions.len)
//world << "\blue no reactions" //world << "\blue no reactions"
continue continue
//split up the reacting atoms between the possible reactions //split up the reacting atoms between the possible reactions
//the problem is in this while statement below
while(possible_reactions.len) while(possible_reactions.len)
//pick another substance to react with //pick a random substance to react with
var/cur_secondary_reactant = pick(possible_reactions) var/datum/fusion_reaction/cur_reaction = pick(possible_reactions)
if(!reactants_reacting_pool[cur_secondary_reactant]) possible_reactions.Remove(cur_reaction)
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 //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] var/max_num_reactants = reactants_reacting_pool[cur_reaction.primary_reactant] > reactants_reacting_pool[cur_reaction.secondary_reactant] ? \
reactants_reacting_pool[cur_reaction.secondary_reactant] : reactants_reacting_pool[cur_reaction.primary_reactant]
if(max_num_reactants < 1)
continue
//make sure we have enough energy //make sure we have enough energy
if( mega_energy < max_num_reactants*cur_reaction_products["consumption"]) if(mega_energy < max_num_reactants * cur_reaction.energy_consumption)
max_num_reactants = round(mega_energy / cur_reaction_products["consumption"]) max_num_reactants = round(mega_energy / cur_reaction.energy_consumption)
if(max_num_reactants < 1)
continue
//randomly determined amount to react //randomly determined amount to react
var/amount_reacting = rand(1, max_num_reactants) var/amount_reacting = rand(1, max_num_reactants)
//removing the reacting substances from the list of substances that are primed to react this cycle //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 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 ) if( reactants_reacting_pool[cur_reaction.primary_reactant] - amount_reacting >= 0 )
reactants_reacting_pool[cur_primary_reactant] -= amount_reacting reactants_reacting_pool[cur_reaction.primary_reactant] -= amount_reacting
else else
amount_reacting = reactants_reacting_pool[cur_primary_reactant] amount_reacting = reactants_reacting_pool[cur_reaction.primary_reactant]
reactants_reacting_pool[cur_primary_reactant] = 0 reactants_reacting_pool[cur_reaction.primary_reactant] = 0
// //same again for secondary reactant
if( reactants_reacting_pool[cur_secondary_reactant] - amount_reacting > -1 ) if( reactants_reacting_pool[cur_reaction.secondary_reactant] - amount_reacting >= 0 )
reactants_reacting_pool[cur_secondary_reactant] -= amount_reacting reactants_reacting_pool[cur_reaction.secondary_reactant] -= amount_reacting
else else
reactants_reacting_pool[cur_primary_reactant] += amount_reacting - reactants_reacting_pool[cur_primary_reactant] reactants_reacting_pool[cur_reaction.primary_reactant] += amount_reacting - reactants_reacting_pool[cur_reaction.primary_reactant]
amount_reacting = reactants_reacting_pool[cur_secondary_reactant] amount_reacting = reactants_reacting_pool[cur_reaction.secondary_reactant]
reactants_reacting_pool[cur_secondary_reactant] = 0 reactants_reacting_pool[cur_reaction.secondary_reactant] = 0
//remove the consumed energy //remove the consumed energy
if(cur_reaction_products["consumption"]) mega_energy -= max_num_reactants * cur_reaction.energy_consumption
mega_energy -= max_num_reactants * cur_reaction_products["consumption"]
cur_reaction_products.Remove("consumption")
//grab any radiation and put it separate //add any produced energy
//var/new_radiation = 0 mega_energy += max_num_reactants * cur_reaction.energy_production
if("production" in cur_reaction_products)
mega_energy += max_num_reactants * cur_reaction_products["production"] //add any produced radiation
cur_reaction_products.Remove("production") radiation += max_num_reactants * cur_reaction.radiation
/*for(var/i=0, i<dormant_reactant_quantities["proton_quantity"], i++)
radiation.Add("proton")
radiation_charge.Add(dormant_reactant_quantities["proton_charge"])
dormant_reactant_quantities.Remove("proton_quantity")
dormant_reactant_quantities.Remove("proton_charge")
new_radiation = 1*/
//
if("radiation" in cur_reaction_products)
radiation += max_num_reactants * cur_reaction_products["radiation"]
cur_reaction_products.Remove("radiation")
/*for(var/i=0, i<dormant_reactant_quantities["neutron_quantity"], i++)
radiation.Add("neutron")
radiation_charge.Add(dormant_reactant_quantities["neutron_charge"])
dormant_reactant_quantities.Remove("neutron_quantity")
dormant_reactant_quantities.Remove("neutron_charge")
new_radiation = 1*/
//create the reaction products //create the reaction products
for(var/reactant in cur_reaction_products) for(var/reactant in cur_reaction.products)
if(produced_reactants[reactant]) var/success = 0
produced_reactants[reactant] += cur_reaction_products[reactant] * amount_reacting for(var/check_reactant in produced_reactants)
else if(check_reactant == reactant)
produced_reactants[reactant] = cur_reaction_products[reactant] * amount_reacting produced_reactants[reactant] += cur_reaction.products[reactant] * amount_reacting
success = 1
break
if(!success)
produced_reactants[reactant] = cur_reaction.products[reactant] * amount_reacting
//this reaction is done, and can't be repeated this sub-cycle //this reaction is done, and can't be repeated this sub-cycle
possible_reactions.Remove(cur_secondary_reactant) possible_reactions.Remove(cur_reaction.secondary_reactant)
// //
/*if(new_radiation) /*if(new_radiation)
@@ -431,7 +420,7 @@ Deuterium-tritium fusion: 4.5 x 10^7 K
//var/list/neutronic_radiation = new //var/list/neutronic_radiation = new
//var/list/protonic_radiation = new //var/list/protonic_radiation = new
for(var/reactant in produced_reactants) for(var/reactant in produced_reactants)
AddParticles(reactant, dormant_reactant_quantities[reactant]) AddParticles(reactant, produced_reactants[reactant])
//world << "produced: [reactant], [dormant_reactant_quantities[reactant]]" //world << "produced: [reactant], [dormant_reactant_quantities[reactant]]"
//check whether there are reactants left, and add them back to the pool //check whether there are reactants left, and add them back to the pool
@@ -439,213 +428,6 @@ Deuterium-tritium fusion: 4.5 x 10^7 K
AddParticles(reactant, reactants_reacting_pool[reactant]) AddParticles(reactant, reactants_reacting_pool[reactant])
//world << "retained: [reactant], [reactants_reacting_pool[reactant]]" //world << "retained: [reactant], [reactants_reacting_pool[reactant]]"
//default fuel assembly quantities
/*
//new_assembly_quantities["Helium-3"] = 0
//new_assembly_quantities["Deuterium"] = 200
//new_assembly_quantities["Tritium"] = 100
//new_assembly_quantities["Lithium-6"] = 0
//new_assembly_quantities["Silver"] = 0
*/
//reactions involving D-T (hydrogen) need 0.1 MeV of core energy
//reactions involving helium require 0.4 MeV of energy
//reactions involving lithium require 0.6 MeV of energy
//reactions involving boron require 1 MeV of energy
//returns a list of products, or an empty list if no reaction possible
/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"] = 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["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
/obj/effect/rust_em_field/Del() /obj/effect/rust_em_field/Del()
//radiate everything in one giant burst //radiate everything in one giant burst
for(var/obj/effect/rust_particle_catcher/catcher in particle_catchers) for(var/obj/effect/rust_particle_catcher/catcher in particle_catchers)

View File

@@ -282,6 +282,6 @@ max volume of plasma storeable by the field = the total volume of a number of ti
return 0 return 0
/obj/machinery/power/rust_core/bullet_act(var/obj/item/projectile/Proj) /obj/machinery/power/rust_core/bullet_act(var/obj/item/projectile/Proj)
if(Proj.flag != "bullet" && owned_field) if(owned_field)
owned_field.AddEnergy(Proj.damage, 0, 1) return owned_field.bullet_act(Proj)
return 0 return 0

View File

@@ -5,6 +5,7 @@
name = "Fuel Rod Assembly" name = "Fuel Rod Assembly"
var/list/rod_quantities var/list/rod_quantities
var/percent_depleted = 1 var/percent_depleted = 1
layer = 3.1
// //
New() New()
rod_quantities = new/list rod_quantities = new/list

View File

@@ -64,14 +64,14 @@
/obj/machinery/rust_fuel_assembly_port/proc/eject_assembly() /obj/machinery/rust_fuel_assembly_port/proc/eject_assembly()
if(cur_assembly) if(cur_assembly)
cur_assembly.loc = get_step(get_turf(src), src.dir) cur_assembly.loc = src.loc//get_step(get_turf(src), src.dir)
cur_assembly = null cur_assembly = null
icon_state = "port0" icon_state = "port0"
return 1 return 1
/obj/machinery/rust_fuel_assembly_port/proc/try_draw_assembly() /obj/machinery/rust_fuel_assembly_port/proc/try_draw_assembly()
var/success = 0 var/success = 0
if(cur_assembly) if(!cur_assembly)
var/turf/check_turf = get_step(get_turf(src), src.dir) var/turf/check_turf = get_step(get_turf(src), src.dir)
check_turf = get_step(check_turf, src.dir) check_turf = get_step(check_turf, src.dir)
for(var/obj/machinery/power/rust_fuel_injector/I in check_turf) for(var/obj/machinery/power/rust_fuel_injector/I in check_turf)
@@ -89,31 +89,14 @@
I.cur_assembly = null I.cur_assembly = null
icon_state = "port1" icon_state = "port1"
success = 1 success = 1
break
return success 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() /obj/machinery/rust_fuel_assembly_port/verb/eject_assembly_verb()
set name = "Attempt to eject assembly from port" set name = "Eject assembly from port"
set category = "Object" set category = "Object"
set src in oview(1) set src in oview(1)
if(!busy) eject_assembly()
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()
*/

View File

@@ -4,7 +4,7 @@ var/const/max_assembly_amount = 300
icon = 'code/WorkInProgress/Cael_Aislinn/Rust/rust.dmi' icon = 'code/WorkInProgress/Cael_Aislinn/Rust/rust.dmi'
icon_state = "fuel_compressor1" icon_state = "fuel_compressor1"
name = "Fuel Compressor" name = "Fuel Compressor"
var/list/new_assembly_quantities = list("Deuterium" = 200,"Tritium" = 100,"Helium-3" = 0,"Lithium-6" = 0,"Silver" = 0) var/list/new_assembly_quantities = list("Deuterium" = 150,"Tritium" = 150,"Rodinium-6" = 0,"Stravium-7" = 0, "Pergium" = 0, "Dilithium" = 0)
var/compressed_matter = 0 var/compressed_matter = 0
anchored = 1 anchored = 1
layer = 2.9 layer = 2.9
@@ -79,12 +79,16 @@ var/const/max_assembly_amount = 300
var/fail = 0 var/fail = 0
var/old_matter = compressed_matter var/old_matter = compressed_matter
for(var/reagent in new_assembly_quantities) for(var/reagent in new_assembly_quantities)
var/req_matter = new_assembly_quantities[reagent] / 30 var/req_matter = round(new_assembly_quantities[reagent] / 30)
//world << "[reagent] matter: [req_matter]/[compressed_matter]" //world << "[reagent] matter: [req_matter]/[compressed_matter]"
if(req_matter <= compressed_matter) if(req_matter <= compressed_matter)
F.rod_quantities[reagent] = new_assembly_quantities[reagent] F.rod_quantities[reagent] = new_assembly_quantities[reagent]
compressed_matter -= req_matter compressed_matter -= req_matter
if(compressed_matter < 1)
compressed_matter = 0
else else
/*world << "bad reagent: [reagent], [req_matter > compressed_matter ? "req_matter > compressed_matter"\
: (req_matter < compressed_matter ? "req_matter < compressed_matter" : "req_matter == compressed_matter")]"*/
fail = 1 fail = 1
break break
//world << "\blue [reagent]: new_assembly_quantities[reagent]<br>" //world << "\blue [reagent]: new_assembly_quantities[reagent]<br>"
@@ -93,7 +97,7 @@ var/const/max_assembly_amount = 300
compressed_matter = old_matter compressed_matter = old_matter
usr << "\red \icon[src] [src] flashes red: \'Out of matter.\'" usr << "\red \icon[src] [src] flashes red: \'Out of matter.\'"
else else
F.loc = get_step(get_turf(src), src.dir) F.loc = src.loc//get_step(get_turf(src), src.dir)
F.percent_depleted = 0 F.percent_depleted = 0
if(compressed_matter < 0.034) if(compressed_matter < 0.034)
compressed_matter = 0 compressed_matter = 0

View File

@@ -179,11 +179,7 @@
id_tag = input("Enter new ID tag", "Modifying ID tag") as text|null id_tag = input("Enter new ID tag", "Modifying ID tag") as text|null
if( href_list["fuel_assembly"] ) if( href_list["fuel_assembly"] )
if(!trying_to_swap_fuel) attempt_fuel_swap()
trying_to_swap_fuel = 1
spawn(50)
attempt_fuel_swap()
trying_to_swap_fuel = 0
if( href_list["emergency_fuel_assembly"] ) if( href_list["emergency_fuel_assembly"] )
if(cur_assembly) if(cur_assembly)
@@ -290,3 +286,23 @@
updateDialog() updateDialog()
else else
src.visible_message("\red \icon[src] a red light flashes on [src].") src.visible_message("\red \icon[src] a red light flashes on [src].")
/obj/machinery/power/rust_fuel_injector/verb/rotate_clock()
set category = "Object"
set name = "Rotate Generator (Clockwise)"
set src in view(1)
if (usr.stat || usr.restrained() || anchored)
return
src.dir = turn(src.dir, 90)
/obj/machinery/power/rust_fuel_injector/verb/rotate_anticlock()
set category = "Object"
set name = "Rotate Generator (Counterclockwise)"
set src in view(1)
if (usr.stat || usr.restrained() || anchored)
return
src.dir = turn(src.dir, -90)

View File

@@ -0,0 +1,160 @@
datum/fusion_reaction
var/primary_reactant = ""
var/secondary_reactant = ""
var/energy_consumption = 0
var/energy_production = 0
var/radiation = 0
var/list/products = list()
/datum/controller/game_controller/var/list/fusion_reactions
proc/get_fusion_reaction(var/primary_reactant, var/secondary_reactant)
if(!master_controller.fusion_reactions)
populate_fusion_reactions()
if(master_controller.fusion_reactions.Find(primary_reactant))
var/list/secondary_reactions = master_controller.fusion_reactions[primary_reactant]
if(secondary_reactions.Find(secondary_reactant))
return master_controller.fusion_reactions[primary_reactant][secondary_reactant]
proc/populate_fusion_reactions()
if(!master_controller.fusion_reactions)
master_controller.fusion_reactions = list()
for(var/cur_reaction_type in typesof(/datum/fusion_reaction) - /datum/fusion_reaction)
var/datum/fusion_reaction/cur_reaction = new cur_reaction_type()
if(!master_controller.fusion_reactions[cur_reaction.primary_reactant])
master_controller.fusion_reactions[cur_reaction.primary_reactant] = list()
master_controller.fusion_reactions[cur_reaction.primary_reactant][cur_reaction.secondary_reactant] = cur_reaction
if(!master_controller.fusion_reactions[cur_reaction.secondary_reactant])
master_controller.fusion_reactions[cur_reaction.secondary_reactant] = list()
master_controller.fusion_reactions[cur_reaction.secondary_reactant][cur_reaction.primary_reactant] = cur_reaction
//Fake elements and fake reactions, but its nicer gameplay-wise
//Deuterium
//Tritium
//Uridium-3
//Obdurium
//Solonium
//Rodinium-6
//Dilithium
//Trilithium
//Pergium
//Stravium-7
//Primary Production Reactions
datum/fusion_reaction/tritium_deuterium
primary_reactant = "Tritium"
secondary_reactant = "Deuterium"
energy_consumption = 1
energy_production = 5
radiation = 0
//Secondary Production Reactions
datum/fusion_reaction/deuterium_deuterium
primary_reactant = "Deuterium"
secondary_reactant = "Deuterium"
energy_consumption = 1
energy_production = 4
radiation = 1
products = list("Obdurium" = 2)
datum/fusion_reaction/tritium_tritium
primary_reactant = "Tritium"
secondary_reactant = "Tritium"
energy_consumption = 1
energy_production = 4
radiation = 1
products = list("Solonium" = 2)
//Cleanup Reactions
datum/fusion_reaction/rodinium6_obdurium
primary_reactant = "Rodinium-6"
secondary_reactant = "Obdurium"
energy_consumption = 1
energy_production = 2
radiation = 2
datum/fusion_reaction/rodinium6_solonium
primary_reactant = "Rodinium-6"
secondary_reactant = "Solonium"
energy_consumption = 1
energy_production = 2
radiation = 2
//Breeder Reactions
datum/fusion_reaction/dilithium_obdurium
primary_reactant = "Dilithium"
secondary_reactant = "Obdurium"
energy_consumption = 1
energy_production = 1
radiation = 3
products = list("Deuterium" = 1, "Dilithium" = 1)
datum/fusion_reaction/dilithium_solonium
primary_reactant = "Dilithium"
secondary_reactant = "Solonium"
energy_consumption = 1
energy_production = 1
radiation = 3
products = list("Tritium" = 1, "Dilithium" = 1)
//Breeder Inhibitor Reactions
datum/fusion_reaction/stravium7_dilithium
primary_reactant = "Stravium-7"
secondary_reactant = "Dilithium"
energy_consumption = 2
energy_production = 1
radiation = 4
//Enhanced Breeder Reactions
datum/fusion_reaction/trilithium_obdurium
primary_reactant = "Trilithium"
secondary_reactant = "Obdurium"
energy_consumption = 1
energy_production = 2
radiation = 5
products = list("Dilithium" = 1, "Trilithium" = 1, "Deuterium" = 1)
datum/fusion_reaction/trilithium_solonium
primary_reactant = "Trilithium"
secondary_reactant = "Solonium"
energy_consumption = 1
energy_production = 2
radiation = 5
products = list("Dilithium" = 1, "Trilithium" = 1, "Tritium" = 1)
//Control Reactions
datum/fusion_reaction/pergium_deuterium
primary_reactant = "Pergium"
secondary_reactant = "Deuterium"
energy_consumption = 5
energy_production = 0
radiation = 5
datum/fusion_reaction/pergium_tritium
primary_reactant = "Pergium"
secondary_reactant = "Tritium"
energy_consumption = 5
energy_production = 0
radiation = 5
datum/fusion_reaction/pergium_deuterium
primary_reactant = "Pergium"
secondary_reactant = "Obdurium"
energy_consumption = 5
energy_production = 0
radiation = 5
datum/fusion_reaction/pergium_tritium
primary_reactant = "Pergium"
secondary_reactant = "Solonium"
energy_consumption = 5
energy_production = 0
radiation = 5

View File

@@ -34,16 +34,16 @@
/obj/effect/rust_particle_catcher/proc/UpdateSize() /obj/effect/rust_particle_catcher/proc/UpdateSize()
if(parent.size >= mysize) if(parent.size >= mysize)
density = 1 density = 1
invisibility = 0 //invisibility = 0
name = "collector [mysize] ON" name = "collector [mysize] ON"
else else
density = 0 density = 0
invisibility = 101 //invisibility = 101
name = "collector [mysize] OFF" name = "collector [mysize] OFF"
/obj/effect/rust_particle_catcher/bullet_act(var/obj/item/projectile/Proj) /obj/effect/rust_particle_catcher/bullet_act(var/obj/item/projectile/Proj)
if(Proj.flag != "bullet" && parent) if(Proj.flag != "bullet" && parent)
parent.AddEnergy(Proj.damage, 0, 1) parent.AddEnergy(Proj.damage * 20, 0, 1)
update_icon() update_icon()
return 0 return 0

View File

@@ -0,0 +1,117 @@
// This system defines news that will be displayed in the course of a round.
// Uses BYOND's type system to put everything into a nice format
/datum/news_announcement
var
round_time // time of the round at which this should be announced, in seconds
message // body of the message
author = "NanoTrasen Editor"
channel_name = "Tau Ceti Daily"
can_be_redacted = 0
revolution_inciting_event
paycuts_suspicion
round_time = 60*10
message = "Reports have leaked that Nanotrasen Inc. is planning to put paycuts into effect on many of its Research Stations in Tau Ceti. Apparently these research stations haven't been able to yield the expected revenue, and thus adjustments have to be made."
author = "Unauthorized"
paycuts_confirmation
round_time = 60*40
message = "Earlier rumours about paycuts on Research Stations in the Tau Ceti system have been confirmed. Shockingly, however, the cuts will only affect lower tier personnel. Heads of Staff will, according to our sources, not be affected."
author = "Unauthorized"
human_experiments
round_time = 60*90
message = "Unbelievable reports about human experimentation have reached our ears. According to a refugee from one of the Tau Ceti Research Stations, their station, in order to increase revenue, has refactored several of their facilities to perform experiments on live humans, including virology research, genetic manipulation, and \"feeding them to the slimes to see what happens\". Allegedly, these test subjects were neither humanified monkeys nor volunteers, but rather unqualified staff that were forced into the experiments, and reported to have died in a \"work accident\" by Nanotrasen Inc."
author = "Unauthorized"
bluespace_research
announcement
round_time = 60*20
message = "The new field of research trying to explain several interesting spacetime oddities, also known as \"Bluespace Research\", has reached new heights. Of the several hundred space stations now orbiting in Tau Ceti, fifteen are now specially equipped to experiment with and research Bluespace effects. Rumours have it some of these stations even sport functional \"travel gates\" that can instantly move a whole research team to an alternate reality."
random_junk
cheesy_honkers
author = "Assistant Editor Carl Ritz"
channel_name = "The Gibson Gazzette"
message = "Do cheesy honkers increase risk of having a miscarriage? Several health administrations say so!"
round_time = 60 * 15
net_block
author = "Assistant Editor Carl Ritz"
channel_name = "The Gibson Gazzette"
message = "Several corporations banding together to block access to 'wetskrell.nt', site administrators claiming violation of net laws."
round_time = 60 * 50
found_ssd
channel_name = "Tau Ceti Daily"
author = "Doctor Eric Hanfield"
message = "Several people have been found unconscious at their terminals. It is thought that it was due to a lack of sleep or of simply migraines from staring at the screen too long. Camera footage reveals that many of them were playing games instead of working and their pay has been docked accordingly."
round_time = 60 * 90
lotus_tree
explosions
channel_name = "Tau Ceti Daily"
author = "Reporter Leland H. Howards"
message = "The newly-christened civillian transport Lotus Tree suffered two very large explosions near the bridge today, and there are unconfirmed reports that the death toll has passed 50. The cause of the explosions remain unknown, but there is speculation that it might have something to do with the recent change of regulation in the Moore-Lee Corporation, a major funder of the ship, when M-L announced that they were officially acknowledging inter-species marriage and providing couples with marriage tax-benefits."
round_time = 60 * 30
food_riots
breaking_news
channel_name = "Tau Ceti Daily"
author = "Reporter Ro'kii Ar-Raqis"
message = "Breaking news: Food riots have broken out throughout the Refuge asteroid colony in the Tenebrae Lupus system. This comes only hours after NanoTrasen officials announced they will no longer trade with the colony, citing the increased presence of \"hostile factions\" on the colony has made trade too dangerous to continue. NanoTrasen officials have not given any details about said factions. More on that at the top of the hour."
round_time = 60 * 10
more
channel_name = "Tau Ceti Daily"
author = "Reporter Ro'kii Ar-Raqis"
message = "More on the Refuge food riots: The Refuge Council has condemned NanoTrasen's withdrawal from the colony, claiming \"there has been no increase in anti-NanoTrasen activity\", and \"\[the only] reason NanoTrasen withdrew was because the \[Tenebrae Lupus] system's Plasma deposits have been completely mined out. We have little to trade with them now\". NanoTrasen officials have denied these allegations, calling them \"further proof\" of the colony's anti-NanoTrasen stance. Meanwhile, Refuge Security has been unable to quell the riots. More on this at 6."
round_time = 60 * 60
var/global/list/newscaster_standard_feeds = list(/datum/news_announcement/bluespace_research, /datum/news_announcement/lotus_tree, /datum/news_announcement/random_junk, /datum/news_announcement/lotus_tree)
proc/process_newscaster()
check_for_newscaster_updates(ticker.mode.newscaster_announcements)
var/global/tmp/announced_news_types = list()
proc/check_for_newscaster_updates(type)
for(var/subtype in typesof(type)-type)
var/datum/news_announcement/news = new subtype()
if(news.round_time * 10 <= world.time && !(subtype in announced_news_types))
announced_news_types += subtype
announce_newscaster_news(news)
proc/announce_newscaster_news(datum/news_announcement/news)
var/datum/feed_message/newMsg = new /datum/feed_message
newMsg.author = news.author
newMsg.is_admin_message = !news.can_be_redacted
newMsg.body = news.message
var/datum/feed_channel/sendto
for(var/datum/feed_channel/FC in news_network.network_channels)
if(FC.channel_name == news.channel_name)
sendto = FC
break
if(!sendto)
sendto = new /datum/feed_channel
sendto.channel_name = news.channel_name
sendto.author = news.author
sendto.locked = 1
sendto.is_admin_channel = 1
news_network.network_channels += sendto
sendto.messages += newMsg
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
NEWSCASTER.newsAlert(news.channel_name)

View File

@@ -21,6 +21,7 @@ connection
last_updated //The tick at which this was last updated. last_updated //The tick at which this was last updated.
no_zone_count = 0 no_zone_count = 0
New(turf/T,turf/O) New(turf/T,turf/O)
A = T A = T
B = O B = O
@@ -49,51 +50,23 @@ connection
if(A.CanPass(null, B, 0, 0)) if(A.CanPass(null, B, 0, 0))
if(!A.zone.connected_zones) ConnectZones(A.zone, B.zone, 1)
A.zone.connected_zones = list()
if(!B.zone.connected_zones)
B.zone.connected_zones = list()
if(B.zone in A.zone.connected_zones)
A.zone.connected_zones[B.zone]++
else
A.zone.connected_zones += B.zone
A.zone.connected_zones[B.zone] = 1
if(A.zone in B.zone.connected_zones)
B.zone.connected_zones[A.zone]++
else
B.zone.connected_zones += A.zone
B.zone.connected_zones[A.zone] = 1
if(A.HasDoor(B) || B.HasDoor(A)) if(A.HasDoor(B) || B.HasDoor(A))
indirect = CONNECTION_INDIRECT indirect = CONNECTION_INDIRECT
else else
ConnectZones(A.zone, B.zone)
indirect = CONNECTION_CLOSED indirect = CONNECTION_CLOSED
if(!A.zone.closed_connection_zones)
A.zone.closed_connection_zones = list()
if(B.zone in A.zone.closed_connection_zones)
A.zone.closed_connection_zones[B.zone]++
else
A.zone.closed_connection_zones += B.zone
A.zone.closed_connection_zones[B.zone] = 1
if(!B.zone.closed_connection_zones)
B.zone.closed_connection_zones = list()
if(A.zone in B.zone.closed_connection_zones)
B.zone.closed_connection_zones[A.zone]++
else
B.zone.closed_connection_zones += A.zone
B.zone.closed_connection_zones[A.zone] = 1
else else
world.log << "Attempted to create connection object for non-zone tiles: [T] -> [O]" world.log << "Attempted to create connection object for non-zone tiles: [T] ([T.x],[T.y],[T.z]) -> [O] ([O.x],[O.y],[O.z])"
del(src) del(src)
Del() Del()
//remove connections from master lists.
if(ref_B in air_master.turfs_with_connections) if(ref_B in air_master.turfs_with_connections)
var/list/connections = air_master.turfs_with_connections[ref_B] var/list/connections = air_master.turfs_with_connections[ref_B]
connections.Remove(src) connections.Remove(src)
@@ -102,279 +75,203 @@ connection
var/list/connections = air_master.turfs_with_connections[ref_A] var/list/connections = air_master.turfs_with_connections[ref_A]
connections.Remove(src) connections.Remove(src)
//Ensure we delete the right values by sanity checkign right before deletion.
Sanitize()
//Remove connection from current zones.
if(A) if(A)
if(A.zone && A.zone.connections) if(A.zone && A.zone.connections)
A.zone.connections.Remove(src) A.zone.connections.Remove(src)
if(!A.zone.connections.len) if(!A.zone.connections.len)
del A.zone.connections A.zone.connections = null
if(B) if(B)
if(B.zone && B.zone.connections) if(B.zone && B.zone.connections)
B.zone.connections.Remove(src) B.zone.connections.Remove(src)
if(!B.zone.connections.len) if(!B.zone.connections.len)
del B.zone.connections B.zone.connections = null
if(zone_A)
if(zone_A && zone_A.connections)
zone_A.connections.Remove(src)
if(!zone_A.connections.len)
del zone_A.connections
if(zone_B)
if(zone_B && zone_B.connections)
zone_B.connections.Remove(src)
if(!zone_B.connections.len)
del zone_B.connections
if(indirect != CONNECTION_CLOSED) //Disconnect zones while handling unusual conditions.
if(A && A.zone) // e.g. loss of a zone on a turf
if(B && B.zone) if(A && A.zone && B && B.zone)
if(B.zone in A.zone.connected_zones) DisconnectZones(A.zone, B.zone)
if(A.zone.connected_zones[B.zone] > 1)
A.zone.connected_zones[B.zone]-- //Finally, preform actual deletion.
else
A.zone.connected_zones -= B.zone
if(A.zone.connected_zones && !A.zone.connected_zones.len)
A.zone.connected_zones = null
if( zone_B && (!B.zone || zone_B != B.zone) )
if(zone_B in A.zone.connected_zones)
if(A.zone.connected_zones[zone_B] > 1)
A.zone.connected_zones[zone_B]--
else
A.zone.connected_zones -= zone_B
if(A.zone.connected_zones && !A.zone.connected_zones.len)
A.zone.connected_zones = null
if(zone_A && (!A.zone || zone_A != A.zone))
if(B && B.zone)
if(B.zone in zone_A.connected_zones)
if(zone_A.connected_zones[B.zone] > 1)
zone_A.connected_zones[B.zone]--
else
zone_A.connected_zones -= B.zone
if(zone_A.connected_zones && !zone_A.connected_zones.len)
zone_A.connected_zones = null
if( zone_B && (!B.zone || zone_B != B.zone) )
if(zone_B in zone_A.connected_zones)
if(zone_A.connected_zones[zone_B] > 1)
zone_A.connected_zones[zone_B]--
else
zone_A.connected_zones -= zone_B
if(zone_A.connected_zones && !zone_A.connected_zones.len)
zone_A.connected_zones = null
if(B && B.zone)
if(A && A.zone)
if(A.zone in B.zone.connected_zones)
if(B.zone.connected_zones[A.zone] > 1)
B.zone.connected_zones[A.zone]--
else
B.zone.connected_zones -= A.zone
if(B.zone.connected_zones && !B.zone.connected_zones.len)
B.zone.connected_zones = null
if( zone_A && (!A.zone || zone_A != A.zone) )
if(zone_A in B.zone.connected_zones)
if(B.zone.connected_zones[zone_A] > 1)
B.zone.connected_zones[zone_A]--
else
B.zone.connected_zones -= zone_A
if(B.zone.connected_zones && !B.zone.connected_zones.len)
B.zone.connected_zones = null
if(zone_B && (!B.zone || zone_B != B.zone))
if(A && A.zone)
if(A.zone in zone_B.connected_zones)
if(zone_B.connected_zones[A.zone] > 1)
zone_B.connected_zones[A.zone]--
else
zone_B.connected_zones -= A.zone
if(zone_B.connected_zones && !zone_B.connected_zones.len)
zone_B.connected_zones = null
if( zone_A && (!A.zone || zone_A != A.zone) )
if(zone_A in zone_B.connected_zones)
if(zone_B.connected_zones[zone_A] > 1)
zone_B.connected_zones[zone_A]--
else
zone_B.connected_zones -= zone_A
if(zone_B.connected_zones && !zone_B.connected_zones.len)
zone_B.connected_zones = null
else
if(A && A.zone)
if(B && B.zone)
if(B.zone in A.zone.closed_connection_zones)
if(A.zone.closed_connection_zones[B.zone] > 1)
A.zone.closed_connection_zones[B.zone]--
else
A.zone.closed_connection_zones -= B.zone
if(A.zone.closed_connection_zones && !A.zone.closed_connection_zones.len)
A.zone.closed_connection_zones = null
if( zone_B && (!B.zone || zone_B != B.zone) )
if(zone_B in A.zone.closed_connection_zones)
if(A.zone.closed_connection_zones[zone_B] > 1)
A.zone.closed_connection_zones[zone_B]--
else
A.zone.closed_connection_zones -= zone_B
if(A.zone.closed_connection_zones && !A.zone.closed_connection_zones.len)
A.zone.closed_connection_zones = null
if(zone_A && (!A.zone || zone_A != A.zone))
if(B && B.zone)
if(B.zone in zone_A.closed_connection_zones)
if(zone_A.closed_connection_zones[B.zone] > 1)
zone_A.closed_connection_zones[B.zone]--
else
zone_A.closed_connection_zones -= B.zone
if(zone_A.closed_connection_zones && !zone_A.closed_connection_zones.len)
zone_A.closed_connection_zones = null
if( zone_B && (!B.zone || zone_B != B.zone) )
if(zone_B in zone_A.closed_connection_zones)
if(zone_A.closed_connection_zones[zone_B] > 1)
zone_A.closed_connection_zones[zone_B]--
else
zone_A.closed_connection_zones -= zone_B
if(zone_A.closed_connection_zones && !zone_A.closed_connection_zones.len)
zone_A.closed_connection_zones = null
if(B && B.zone)
if(A && A.zone)
if(A.zone in B.zone.closed_connection_zones)
if(B.zone.closed_connection_zones[A.zone] > 1)
B.zone.closed_connection_zones[A.zone]--
else
B.zone.closed_connection_zones -= A.zone
if(B.zone.closed_connection_zones && !B.zone.closed_connection_zones.len)
B.zone.closed_connection_zones = null
if( zone_A && (!A.zone || zone_A != A.zone) )
if(zone_A in B.zone.closed_connection_zones)
if(B.zone.closed_connection_zones[zone_A] > 1)
B.zone.closed_connection_zones[zone_A]--
else
B.zone.closed_connection_zones -= zone_A
if(B.zone.closed_connection_zones && !B.zone.closed_connection_zones.len)
B.zone.closed_connection_zones = null
if(zone_B && (!B.zone || zone_B != B.zone))
if(A && A.zone)
if(A.zone in zone_B.closed_connection_zones)
if(zone_B.closed_connection_zones[A.zone] > 1)
zone_B.closed_connection_zones[A.zone]--
else
zone_B.closed_connection_zones -= A.zone
if(zone_B.closed_connection_zones && !zone_B.closed_connection_zones.len)
zone_B.closed_connection_zones = null
if( zone_A && (!A.zone || zone_A != A.zone) )
if(zone_A in zone_B.closed_connection_zones)
if(zone_B.closed_connection_zones[zone_A] > 1)
zone_B.closed_connection_zones[zone_A]--
else
zone_B.closed_connection_zones -= zone_A
if(zone_B.closed_connection_zones && !zone_B.closed_connection_zones.len)
zone_B.closed_connection_zones = null
. = ..() . = ..()
proc/ConnectZones(var/zone/zone_1, var/zone/zone_2, open = 0)
//Sanity checking
if(!istype(zone_1) || !istype(zone_2))
return
//Handle zones connecting indirectly/directly.
if(open)
//Create the lists if necessary.
if(!zone_1.connected_zones)
zone_1.connected_zones = list()
if(!zone_2.connected_zones)
zone_2.connected_zones = list()
//Increase the number of connections between zones.
if(zone_2 in zone_1.connected_zones)
zone_1.connected_zones[zone_2]++
else
zone_1.connected_zones += zone_2
zone_1.connected_zones[zone_2] = 1
if(zone_1 in zone_2.connected_zones)
zone_2.connected_zones[zone_1]++
else
zone_2.connected_zones += zone_1
zone_2.connected_zones[zone_1] = 1
//Handle closed connections.
else
//Create the lists
if(!zone_1.closed_connection_zones)
zone_1.closed_connection_zones = list()
if(!zone_2.closed_connection_zones)
zone_2.closed_connection_zones = list()
//Increment the connections.
if(zone_2 in zone_1.closed_connection_zones)
zone_1.closed_connection_zones[zone_2]++
else
zone_1.closed_connection_zones += zone_2
zone_1.closed_connection_zones[zone_2] = 1
if(zone_1 in zone_2.closed_connection_zones)
zone_2.closed_connection_zones[zone_1]++
else
zone_2.closed_connection_zones += zone_1
zone_2.closed_connection_zones[zone_1] = 1
proc/DisconnectZones(var/zone/zone_1, var/zone/zone_2)
//Sanity checking
if(!istype(zone_1) || !istype(zone_2))
return
//Handle disconnection of indirectly or directly connected zones.
if( (zone_1 in zone_2.connected_zones) || (zone_2 in zone_1.connected_zones) )
//If there are more than one connection, decrement the number of connections
//Otherwise, remove all connections between the zones.
if(zone_1.connected_zones[zone_2] > 1)
zone_1.connected_zones[zone_2]--
else
zone_1.connected_zones -= zone_2
//remove the list if it is empty
if(!zone_1.connected_zones.len)
zone_1.connected_zones = null
//Then do the same for the other zone.
if(zone_2.connected_zones[zone_1] > 1)
zone_2.connected_zones[zone_1]--
else
zone_2.connected_zones -= zone_1
if(!zone_2.connected_zones.len)
zone_2.connected_zones = null
//Handle disconnection of closed zones.
if( (zone_1 in zone_2.closed_connection_zones) || (zone_2 in zone_1.closed_connection_zones) )
//If there are more than one connection, decrement the number of connections
//Otherwise, remove all connections between the zones.
if(zone_1.closed_connection_zones[zone_2] > 1)
zone_1.closed_connection_zones[zone_2]--
else
zone_1.closed_connection_zones -= zone_2
//remove the list if it is empty
if(!zone_1.closed_connection_zones.len)
zone_1.closed_connection_zones = null
//Then do the same for the other zone.
if(zone_2.closed_connection_zones[zone_1] > 1)
zone_2.closed_connection_zones[zone_1]--
else
zone_2.closed_connection_zones -= zone_1
if(!zone_2.closed_connection_zones.len)
zone_2.closed_connection_zones = null
proc/Cleanup() proc/Cleanup()
//Check sanity: existance of turfs
if(!A || !B) if(!A || !B)
//world.log << "Connection removed: [A] or [B] missing entirely."
del src del src
//Check sanity: zones are different
if(A.zone == B.zone) if(A.zone == B.zone)
//world.log << "Connection removed: Zones now merged."
del src del src
//Check sanity: same turfs as before.
if(ref_A != "\ref[A]" || ref_B != "\ref[B]") if(ref_A != "\ref[A]" || ref_B != "\ref[B]")
del src del src
//Handle zones changing on a turf.
if((A.zone && A.zone != zone_A) || (B.zone && B.zone != zone_B)) if((A.zone && A.zone != zone_A) || (B.zone && B.zone != zone_B))
Sanitize() Sanitize()
//Manage sudden loss of a turfs zone. (e.g. a wall being built)
if(!A.zone || !B.zone) if(!A.zone || !B.zone)
no_zone_count++ no_zone_count++
if(no_zone_count >= 5) if(no_zone_count >= 5)
//world.log << "Connection removed: [A] or [B] missing a zone." //world.log << "Connection removed: [A] or [B] missing a zone."
del src del src
return 0 return 0
return 1 return 1
proc/CheckPassSanity() proc/CheckPassSanity()
//Sanity check, first.
Cleanup() Cleanup()
if(A.zone && B.zone) if(A.zone && B.zone)
//If no walls are blocking us...
if(A.ZAirPass(B)) if(A.ZAirPass(B))
//...we check to see if there is a door in the way...
var/door_pass = A.CanPass(null,B,1.5,1) var/door_pass = A.CanPass(null,B,1.5,1)
//...and if it is opened.
if(door_pass || A.CanPass(null,B,0,0)) if(door_pass || A.CanPass(null,B,0,0))
//Make and remove connections to let air pass.
if(indirect == CONNECTION_CLOSED) if(indirect == CONNECTION_CLOSED)
//ADJUST FOR CAN CONNECT DisconnectZones(A.zone, B.zone)
if(!A.zone.connected_zones) ConnectZones(A.zone, B.zone, 1)
A.zone.connected_zones = list()
if(B.zone in A.zone.connected_zones)
A.zone.connected_zones[B.zone]++
else
A.zone.connected_zones += B.zone
A.zone.connected_zones[B.zone] = 1
if(!B.zone.connected_zones)
B.zone.connected_zones = list()
if(A.zone in B.zone.connected_zones)
B.zone.connected_zones[A.zone]++
else
B.zone.connected_zones += A.zone
B.zone.connected_zones[A.zone] = 1
if(A.zone.closed_connection_zones)
if(A.zone.closed_connection_zones[B.zone] > 1)
A.zone.closed_connection_zones[B.zone]--
else
A.zone.closed_connection_zones.Remove(B.zone)
if(A.zone.closed_connection_zones && !A.zone.closed_connection_zones.len)
A.zone.closed_connection_zones = null
if(B.zone.closed_connection_zones)
if(B.zone.closed_connection_zones[A.zone] > 1)
B.zone.closed_connection_zones[A.zone]--
else
B.zone.closed_connection_zones.Remove(A.zone)
if(B.zone.closed_connection_zones && !B.zone.closed_connection_zones.len)
B.zone.closed_connection_zones = null
if(door_pass) if(door_pass)
indirect = CONNECTION_DIRECT indirect = CONNECTION_DIRECT
else if(!door_pass) else if(!door_pass)
indirect = CONNECTION_INDIRECT indirect = CONNECTION_INDIRECT
//The door is instead closed.
else if(indirect > CONNECTION_CLOSED) else if(indirect > CONNECTION_CLOSED)
indirect = CONNECTION_CLOSED indirect = CONNECTION_CLOSED
//ADJUST FOR CANNOT CONNECT DisconnectZones(A.zone, B.zone)
if(A.zone.connected_zones) ConnectZones(A.zone, B.zone)
if(A.zone.connected_zones[B.zone] > 1)
A.zone.connected_zones[B.zone]--
else
A.zone.connected_zones.Remove(B.zone)
if(A.zone.connected_zones && !A.zone.connected_zones.len)
A.zone.connected_zones = null
if(B.zone.connected_zones) //If I can no longer pass air, better delete
if(B.zone.connected_zones[A.zone] > 1) else
B.zone.connected_zones[A.zone]--
else
B.zone.connected_zones.Remove(A.zone)
if(B.zone.connected_zones && !B.zone.connected_zones.len)
B.zone.connected_zones = null
//Add to the closed connections list(s)
if(!A.zone.closed_connection_zones)
A.zone.closed_connection_zones = list()
if(B.zone in A.zone.closed_connection_zones)
A.zone.closed_connection_zones[B.zone]++
else
A.zone.closed_connection_zones += B.zone
A.zone.closed_connection_zones[B.zone] = 1
if(!B.zone.closed_connection_zones)
B.zone.closed_connection_zones = list()
if(A.zone in B.zone.closed_connection_zones)
B.zone.closed_connection_zones[A.zone]++
else
B.zone.closed_connection_zones += A.zone
B.zone.closed_connection_zones[A.zone] = 1
else //If I can no longer pass air, better delete
del src del src
proc/Sanitize() proc/Sanitize()
//If the zones change on connected turfs, update it. //If the zones change on connected turfs, update it.
if(A.zone && A.zone != zone_A && B.zone && B.zone != zone_B)
if(!A.zone || !B.zone)
del src
//Both zones changed (wat)
if(A.zone && A.zone != zone_A && B.zone && B.zone != zone_B)
//If the zones have gotten swapped
// (do not ask me how, I am just being anal retentive about sanity)
if(A.zone == zone_B && B.zone == zone_A) if(A.zone == zone_B && B.zone == zone_A)
var/turf/temp = B var/turf/temp = B
B = A B = A
@@ -386,208 +283,101 @@ connection
ref_B = temp_ref ref_B = temp_ref
return return
if(zone_A) //Handle removal of connections from archived zones.
if(zone_A.connections) if(zone_A && zone_A.connections)
zone_A.connections.Remove(src) zone_A.connections.Remove(src)
if(!zone_A.connections.len) if(!zone_A.connections.len)
del zone_A.connections zone_A.connections = null
if(indirect != CONNECTION_CLOSED) if(zone_B && zone_B.connections)
if(zone_A.connected_zones) zone_B.connections.Remove(src)
if(zone_A.connected_zones[zone_B] > 1) if(!zone_B.connections.len)
zone_A.connected_zones[zone_B]-- zone_B.connections = null
else
zone_A.connected_zones.Remove(zone_B)
if(zone_A.connected_zones && !zone_A.connected_zones.len)
zone_A.connected_zones = null
else if(A.zone)
if(zone_A.closed_connection_zones)
if(zone_A.closed_connection_zones[zone_B] > 1)
zone_A.closed_connection_zones[zone_B]--
else
zone_A.closed_connection_zones.Remove(zone_B)
if(zone_A.closed_connection_zones && !zone_A.closed_connection_zones.len)
zone_A.closed_connection_zones = null
if(zone_B)
if(zone_B.connections)
zone_B.connections.Remove(src)
if(!zone_B.connections.len)
del zone_B.connections
if(indirect != CONNECTION_CLOSED)
if(zone_B.connected_zones)
if(zone_B.connected_zones[zone_A] > 1)
zone_B.connected_zones[zone_A]--
else
zone_B.connected_zones.Remove(zone_A)
if(zone_B.connected_zones && !zone_B.connected_zones.len)
zone_B.connected_zones = null
else
if(zone_B.closed_connection_zones)
if(zone_B.closed_connection_zones[zone_A] > 1)
zone_B.closed_connection_zones[zone_A]--
else
zone_B.closed_connection_zones.Remove(zone_A)
if(zone_B.closed_connection_zones && !zone_B.closed_connection_zones.len)
zone_B.closed_connection_zones = null
if(indirect != CONNECTION_CLOSED)
if(!A.zone.connections) if(!A.zone.connections)
A.zone.connections = list() A.zone.connections = list()
A.zone.connections |= src A.zone.connections |= src
if(B.zone)
if(!B.zone.connections) if(!B.zone.connections)
B.zone.connections = list() B.zone.connections = list()
B.zone.connections |= src B.zone.connections |= src
if(!A.zone.connected_zones) //If either zone is null, we disconnect the archived ones after cleaning up the connections.
A.zone.connected_zones = list() if(!A.zone || !B.zone)
if(B.zone in A.zone.connected_zones) if(zone_A && zone_B)
A.zone.connected_zones[B.zone]++ DisconnectZones(zone_B, zone_A)
else
A.zone.connected_zones += B.zone
A.zone.connected_zones[B.zone] = 1
if(!B.zone.connected_zones) if(!A.zone)
B.zone.connected_zones = list() zone_A = A.zone
if(A.zone in B.zone.connected_zones)
B.zone.connected_zones[A.zone]++
else
B.zone.connected_zones += A.zone
B.zone.connected_zones[A.zone] = 1
else if(!B.zone)
zone_B = B.zone
return
if(!A.zone.connections) //Handle diconnection and reconnection of zones.
A.zone.connections = list() if(zone_A && zone_B)
A.zone.connections |= src DisconnectZones(zone_A, zone_B)
if(!B.zone.connections) ConnectZones(A.zone, B.zone, indirect)
B.zone.connections = list()
B.zone.connections |= src
if(!A.zone.closed_connection_zones)
A.zone.closed_connection_zones = list()
if(B.zone in A.zone.closed_connection_zones)
A.zone.closed_connection_zones[B.zone]++
else
A.zone.closed_connection_zones += B.zone
A.zone.closed_connection_zones[B.zone] = 1
if(!B.zone.closed_connection_zones)
B.zone.closed_connection_zones = list()
if(A.zone in B.zone.closed_connection_zones)
B.zone.closed_connection_zones[A.zone]++
else
B.zone.closed_connection_zones += A.zone
B.zone.closed_connection_zones[A.zone] = 1
//resetting values of archived values.
zone_B = B.zone zone_B = B.zone
zone_A = A.zone zone_A = A.zone
//The "A" zone changed.
else if(A.zone && A.zone != zone_A) else if(A.zone && A.zone != zone_A)
if(zone_A)
//Handle connection cleanup
if(zone_A)
if(zone_A.connections) if(zone_A.connections)
zone_A.connections.Remove(src) zone_A.connections.Remove(src)
if(!zone_A.connections.len) if(!zone_A.connections.len)
del zone_A.connections zone_A.connections = null
if(A.zone)
if(!A.zone.connections) if(!A.zone.connections)
A.zone.connections = list() A.zone.connections = list()
A.zone.connections |= src A.zone.connections |= src
if(indirect != CONNECTION_CLOSED) //If the "A" zone is null, we disconnect the archived ones after cleaning up the connections.
if(zone_A.connected_zones) if(!A.zone)
if(zone_A.connected_zones[zone_B] > 1) if(zone_A && zone_B)
zone_A.connected_zones[zone_B]-- DisconnectZones(zone_A, zone_B)
else
zone_A.connected_zones.Remove(zone_B)
if(zone_A.connected_zones && !zone_A.connected_zones.len)
zone_A.connected_zones = null
if(!A.zone.connected_zones)
A.zone.connected_zones = list()
if(!(zone_B in A.zone.connected_zones))
A.zone.connected_zones += zone_B
A.zone.connected_zones[zone_B] = 1
else
A.zone.connected_zones[zone_B]++
else
if(zone_A.closed_connection_zones)
if(zone_A.closed_connection_zones[zone_B] > 1)
zone_A.closed_connection_zones[zone_B]--
else
zone_A.closed_connection_zones.Remove(zone_B)
if(zone_A.closed_connection_zones && !zone_A.closed_connection_zones.len)
zone_A.closed_connection_zones = null
if(!A.zone.closed_connection_zones)
A.zone.closed_connection_zones = list()
if(!(zone_B in A.zone.closed_connection_zones))
A.zone.closed_connection_zones += zone_B
A.zone.closed_connection_zones[zone_B] = 1
else
A.zone.closed_connection_zones[zone_B]++
zone_A = A.zone zone_A = A.zone
return
else //Handle diconnection and reconnection of zones.
del src if(zone_A && zone_B)
DisconnectZones(zone_A, zone_B)
ConnectZones(A.zone, B.zone, indirect)
//The "B" zone changed.
else if(B.zone && B.zone != zone_B) else if(B.zone && B.zone != zone_B)
if(zone_B)
//Handle connection cleanup
if(zone_B)
if(zone_B.connections) if(zone_B.connections)
zone_B.connections.Remove(src) zone_B.connections.Remove(src)
if(!zone_B.connections.len) if(!zone_B.connections.len)
del zone_B.connections zone_B.connections = null
if(B.zone)
if(!B.zone.connections) if(!B.zone.connections)
B.zone.connections = list() B.zone.connections = list()
B.zone.connections |= src B.zone.connections |= src
if(indirect != CONNECTION_CLOSED) //If the "B" zone is null, we disconnect the archived ones after cleaning up the connections.
if(zone_B.connected_zones) if(!B.zone)
if(zone_B.connected_zones[zone_A] > 1) if(zone_A && zone_B)
zone_B.connected_zones[zone_A]-- DisconnectZones(zone_A, zone_B)
else
zone_B.connected_zones.Remove(zone_A)
if(zone_B.connected_zones && !zone_B.connected_zones.len)
zone_B.connected_zones = null
if(!B.zone.connected_zones)
B.zone.connected_zones = list()
if(!(zone_A in B.zone.connected_zones))
B.zone.connected_zones += zone_A
B.zone.connected_zones[zone_A] = 1
else
B.zone.connected_zones[zone_A]++
else
if(zone_B.closed_connection_zones)
if(zone_B.closed_connection_zones[zone_A] > 1)
zone_B.closed_connection_zones[zone_A]--
else
zone_B.closed_connection_zones.Remove(zone_A)
if(zone_B.closed_connection_zones && !zone_B.closed_connection_zones.len)
zone_B.closed_connection_zones = null
if(!B.zone.closed_connection_zones)
B.zone.closed_connection_zones = list()
if(!(zone_A in B.zone.closed_connection_zones))
B.zone.closed_connection_zones += zone_A
B.zone.closed_connection_zones[zone_A] = 1
else
B.zone.closed_connection_zones[zone_A]++
zone_B = B.zone zone_B = B.zone
return
else //Handle diconnection and reconnection of zones.
del src if(zone_A && zone_B)
DisconnectZones(zone_A, zone_B)
ConnectZones(A.zone, B.zone, indirect)
#undef CONNECTION_DIRECT #undef CONNECTION_DIRECT

View File

@@ -40,7 +40,7 @@ client/proc/Test_ZAS_Connection(var/turf/simulated/T as turf)
if(!istype(other_turf)) if(!istype(other_turf))
return return
var/pass_directions = T.CanPass(null, other_turf, 0, 0) + 2*other_turf.CanPass(null, T, 0, 0) var/pass_directions = T.CanPass(null, other_turf, 0, 0) + 2 * other_turf.CanPass(null, T, 0, 0)
switch(pass_directions) switch(pass_directions)
if(0) if(0)
@@ -80,12 +80,9 @@ zone/proc
M << "<u>Connections: [length(connections)]</u>" M << "<u>Connections: [length(connections)]</u>"
for(var/connection/C in connections) for(var/connection/C in connections)
M << "[C.A] --> [C.B] [(C.indirect?"Indirect":"Direct")]" M << "[C.A] --> [C.B] [(C.indirect?"Open":"Closed")]"
C.A.overlays += 'debug_connect.dmi' C.A.overlays += 'debug_connect.dmi'
C.B.overlays += 'debug_connect.dmi' C.B.overlays += 'debug_connect.dmi'
spawn(50)
C.A.overlays -= 'debug_connect.dmi'
C.B.overlays -= 'debug_connect.dmi'
for(var/C in connections) for(var/C in connections)
if(!istype(C,/connection)) if(!istype(C,/connection))
M << "[C] (Not Connection!)" M << "[C] (Not Connection!)"

View File

@@ -101,12 +101,10 @@ datum
//Geometry updates lists //Geometry updates lists
var/list/tiles_to_update = list() var/list/tiles_to_update = list()
var/list/connections_to_check = list() var/list/connections_to_check = list()
var/list/rebuilds_to_consider = list()
var/current_cycle = 0 var/current_cycle = 0
var/update_delay = 5 //How long between check should it try to process atmos again. var/update_delay = 5 //How long between check should it try to process atmos again.
var/failed_ticks = 0 //How many ticks have runtimed? var/failed_ticks = 0 //How many ticks have runtimed?
var/next_stat_check = 10
var/tick_progress = 0 var/tick_progress = 0
@@ -137,7 +135,10 @@ datum
var/start_time = world.timeofday var/start_time = world.timeofday
var/simulated_turf_count = 0
for(var/turf/simulated/S in world) for(var/turf/simulated/S in world)
simulated_turf_count++
if(!S.zone && !S.blocks_air) if(!S.zone && !S.blocks_air)
if(S.CanPass(null, S, 0, 0)) if(S.CanPass(null, S, 0, 0))
new/zone(S) new/zone(S)
@@ -145,8 +146,12 @@ datum
for(var/turf/simulated/S in world) for(var/turf/simulated/S in world)
S.update_air_properties() S.update_air_properties()
world << "\red \b Geometry processed in [time2text(world.timeofday-start_time, "mm:ss")] minutes!" world << {"<font color='red'><b>Geometry initialized in [round(0.1*(world.timeofday-start_time),0.1)] seconds.</b>
// spawn start() Total Simulated Turfs: [simulated_turf_count]
Total Zones: [zones.len]
Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_count]</font>"}
/*
spawn start()
proc/start() proc/start()
//Purpose: This is kicked off by the master controller, and controls the processing of all atmosphere. //Purpose: This is kicked off by the master controller, and controls the processing of all atmosphere.
@@ -154,7 +159,7 @@ datum
//Inputs: None. //Inputs: None.
//Outputs: None. //Outputs: None.
/*
set background = 1 set background = 1
while(1) while(1)
@@ -172,55 +177,30 @@ datum
proc/tick() proc/tick()
. = 1 //Set the default return value, for runtime detection. . = 1 //Set the default return value, for runtime detection.
tick_progress = "next_stat_check (atmos statistics)"
if(current_cycle >= next_stat_check)
var/zone/z = pick(zones)
var/log_file = file("[time2text(world.timeofday, "statistics/DD-MM-YYYY-air.txt")]")
log_file << "\"\The [get_area(pick(z.contents))]\",[z.air.oxygen],[z.air.nitrogen],[z.air.carbon_dioxide],[z.air.toxins],[z.air.temperature],[z.air.group_multiplier * z.air.volume]"
next_stat_check = current_cycle + (rand(5,7)*60)
tick_progress = "update_air_properties" tick_progress = "update_air_properties"
if(tiles_to_update.len) //If there are tiles to update, do so. if(tiles_to_update.len) //If there are tiles to update, do so.
for(var/turf/simulated/T in tiles_to_update) for(var/turf/simulated/T in tiles_to_update)
var/output = T.update_air_properties() if(. && T && !T.update_air_properties())
if(. && T && !output)
. = 0 //If a runtime occured, make sure we can sense it. . = 0 //If a runtime occured, make sure we can sense it.
//message_admins("ZASALERT: Unable run turf/simualted/update_air_properties()") //message_admins("ZASALERT: Unable run turf/simualted/update_air_properties()")
tiles_to_update = list() tiles_to_update = list()
tick_progress = "reconsider_zones" //Check sanity on connection objects.
if(rebuilds_to_consider.len)
for(var/turf/T in rebuilds_to_consider)
if(istype(T, /turf/simulated) && T.zone && !T.zone.rebuild)
var/turf/simulated/other_turf = rebuilds_to_consider[T]
if(istype(other_turf))
ConsiderRebuild(T,other_turf)
else if(istype(other_turf, /list))
var/list/temp_turfs = other_turf
for(var/turf/NT in temp_turfs)
ConsiderRebuild(T,NT)
else if (istype(T))
var/turf/simulated/other_turf = rebuilds_to_consider[T]
if(istype(other_turf))
ConsiderRebuild(other_turf,T)
else if(istype(other_turf, /list))
var/list/temp_turfs = other_turf
for(var/turf/simulated/NT in temp_turfs)
ConsiderRebuild(NT,T)
rebuilds_to_consider = list()
tick_progress = "connections_to_check" tick_progress = "connections_to_check"
if(connections_to_check.len) if(connections_to_check.len)
for(var/connection/C in connections_to_check) for(var/connection/C in connections_to_check)
C.CheckPassSanity() C.CheckPassSanity()
connections_to_check = list() connections_to_check = list()
//Ensure tiles still have zones.
tick_progress = "tiles_to_reconsider_zones" tick_progress = "tiles_to_reconsider_zones"
if(tiles_to_reconsider_zones.len) if(tiles_to_reconsider_zones.len)
for(var/turf/simulated/T in tiles_to_reconsider_zones) for(var/turf/simulated/T in tiles_to_reconsider_zones)
if(!T.zone) if(!T.zone)
new /zone(T) new /zone(T)
tiles_to_reconsider_zones = list()
//Process zones.
tick_progress = "zone/process()" tick_progress = "zone/process()"
for(var/zone/Z in zones) for(var/zone/Z in zones)
if(Z.last_update < current_cycle) if(Z.last_update < current_cycle)
@@ -229,150 +209,10 @@ datum
Z.last_update = current_cycle Z.last_update = current_cycle
if(. && Z && !output) if(. && Z && !output)
. = 0 . = 0
log_admin("ZASALERT: unable run zone/process(), [Z.progress]") //Process fires.
message_admins("ZASALERT. ZASALERT: unable run zone/proc/process(), [Z.progress], tell someone about this!")
tick_progress = "active_hotspots (fire)" tick_progress = "active_hotspots (fire)"
for(var/obj/fire/F in active_hotspots) for(var/obj/fire/F in active_hotspots)
var/output = F.process() if(. && F && !F.process())
if(. && F && !output)
. = 0 . = 0
//message_admins("ZASALERT: Unable run obj/fire/process()")
tick_progress = "success" tick_progress = "success"
proc/AddToConsiderRebuild(var/turf/simulated/T, var/turf/NT)
var/turf/existing_test = rebuilds_to_consider[T]
var/turf/existing_test_alternate = rebuilds_to_consider[NT]
if(existing_test)
if(NT == existing_test)
return
else if(islist(existing_test) && existing_test[NT])
return
else if(existing_test_alternate)
if(T == existing_test_alternate)
return
else if(islist(existing_test_alternate) && existing_test_alternate[T])
return
if(istype(T))
if(istype(existing_test))
var/list/temp_list = list(NT = 1, existing_test = 1)
rebuilds_to_consider[T] = temp_list
else if(istype(existing_test, /list))
existing_test[NT] = 1
else
rebuilds_to_consider[T] = NT
else if(istype(NT, /turf/simulated))
if(istype(existing_test_alternate))
var/list/temp_list = list(T = 1, existing_test_alternate = 1)
rebuilds_to_consider[NT] = temp_list
else if(istype(existing_test_alternate, /list))
existing_test_alternate[T] = 1
else
rebuilds_to_consider[NT] = T
proc/ConsiderRebuild(var/turf/simulated/T, var/turf/NT)
if(!istype(T)) return
//zones should naturally spread to these tiles eventually
if(!T.zone || !NT.zone)
return
if(istype(NT, /turf/simulated) && NT.zone != T.zone)
T.zone.RemoveTurf(NT)
if(NT.zone)
NT.zone.RemoveTurf(T)
return
if(T.zone.rebuild)
return
var/zone/zone = T.zone
var/target_dir = get_dir(T, NT)
if(target_dir in list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST))
T.zone.rebuild = 1
return
var/test_dir = turn(target_dir, 90)
var/turf/simulated/current = T
var/turf/simulated/next
var/stepped_back = 0
if( !(T.air_check_directions&test_dir || T.air_check_directions&turn(target_dir, 270)) )
//Step back, then try to connect.
if(!(T.air_check_directions&get_dir(NT, T)))
zone.rebuild = 1
return
current = get_step(T, get_dir(NT, T))
if(!istype(current) || !(current.air_check_directions&test_dir || current.air_check_directions&turn(target_dir, 270)) )
zone.rebuild = 1
return
stepped_back = 1
if ( !(current.air_check_directions&test_dir) && current.air_check_directions&turn(target_dir, 270) )
//Try to connect to the right hand side.
var/flipped = 0
test_dir = turn(target_dir, 270)
for(var/i = 1, i <= 10, i++)
if(get_dir(current, NT) in cardinal)
target_dir = get_dir(current, NT)
if(!istype(current) || !(current.air_check_directions&target_dir || current.air_check_directions&test_dir))
if(flipped)
zone.rebuild = 1
return
current = T
test_dir = turn(target_dir, 180)
i = 0
target_dir = get_dir(current, NT)
flipped = 1
continue
if(current.air_check_directions&target_dir && !stepped_back)
next = get_step(current, target_dir)
if(!next.HasDoor())
current = next
if(current.air_check_directions&test_dir && current != next)
next = get_step(current, test_dir)
if(!next.HasDoor())
current = next
if(current == NT)
return //We made it, yaaay~
stepped_back = 0
zone.rebuild = 1
else if ( current.air_check_directions&test_dir )
//Try to connect to the left hand side.
for(var/i = 1, i <= 10, i++)
if(get_dir(current, NT) in cardinal)
target_dir = get_dir(current, NT)
if(!istype(current) || !(current.air_check_directions&target_dir || current.air_check_directions&test_dir))
zone.rebuild = 1
return
if(current.air_check_directions&target_dir && !stepped_back)
next = get_step(current, target_dir)
if(!next.HasDoor())
current = next
if(current.air_check_directions&test_dir && current != next)
next = get_step(current, test_dir)
if(!next.HasDoor())
current = next
if(current == NT)
return //We made it, yaaay~
stepped_back = 0
zone.rebuild = 1
else
//FUCK IT
zone.rebuild = 1

View File

@@ -1,35 +1,44 @@
//Global Functions //Global Functions
//Contents: FloodFill, ZMerge, ZConnect //Contents: FloodFill, ZMerge, ZConnect
//Floods outward from an initial turf to fill everywhere it's zone would reach.
proc/FloodFill(turf/simulated/start) proc/FloodFill(turf/simulated/start)
if(!istype(start)) if(!istype(start))
return list() return list()
var
list
open = list(start)
closed = list()
//The list of tiles waiting to be evaulated.
var/list/open = list(start)
//The list of tiles which have been evaulated.
var/list/closed = list()
//Loop through the turfs in the open list in order to find which adjacent turfs should be added to the zone.
while(open.len) while(open.len)
var/turf/simulated/T = pick(open) var/turf/simulated/T = pick(open)
//sanity!
if(!istype(T)) if(!istype(T))
open -= T open -= T
continue continue
//Check all cardinal directions
for(var/d in cardinal) for(var/d in cardinal)
var/turf/simulated/O = get_step(T,d) var/turf/simulated/O = get_step(T,d)
//Ensure the turf is of proper type, that it is not in either list, and that air can reach it.
if(istype(O) && !(O in open) && !(O in closed) && O.ZCanPass(T)) if(istype(O) && !(O in open) && !(O in closed) && O.ZCanPass(T))
//Handle connections from a tile with a door.
if(T.HasDoor()) if(T.HasDoor())
//If they both have doors, then they are nto able to connect period. //If they both have doors, then they are not able to connect period.
if(O.HasDoor()) if(O.HasDoor())
continue continue
//connect first to north and west //Connect first to north and west
if(d == NORTH || d == WEST) if(d == NORTH || d == WEST)
open += O open += O
//If that fails, and north/west cannot be connected to, see if west or south can be connected instead.
else else
var/turf/simulated/W = get_step(O, WEST) var/turf/simulated/W = get_step(O, WEST)
var/turf/simulated/N = get_step(O, NORTH) var/turf/simulated/N = get_step(O, NORTH)
@@ -38,9 +47,11 @@ proc/FloodFill(turf/simulated/start)
//If it cannot connect either to the north or west, connect it! //If it cannot connect either to the north or west, connect it!
open += O open += O
//If no doors are involved, add it immediately.
else if(!O.HasDoor()) else if(!O.HasDoor())
open += O open += O
//Handle connecting to a tile with a door.
else else
if(d == SOUTH || d == EAST) if(d == SOUTH || d == EAST)
//doors prefer connecting to zones to the north or west //doors prefer connecting to zones to the north or west
@@ -56,23 +67,25 @@ proc/FloodFill(turf/simulated/start)
//If it cannot connect either to the north or west, connect it! //If it cannot connect either to the north or west, connect it!
closed += O closed += O
//This tile is now evaluated, and can be moved to the list of evaluated tiles.
open -= T open -= T
closed += T closed += T
return closed return closed
//Procedure to merge two zones together.
proc/ZMerge(zone/A,zone/B) proc/ZMerge(zone/A,zone/B)
//Sanity~
if(!istype(A) || !istype(B)) if(!istype(A) || !istype(B))
return return
//Merges two zones so that they are one. //Merges two zones so that they are one.
var var/a_size = A.air.group_multiplier
a_size = A.air.group_multiplier var/b_size = B.air.group_multiplier
b_size = B.air.group_multiplier var/c_size = a_size + b_size
c_size = a_size + b_size var/new_contents = A.contents + B.contents
new_contents = A.contents + B.contents
//Set air multipliers to one so air represents gas per tile. //Set air multipliers to one so air represents gas per tile.
A.air.group_multiplier = 1 A.air.group_multiplier = 1
@@ -86,33 +99,28 @@ proc/ZMerge(zone/A,zone/B)
A.air.merge(B.air) A.air.merge(B.air)
A.air.group_multiplier = c_size A.air.group_multiplier = c_size
//Check for connections to merge into the new zone.
for(var/connection/C in B.connections)
if((C.A in new_contents) && (C.B in new_contents))
del C
continue
if(!A.connections) A.connections = list()
A.connections += C
//Add space tiles.
A.unsimulated_tiles += B.unsimulated_tiles
//Add contents.
A.contents = new_contents
//Set all the zone vars. //Set all the zone vars.
for(var/turf/simulated/T in B.contents) for(var/turf/simulated/T in B.contents)
T.zone = A T.zone = A
for(var/connection/C in A.connections) //Check for connections to merge into the new zone.
for(var/connection/C in B.connections)
//The Cleanup proc will delete the connection if the zones are the same.
// It will also set the zone variables correctly.
C.Cleanup() C.Cleanup()
//Add space tiles.
A.unsimulated_tiles |= B.unsimulated_tiles
//Add contents.
A.contents = new_contents
//Remove the "B" zone, finally.
B.SoftDelete() B.SoftDelete()
//Connects two zones by forming a connection object representing turfs A and B.
proc/ZConnect(turf/simulated/A,turf/simulated/B) proc/ZConnect(turf/simulated/A,turf/simulated/B)
//Connects two zones by forming a connection object representing turfs A and B.
//Make sure that if it's space, it gets added to unsimulated_tiles instead. //Make sure that if it's space, it gets added to unsimulated_tiles instead.
if(!istype(B)) if(!istype(B))
@@ -141,83 +149,5 @@ proc/ZConnect(turf/simulated/A,turf/simulated/B)
if(C && (C.B == B || C.A == B)) if(C && (C.B == B || C.A == B))
return return
new /connection(A,B) //Make the connection.
new /connection(A,B)
/*
proc/ZDisconnect(turf/A,turf/B)
//Removes a zone connection. Can split zones in the case of a permanent barrier.
//If one of them doesn't have a zone, it might be space, so check for that.
if(A.zone && B.zone)
//If the two zones are different, just remove a connection.
if(A.zone != B.zone)
for(var/connection/C in A.zone.connections)
if((C.A == A && C.B == B) || (C.A == B && C.B == A))
del C
if(C)
C.Cleanup()
//If they're the same, split the zone at this line.
else
//Preliminary checks to prevent stupidity.
if(A == B) return
if(A.CanPass(0,B,0,0)) return
if(A.HasDoor(B) || B.HasDoor(A)) return
//Do a test fill. If turf B is still in the floodfill, then the zone isn't really split.
var/zone/oldzone = A.zone
var/list/test = FloodFill(A)
if(B in test) return
else
var/zone/Z = new(test,oldzone.air) //Create a new zone based on the old air and the test fill.
//Add connections from the old zone.
for(var/connection/C in oldzone.connections)
if((C.A in Z.contents) || (C.B in Z.contents))
if(!Z.connections) Z.connections = list()
Z.connections += C
C.Cleanup()
//Check for space.
for(var/turf/T in test)
T.check_for_space()
//Make a new, identical air mixture for the other zone.
var/datum/gas_mixture/Y_Air = new
Y_Air.copy_from(oldzone.air)
var/zone/Y = new(B,Y_Air) //Make a new zone starting at B and using Y_Air.
//Add relevant connections from old zone.
for(var/connection/C in oldzone.connections)
if((C.A in Y.contents) || (C.B in Y.contents))
if(!Y.connections) Y.connections = list()
Y.connections += C
C.Cleanup()
//Add the remaining space tiles to this zone.
for(var/turf/space/T in oldzone.unsimulated_tiles)
if(!(T in Z.unsimulated_tiles))
Y.AddSpace(T)
oldzone.air = null
del oldzone
else
if(B.zone)
if(istype(A,/turf/space))
B.zone.RemoveSpace(A)
else
for(var/connection/C in B.zone.connections)
if((C.A == A && C.B == B) || (C.A == B && C.B == A))
del C
if(C)
C.Cleanup()
if(A.zone)
if(istype(B,/turf/space))
A.zone.RemoveSpace(B)
else
for(var/connection/C in A.zone.connections)
if((C.A == A && C.B == B) || (C.A == B && C.B == A))
del C
if(C)
C.Cleanup()*/

View File

@@ -68,8 +68,9 @@ obj/item/proc
if(!pl_head_protected()) if(!pl_head_protected())
if(prob(1)) suit_contamination() //Plasma can sometimes get through such an open suit. if(prob(1)) suit_contamination() //Plasma can sometimes get through such an open suit.
if(istype(back,/obj/item/weapon/storage/backpack)) //Cannot wash backpacks currently.
back.contaminate() // if(istype(back,/obj/item/weapon/storage/backpack))
// back.contaminate()
/mob/proc/pl_effects() /mob/proc/pl_effects()

View File

@@ -165,27 +165,32 @@ turf
if(!zone) //Still no zone, the floodfill determined it is not part of a larger zone. Force a zone on it. if(!zone) //Still no zone, the floodfill determined it is not part of a larger zone. Force a zone on it.
new/zone(list(src)) new/zone(list(src))
if("\ref[src]" in air_master.turfs_with_connections) //Check pass sanity of the connections. //Check pass sanity of the connections.
if("\ref[src]" in air_master.turfs_with_connections)
for(var/connection/C in air_master.turfs_with_connections["\ref[src]"]) for(var/connection/C in air_master.turfs_with_connections["\ref[src]"])
if(!(C in air_master.connections_to_check)) air_master.connections_to_check |= C
air_master.connections_to_check += C
if(zone && !zone.rebuild) if(zone && !zone.rebuild)
for(var/direction in cardinal) for(var/direction in cardinal)
if(zone.rebuild)
break
var/turf/T = get_step(src,direction) var/turf/T = get_step(src,direction)
if(!istype(T)) if(!istype(T))
continue continue
// var/list/zone/adjacent_zones = list()
if(air_check_directions&direction) //I can connect air in this direction //I can connect to air in this direction
if(!CanPass(null, T, 0, 0)) //If either block air, we must look to see if the adjacent turfs need rebuilt. if(air_check_directions&direction)
if(!T.CanPass(null, T, 0, 0)) //Target blocks air
//If either block air, we must look to see if the adjacent turfs need rebuilt.
if(!CanPass(null, T, 0, 0))
//Target blocks air
if(!T.CanPass(null, T, 0, 0))
var/turf/NT = get_step(T, direction) var/turf/NT = get_step(T, direction)
//If that turf is in my zone still, rebuild.
if(istype(NT,/turf/simulated) && NT in zone.contents) if(istype(NT,/turf/simulated) && NT in zone.contents)
air_master.AddToConsiderRebuild(src,NT) zone.rebuild = 1
//If that is an unsimulated tile in my zone, see if we need to rebuild or just remove.
else if(istype(NT) && NT in zone.unsimulated_tiles) else if(istype(NT) && NT in zone.unsimulated_tiles)
var/consider_rebuild = 0 var/consider_rebuild = 0
for(var/d in cardinal) for(var/d in cardinal)
@@ -194,17 +199,22 @@ turf
consider_rebuild = 1 consider_rebuild = 1
break break
if(consider_rebuild) if(consider_rebuild)
air_master.AddToConsiderRebuild(src,NT) //Gotta check if we need to rebuild, dammit zone.rebuild = 1 //Gotta check if we need to rebuild, dammit
else else
zone.RemoveTurf(NT) //Not adjacent to anything, and unsimulated. Goodbye~ zone.RemoveTurf(NT) //Not adjacent to anything, and unsimulated. Goodbye~
//To make a closed connection through closed door. //To make a closed connection through closed door.
ZConnect(T, src) ZConnect(T, src)
if(T.zone && !T.zone.rebuild) //I block air. //If I block air.
else if(T.zone && !T.zone.rebuild)
var/turf/NT = get_step(src, reverse_direction(direction)) var/turf/NT = get_step(src, reverse_direction(direction))
//If I am splitting a zone, rebuild.
if(istype(NT,/turf/simulated) && (NT in T.zone.contents || (NT.zone && T in NT.zone.contents))) if(istype(NT,/turf/simulated) && (NT in T.zone.contents || (NT.zone && T in NT.zone.contents)))
air_master.AddToConsiderRebuild(T,NT) T.zone.rebuild = 1
//If NT is unsimulated, parse if I should remove it or rebuild.
else if(istype(NT) && NT in T.zone.unsimulated_tiles) else if(istype(NT) && NT in T.zone.unsimulated_tiles)
var/consider_rebuild = 0 var/consider_rebuild = 0
for(var/d in cardinal) for(var/d in cardinal)
@@ -212,30 +222,48 @@ turf
if(istype(UT, /turf/simulated) && UT.zone == T.zone && UT.CanPass(null, NT, 0, 0)) //If we find a neighboring tile that is in the same zone, check if we need to rebuild if(istype(UT, /turf/simulated) && UT.zone == T.zone && UT.CanPass(null, NT, 0, 0)) //If we find a neighboring tile that is in the same zone, check if we need to rebuild
consider_rebuild = 1 consider_rebuild = 1
break break
//Needs rebuilt.
if(consider_rebuild) if(consider_rebuild)
air_master.AddToConsiderRebuild(T,NT) //Gotta check if we need to rebuild, dammit T.zone.rebuild = 1
//Not adjacent to anything, and unsimulated. Goodbye~
else else
T.zone.RemoveTurf(NT) //Not adjacent to anything, and unsimulated. Goodbye~ T.zone.RemoveTurf(NT)
else else
//Produce connection through open door.
ZConnect(src,T) ZConnect(src,T)
else if(air_directions_archived&direction) //Something like a wall was built, changing the geometry. //Something like a wall was built, changing the geometry.
else if(air_directions_archived&direction)
var/turf/NT = get_step(T, direction) var/turf/NT = get_step(T, direction)
if(istype(NT,/turf/simulated) && NT in zone.contents)
air_master.AddToConsiderRebuild(src,NT)
else if(istype(NT) && NT in zone.unsimulated_tiles) //Parse if we need to remove the tile, or rebuild the zone. //If the tile is in our own zone, and we cannot connect to it, better rebuild.
if(istype(NT,/turf/simulated) && NT in zone.contents)
zone.rebuild = 1
//Parse if we need to remove the tile, or rebuild the zone.
else if(istype(NT) && NT in zone.unsimulated_tiles)
var/consider_rebuild = 0 var/consider_rebuild = 0
//Loop through all neighboring turfs to see if we should remove the turf or just rebuild.
for(var/d in cardinal) for(var/d in cardinal)
var/turf/UT = get_step(NT,d) var/turf/UT = get_step(NT,d)
if(istype(UT, /turf/simulated) && UT.zone == zone && UT.CanPass(null, NT, 0, 0)) //If we find a neighboring tile that is in the same zone, check if we need to rebuild
//If we find a neighboring tile that is in the same zone, rebuild
if(istype(UT, /turf/simulated) && UT.zone == zone && UT.CanPass(null, NT, 0, 0))
consider_rebuild = 1 consider_rebuild = 1
break break
//The unsimulated turf is adjacent to another one of our zone's turfs,
// better rebuild to be sure we didn't get cut in twain
if(consider_rebuild) if(consider_rebuild)
air_master.AddToConsiderRebuild(src,NT) //Gotta check if we need to rebuild, dammit NT.zone.rebuild = 1
//Not adjacent to anything, and unsimulated. Goodbye~
else else
zone.RemoveTurf(NT) //Not adjacent to anything, and unsimulated. Goodbye~ zone.RemoveTurf(NT)
if(air_check_directions) if(air_check_directions)
processing = 1 processing = 1
@@ -254,8 +282,10 @@ turf
if(isnum(O) && O) if(isnum(O) && O)
if(!D.density) continue if(!D.density) continue
if(istype(D,/obj/machinery/door/window)) if(istype(D,/obj/machinery/door/window))
if(!O) continue if(!istype(O))
if(D.dir == get_dir(D,O)) return 1 continue
if(D.dir == get_dir(D,O))
return 1
else else
return 1 return 1
@@ -271,13 +301,13 @@ turf/proc/ZCanPass(turf/simulated/T, var/include_space = 0)
return 0 return 0
for(var/obj/obstacle in src) for(var/obj/obstacle in src)
if(istype(obstacle,/obj/machinery/door) && !istype(obstacle,/obj/machinery/door/window)) if(istype(obstacle, /obj/machinery/door) && !obstacle:air_properties_vary_with_direction)
continue continue
if(!obstacle.CanPass(null, T, 1.5, 1)) if(!obstacle.CanPass(null, T, 1.5, 1))
return 0 return 0
for(var/obj/obstacle in T) for(var/obj/obstacle in T)
if(istype(obstacle,/obj/machinery/door) && !istype(obstacle,/obj/machinery/door/window)) if(istype(obstacle, /obj/machinery/door) && !obstacle:air_properties_vary_with_direction)
continue continue
if(!obstacle.CanPass(null, src, 1.5, 1)) if(!obstacle.CanPass(null, src, 1.5, 1))
return 0 return 0
@@ -293,13 +323,13 @@ turf/proc/ZAirPass(turf/T)
return 0 return 0
for(var/obj/obstacle in src) for(var/obj/obstacle in src)
if(istype(obstacle,/obj/machinery/door) && !istype(obstacle,/obj/machinery/door/window)) if(istype(obstacle, /obj/machinery/door) && !obstacle:air_properties_vary_with_direction)
continue continue
if(!obstacle.CanPass(null, T, 0, 0)) if(!obstacle.CanPass(null, T, 0, 0))
return 0 return 0
for(var/obj/obstacle in T) for(var/obj/obstacle in T)
if(istype(obstacle,/obj/machinery/door) && !istype(obstacle,/obj/machinery/door/window)) if(istype(obstacle, /obj/machinery/door) && !obstacle:air_properties_vary_with_direction)
continue continue
if(!obstacle.CanPass(null, src, 0, 0)) if(!obstacle.CanPass(null, src, 0, 0))
return 0 return 0

View File

@@ -20,6 +20,7 @@ zone
// To make sure you're not spammed to death by airflow sound effects // To make sure you're not spammed to death by airflow sound effects
tmp/playsound_cooldown = 0 tmp/playsound_cooldown = 0
//CREATION AND DELETION //CREATION AND DELETION
New(turf/start) New(turf/start)
. = ..() . = ..()
@@ -53,6 +54,7 @@ zone
//Add this zone to the global list. //Add this zone to the global list.
zones.Add(src) zones.Add(src)
//LEGACY, DO NOT USE. Use the SoftDelete proc. //LEGACY, DO NOT USE. Use the SoftDelete proc.
Del() Del()
//Ensuring the zone list doesn't get clogged with null values. //Ensuring the zone list doesn't get clogged with null values.
@@ -68,25 +70,27 @@ zone
air = null air = null
. = ..() . = ..()
//Handles deletion via garbage collection. //Handles deletion via garbage collection.
proc/SoftDelete() proc/SoftDelete()
zones.Remove(src) zones.Remove(src)
air = null air = null
//Ensuring the zone list doesn't get clogged with null values. //Ensuring the zone list doesn't get clogged with null values.
for(var/turf/simulated/T in contents) for(var/turf/simulated/T in contents)
RemoveTurf(T) RemoveTurf(T)
air_master.tiles_to_reconsider_zones += T air_master.tiles_to_reconsider_zones += T
//Removing zone connections and scheduling connection cleanup
for(var/zone/Z in connected_zones) for(var/zone/Z in connected_zones)
if(src in Z.connected_zones) if(src in Z.connected_zones)
Z.connected_zones.Remove(src) Z.connected_zones.Remove(src)
for(var/connection/C in connections) for(var/connection/C in connections)
if(C.zone_A == src)
C.zone_A = null
if(C.zone_B == src)
C.zone_B = null
air_master.connections_to_check += C air_master.connections_to_check += C
return 1 return 1
//ZONE MANAGEMENT FUNCTIONS //ZONE MANAGEMENT FUNCTIONS
proc/AddTurf(turf/T) proc/AddTurf(turf/T)
//Adds the turf to contents, increases the size of the zone, and sets the zone var. //Adds the turf to contents, increases the size of the zone, and sets the zone var.
@@ -270,7 +274,13 @@ zone/proc/process()
if(moles_delta > 0.1 || abs(air.temperature - Z.air.temperature) > 0.1) if(moles_delta > 0.1 || abs(air.temperature - Z.air.temperature) > 0.1)
if(abs(Z.air.return_pressure() - air.return_pressure()) > vsc.airflow_lightest_pressure) if(abs(Z.air.return_pressure() - air.return_pressure()) > vsc.airflow_lightest_pressure)
Airflow(src,Z) Airflow(src,Z)
ShareRatio( air , Z.air , connected_zones[Z] ) var/unsimulated_boost = 0
if(unsimulated_tiles)
unsimulated_boost += unsimulated_tiles.len
if(Z.unsimulated_tiles)
unsimulated_boost += Z.unsimulated_tiles.len
unsimulated_boost = min(3, unsimulated_boost)
ShareRatio( air , Z.air , connected_zones[Z] + unsimulated_boost)
for(var/zone/Z in closed_connection_zones) for(var/zone/Z in closed_connection_zones)
if(air && Z.air) if(air && Z.air)
@@ -371,7 +381,14 @@ proc/ShareSpace(datum/gas_mixture/A, list/unsimulated_tiles)
unsim_co2 += T.carbon_dioxide unsim_co2 += T.carbon_dioxide
unsim_nitrogen += T.nitrogen unsim_nitrogen += T.nitrogen
unsim_plasma += T.toxins unsim_plasma += T.toxins
unsim_heat_capacity += T.heat_capacity
// Make sure it actually has gas in it, and use the heat capacity of that.
// Space and unsimulated tiles do NOT have a heat capacity. Thus we don't
// add them. This means "space is not cold", which turns out just fine in
// gameplay terms.
if(istype(T, /turf/simulated))
unsim_heat_capacity += T:air.heat_capacity()
unsim_temperature += T.temperature/unsimulated_tiles.len unsim_temperature += T.temperature/unsimulated_tiles.len
var var
@@ -380,7 +397,14 @@ proc/ShareSpace(datum/gas_mixture/A, list/unsimulated_tiles)
old_pressure = A.return_pressure() old_pressure = A.return_pressure()
size = max(1,A.group_multiplier) size = max(1,A.group_multiplier)
share_size = max(1,unsimulated_tiles.len)
// We use the same size for the potentially single space tile
// as we use for the entire room. Why is this?
// Short answer: We do not want larger rooms to depressurize more
// slowly than small rooms, preserving our good old "hollywood-style"
// oh-shit effect when large rooms get breached, but still having small
// rooms remain pressurized for long enough to make escape possible.
share_size = max(1,size - 5 + unsimulated_tiles.len)
full_oxy = A.oxygen * size full_oxy = A.oxygen * size
full_nitro = A.nitrogen * size full_nitro = A.nitrogen * size

View File

@@ -15,6 +15,16 @@
if (config.log_admin) if (config.log_admin)
diary << "\[[time_stamp()]]ADMIN: [text]" diary << "\[[time_stamp()]]ADMIN: [text]"
/proc/log_debug(text)
if (config.log_debug)
diary << "\[[time_stamp()]]DEBUG: [text]"
for(var/client/C in admins)
if(C.prefs.toggles & CHAT_DEBUGLOGS)
C << "DEBUG: [text]"
/proc/log_game(text) /proc/log_game(text)
if (config.log_game) if (config.log_game)
diary << "\[[time_stamp()]]GAME: [text]" diary << "\[[time_stamp()]]GAME: [text]"

View File

@@ -140,7 +140,24 @@
return t_out return t_out
//checks text for html tags
//if tag is not in whitelist (var/list/paper_tag_whitelist in global.dm)
//relpaces < with &lt;
proc/checkhtml(var/t)
t = sanitize_simple(t, list("&#"="."))
var/p = findtext(t,"<",1)
while (p) //going through all the tags
var/start = p++
var/tag = copytext(t,p, p+1)
if (tag != "/")
while (reject_bad_text(copytext(t, p, p+1), 1))
tag = copytext(t,start, p)
p++
tag = copytext(t,start+1, p)
if (!(tag in paper_tag_whitelist)) //if it's unkown tag, disarming it
t = copytext(t,1,start-1) + "&lt;" + copytext(t,start+1)
p = findtext(t,"<",p)
return t
/* /*
* Text searches * Text searches
*/ */

View File

@@ -1327,6 +1327,7 @@ proc/is_hot(obj/item/W as obj)
//Is this even used for anything besides balloons? Yes I took out the W:lit stuff because : really shouldnt be used. //Is this even used for anything besides balloons? Yes I took out the W:lit stuff because : really shouldnt be used.
/proc/is_sharp(obj/item/W as obj) // For the record, WHAT THE HELL IS THIS METHOD OF DOING IT? /proc/is_sharp(obj/item/W as obj) // For the record, WHAT THE HELL IS THIS METHOD OF DOING IT?
if(W.sharp) return 1
return ( \ return ( \
W.sharp || \ W.sharp || \
istype(W, /obj/item/weapon/screwdriver) || \ istype(W, /obj/item/weapon/screwdriver) || \

View File

@@ -8,6 +8,7 @@
var/log_access = 0 // log login/logout var/log_access = 0 // log login/logout
var/log_say = 0 // log client say var/log_say = 0 // log client say
var/log_admin = 0 // log admin actions var/log_admin = 0 // log admin actions
var/log_debug = 1 // log debug output
var/log_game = 0 // log game events var/log_game = 0 // log game events
var/log_vote = 0 // log voting var/log_vote = 0 // log voting
var/log_whisper = 0 // log client whisper var/log_whisper = 0 // log client whisper
@@ -193,6 +194,9 @@
if ("log_admin") if ("log_admin")
config.log_admin = 1 config.log_admin = 1
if ("log_debug")
config.log_debug = text2num(value)
if ("log_game") if ("log_game")
config.log_game = 1 config.log_game = 1

View File

@@ -117,6 +117,7 @@ datum/controller/game_controller/proc/process()
controller_iteration++ controller_iteration++
vote.process() vote.process()
process_newscaster()
//AIR //AIR
@@ -132,11 +133,12 @@ datum/controller/game_controller/proc/process()
air_master.current_cycle++ air_master.current_cycle++
var/success = air_master.tick() //Changed so that a runtime does not crash the ticker. var/success = air_master.tick() //Changed so that a runtime does not crash the ticker.
if(!success) //Runtimed. if(!success) //Runtimed.
log_adminwarn("ZASALERT: air_system/tick() failed: [air_master.tick_progress]")
air_master.failed_ticks++ air_master.failed_ticks++
if(air_master.failed_ticks > 5) if(air_master.failed_ticks > 5)
world << "<font color='red'><b>RUNTIMES IN ATMOS TICKER. Killing air simulation!</font></b>" world << "<font color='red'><b>RUNTIMES IN ATMOS TICKER. Killing air simulation!</font></b>"
kill_air = 1 message_admins("ZASALERT: unable run [air_master.tick_progress], tell someone about this!")
log_admin("ZASALERT: unable run zone/process() -- [air_master.tick_progress]")
air_processing_killed = 1
air_master.failed_ticks = 0 air_master.failed_ticks = 0
air_cost = (world.timeofday - timer) / 10 air_cost = (world.timeofday - timer) / 10

View File

@@ -165,7 +165,7 @@ datum/controller/vote
proc/initiate_vote(var/vote_type, var/initiator_key) proc/initiate_vote(var/vote_type, var/initiator_key)
if(!mode) if(!mode)
if(started_time != null) if(started_time != null && !check_rights(R_ADMIN))
var/next_allowed_time = (started_time + config.vote_delay) var/next_allowed_time = (started_time + config.vote_delay)
if(next_allowed_time > world.time) if(next_allowed_time > world.time)
return 0 return 0
@@ -200,7 +200,13 @@ datum/controller/vote
log_vote(text) log_vote(text)
world << "<font color='purple'><b>[text]</b>\nType vote to place your votes.\nYou have [config.vote_period/10] seconds to vote.</font>" world << "<font color='purple'><b>[text]</b>\nType vote to place your votes.\nYou have [config.vote_period/10] seconds to vote.</font>"
world << sound('weapons/smg_empty_alarm.ogg') switch(vote_type)
if("crew_transfer")
world << sound('sound/voice/Serithi/Shuttlehere.ogg')
if("gamemode")
world << sound('sound/voice/Serithi/pretenddemoc.ogg')
if("custom")
world << sound('sound/voice/Serithi/weneedvote.ogg')
if(mode == "gamemode" && going) if(mode == "gamemode" && going)
going = 0 going = 0
world << "<font color='red'><b>Round start has been delayed.</b></font>" world << "<font color='red'><b>Round start has been delayed.</b></font>"

View File

@@ -696,7 +696,11 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
if (in_range) if (in_range)
if (!( human.restrained() || human.lying )) if (!( human.restrained() || human.lying ))
if (W) if (W)
attackby(W,human) var/was_used = 0
if(W)
was_used = W.is_used_on(src, human)
if(!was_used)
attackby(W,human)
if (W) if (W)
W.afterattack(src, human) W.afterattack(src, human)
else else

View File

@@ -112,6 +112,7 @@ var/list/radiochannels = list(
var/list/DEPT_FREQS = list(1351,1355,1357,1359,1213,1441,1347) var/list/DEPT_FREQS = list(1351,1355,1357,1359,1213,1441,1347)
var/const/COMM_FREQ = 1353 //command, colored gold in chat window var/const/COMM_FREQ = 1353 //command, colored gold in chat window
var/const/SYND_FREQ = 1213 var/const/SYND_FREQ = 1213
var/const/ERT_FREQ = 1439
#define TRANSMISSION_WIRE 0 #define TRANSMISSION_WIRE 0
#define TRANSMISSION_RADIO 1 #define TRANSMISSION_RADIO 1

View File

@@ -142,7 +142,7 @@
traitorcheckloop() traitorcheckloop()
/*
/datum/game_mode/traitor/autotraitor/latespawn(mob/living/carbon/human/character) /datum/game_mode/traitor/autotraitor/latespawn(mob/living/carbon/human/character)
..() ..()
if(emergency_shuttle.departed) if(emergency_shuttle.departed)
@@ -192,6 +192,5 @@
//message_admins("New traitor roll failed. No new traitor.") //message_admins("New traitor roll failed. No new traitor.")
//else //else
//message_admins("Late Joiner does not have Be Syndicate") //message_admins("Late Joiner does not have Be Syndicate")
*/

View File

@@ -27,6 +27,7 @@
var/required_players_secret = 0 //Minimum number of players for that game mode to be chose in Secret var/required_players_secret = 0 //Minimum number of players for that game mode to be chose in Secret
var/required_enemies = 0 var/required_enemies = 0
var/recommended_enemies = 0 var/recommended_enemies = 0
var/newscaster_announcements = null
var/uplink_welcome = "Syndicate Uplink Console:" var/uplink_welcome = "Syndicate Uplink Console:"
var/uplink_uses = 10 var/uplink_uses = 10
var/uplink_items = {"Highly Visible and Dangerous Weapons; var/uplink_items = {"Highly Visible and Dangerous Weapons;
@@ -290,6 +291,7 @@ Implants;
if(player.client.prefs.be_special & role) if(player.client.prefs.be_special & role)
if(!jobban_isbanned(player, "Syndicate") && !jobban_isbanned(player, roletext)) //Nodrak/Carn: Antag Job-bans if(!jobban_isbanned(player, "Syndicate") && !jobban_isbanned(player, roletext)) //Nodrak/Carn: Antag Job-bans
candidates += player.mind // Get a list of all the people who want to be the antagonist for this round candidates += player.mind // Get a list of all the people who want to be the antagonist for this round
log_debug("[player.key] had [roletext] enabled, so drafting them.")
if(restricted_jobs) if(restricted_jobs)
for(var/datum/mind/player in candidates) for(var/datum/mind/player in candidates)
@@ -317,6 +319,7 @@ Implants;
applicant = pick(drafted) applicant = pick(drafted)
if(applicant) if(applicant)
candidates += applicant candidates += applicant
log_debug("[applicant.key] was force-drafted as [roletext], because there aren't enough candidates.")
drafted.Remove(applicant) drafted.Remove(applicant)
else // Not enough scrubs, ABORT ABORT ABORT else // Not enough scrubs, ABORT ABORT ABORT
@@ -342,7 +345,7 @@ Implants;
if(applicant) if(applicant)
candidates += applicant candidates += applicant
drafted.Remove(applicant) drafted.Remove(applicant)
message_admins("[applicant.key] drafted into antagonist role against their preferences.") log_debug("[applicant.key] was force-drafted as [roletext], because there aren't enough candidates.")
else // Not enough scrubs, ABORT ABORT ABORT else // Not enough scrubs, ABORT ABORT ABORT
break break
@@ -351,9 +354,10 @@ Implants;
// recommended_enemies if the number of people with that role set to yes is less than recomended_enemies, // recommended_enemies if the number of people with that role set to yes is less than recomended_enemies,
// Less if there are not enough valid players in the game entirely to make recommended_enemies. // Less if there are not enough valid players in the game entirely to make recommended_enemies.
/*
/datum/game_mode/proc/latespawn(var/mob) /datum/game_mode/proc/latespawn(var/mob)
/*
/datum/game_mode/proc/check_player_role_pref(var/role, var/mob/new_player/player) /datum/game_mode/proc/check_player_role_pref(var/role, var/mob/new_player/player)
if(player.preferences.be_special & role) if(player.preferences.be_special & role)
return 1 return 1
@@ -388,6 +392,9 @@ Implants;
heads += player.mind heads += player.mind
return heads return heads
/datum/game_mode/New()
newscaster_announcements = pick(newscaster_standard_feeds)
////////////////////////// //////////////////////////
//Reports player logouts// //Reports player logouts//
////////////////////////// //////////////////////////

View File

@@ -8,6 +8,12 @@
required_enemies = 3 required_enemies = 3
recommended_enemies = 3 recommended_enemies = 3
uplink_welcome = "Revolutionary Uplink Console:"
uplink_uses = 5
newscaster_announcements = /datum/news_announcement/revolution_inciting_event
var/last_command_report = 0
var/list/heads = list() var/list/heads = list()
var/tried_to_add_revheads = 0 var/tried_to_add_revheads = 0
@@ -57,7 +63,7 @@
var/datum/objective/mutiny/rp/rev_obj = new var/datum/objective/mutiny/rp/rev_obj = new
rev_obj.owner = rev_mind rev_obj.owner = rev_mind
rev_obj.target = head_mind rev_obj.target = head_mind
rev_obj.explanation_text = "Assassinate or capture [head_mind.name], the [head_mind.assigned_role]." rev_obj.explanation_text = "Assassinate, convert or capture [head_mind.name], the [head_mind.assigned_role]."
rev_mind.objectives += rev_obj rev_mind.objectives += rev_obj
update_rev_icons_added(rev_mind) update_rev_icons_added(rev_mind)
@@ -65,6 +71,8 @@
for(var/datum/mind/rev_mind in head_revolutionaries) for(var/datum/mind/rev_mind in head_revolutionaries)
greet_revolutionary(rev_mind) greet_revolutionary(rev_mind)
rev_mind.current.verbs += /mob/living/carbon/human/proc/RevConvert rev_mind.current.verbs += /mob/living/carbon/human/proc/RevConvert
equip_traitor(rev_mind.current, 1) //changing how revs get assigned their uplink so they can get PDA uplinks. --NEO
modePlayer += head_revolutionaries modePlayer += head_revolutionaries
spawn (rand(waittime_l, waittime_h)) spawn (rand(waittime_l, waittime_h))
send_intercept() send_intercept()
@@ -183,8 +191,7 @@
active_revs++ active_revs++
if(active_revs == 0) if(active_revs == 0)
log_admin("There are zero active head revolutionists, trying to add some..") log_debug("There are zero active heads of revolution, trying to add some..")
message_admins("There are zero active head revolutionists, trying to add some..")
var/added_heads = 0 var/added_heads = 0
for(var/mob/living/carbon/human/H in world) if(H.client && H.mind && H.client.inactivity <= 10*60*20 && H.mind in revolutionaries) for(var/mob/living/carbon/human/H in world) if(H.client && H.mind && H.client.inactivity <= 10*60*20 && H.mind in revolutionaries)
head_revolutionaries += H.mind head_revolutionaries += H.mind
@@ -210,4 +217,38 @@
message_admins("Unable to add new heads of revolution.") message_admins("Unable to add new heads of revolution.")
tried_to_add_revheads = world.time + 6000 // wait 10 minutes tried_to_add_revheads = world.time + 6000 // wait 10 minutes
return ..() if(last_command_report == 0 && world.time >= 10 * 60 * 10)
src.command_report("We are regrettably announcing that your performance has been disappointing, and we are thus forced to cut down on financial support to your station. To achieve this, the pay of all personnal, except the Heads of Staff, has been halved.")
last_command_report = 1
else if(last_command_report == 1 && world.time >= 10 * 60 * 30)
src.command_report("Statistics hint that a high amount of leisure time, and associated activities, are responsible for the poor performance of many of our stations. You are to bolt and close down any leisure facilities, such as the holodeck, the theatre and the bar. Food can be distributed through vendors and the kitchen.")
last_command_report = 2
else if(last_command_report == 2 && world.time >= 10 * 60 * 60)
src.command_report("It is reported that merely closing down leisure facilities has not been successful. You and your Heads of Staff are to ensure that all crew are working hard, and not wasting time or energy. Any crew caught off duty without leave from their Head of Staff are to be warned, and on repeated offence, to be brigged until the next transfer shuttle arrives, which will take them to facilities where they can be of more use.")
last_command_report = 3
return ..()
/datum/game_mode/revolution/rp_revolution/proc/command_report(message)
for (var/obj/machinery/computer/communications/comm in world)
if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
intercept.name = "paper- 'Cent. Com. Announcement'"
intercept.info = message
comm.messagetitle.Add("Cent. Com. Announcement")
comm.messagetext.Add(message)
world << sound('commandreport.ogg')
/datum/game_mode/revolution/rp_revolution/latespawn(mob/M)
if(M.mind.assigned_role in command_positions)
log_debug("Adding head kill/capture/convert objective for [M.name]")
heads += M
for(var/datum/mind/rev_mind in head_revolutionaries)
var/datum/objective/mutiny/rp/rev_obj = new
rev_obj.owner = rev_mind
rev_obj.target = M.mind
rev_obj.explanation_text = "Assassinate, convert or capture [M.real_name], the [M.mind.assigned_role]."
rev_mind.objectives += rev_obj
rev_mind.current << "\red A new Head of Staff, [M.real_name], the [M.mind.assigned_role] has appeared. Your objectives have been updated."

View File

@@ -115,7 +115,7 @@
steal_objective.find_target() steal_objective.find_target()
traitor.objectives += steal_objective traitor.objectives += steal_objective
switch(rand(1,100)) switch(rand(1,100))
if(1 to 90) if(1 to 100)
if (!(locate(/datum/objective/escape) in traitor.objectives)) if (!(locate(/datum/objective/escape) in traitor.objectives))
var/datum/objective/escape/escape_objective = new var/datum/objective/escape/escape_objective = new
escape_objective.owner = traitor escape_objective.owner = traitor

View File

@@ -87,7 +87,7 @@
escape_objective.owner = wizard escape_objective.owner = wizard
wizard.objectives += escape_objective wizard.objectives += escape_objective
if(61 to 85) if(61 to 100)
var/datum/objective/assassinate/kill_objective = new var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = wizard kill_objective.owner = wizard
kill_objective.find_target() kill_objective.find_target()

View File

@@ -62,7 +62,7 @@
switch(H.mind.role_alt_title) switch(H.mind.role_alt_title)
if("Emergency Physician") if("Emergency Physician")
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/fr_jacket(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/fr_jacket(H), slot_wear_suit)
if("Surgeon") if("Surgeon")
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/blue(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/blue(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
@@ -215,4 +215,4 @@
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
return 1 return 1

View File

@@ -67,7 +67,7 @@
idle_power_usage = 4 idle_power_usage = 4
active_power_usage = 8 active_power_usage = 8
power_channel = ENVIRON power_channel = ENVIRON
req_access = list(access_atmospherics, access_engine_equip) req_one_access = list(access_atmospherics, access_engine_equip)
var/frequency = 1439 var/frequency = 1439
//var/skipprocess = 0 //Experimenting //var/skipprocess = 0 //Experimenting
var/alarm_frequency = 1437 var/alarm_frequency = 1437

View File

@@ -18,6 +18,14 @@
use_power = 0 use_power = 0
var/release_log = "" var/release_log = ""
/obj/machinery/portable_atmospherics/initialize()
. = ..()
spawn()
var/obj/machinery/atmospherics/portables_connector/connector = locate() in loc
if(connector)
connected_port = connector
update_icon()
/obj/machinery/portable_atmospherics/canister/sleeping_agent /obj/machinery/portable_atmospherics/canister/sleeping_agent
name = "Canister: \[N2O\]" name = "Canister: \[N2O\]"
icon_state = "redws" icon_state = "redws"

View File

@@ -1169,7 +1169,7 @@ About the new airlock wires panel:
return return
src.add_fingerprint(user) src.add_fingerprint(user)
if((istype(C, /obj/item/weapon/weldingtool) && !( src.operating ) && src.density)) if((istype(C, /obj/item/weapon/weldingtool) && !( src.operating > 0 ) && src.density))
var/obj/item/weapon/weldingtool/W = C var/obj/item/weapon/weldingtool/W = C
if(W.remove_fuel(0,user)) if(W.remove_fuel(0,user))
if(!src.welded) if(!src.welded)
@@ -1198,7 +1198,7 @@ About the new airlock wires panel:
beingcrowbarred = 1 //derp, Agouri beingcrowbarred = 1 //derp, Agouri
else else
beingcrowbarred = 0 beingcrowbarred = 0
if( beingcrowbarred && (density && welded && !operating && src.p_open && (!src.arePowerSystemsOn() || stat & NOPOWER) && !src.locked) ) if( beingcrowbarred && (operating == -1 || density && welded && operating != 1 && src.p_open && (!src.arePowerSystemsOn() || stat & NOPOWER) && !src.locked) )
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.")
if(do_after(user,40)) if(do_after(user,40))
@@ -1243,6 +1243,9 @@ About the new airlock wires panel:
ae = electronics ae = electronics
electronics = null electronics = null
ae.loc = src.loc ae.loc = src.loc
if(operating == -1)
ae.icon_state = "door_electronics_smoked"
operating = 0
del(src) del(src)
return return

View File

@@ -18,6 +18,7 @@
var/glass = 0 var/glass = 0
var/normalspeed = 1 var/normalspeed = 1
var/heat_proof = 0 // For glass airlocks/opacity firedoors var/heat_proof = 0 // For glass airlocks/opacity firedoors
var/air_properties_vary_with_direction = 0
/obj/machinery/door/New() /obj/machinery/door/New()
..() ..()
@@ -218,7 +219,7 @@
/obj/machinery/door/proc/close() /obj/machinery/door/proc/close()
if(density) return 1 if(density) return 1
if(operating) return if(operating > 0) return
operating = 1 operating = 1
animate("closing") animate("closing")

View File

@@ -234,6 +234,7 @@
glass = 1 //There is a glass window so you can see through the door glass = 1 //There is a glass window so you can see through the door
//This is needed due to BYOND limitations in controlling visibility //This is needed due to BYOND limitations in controlling visibility
heat_proof = 1 heat_proof = 1
air_properties_vary_with_direction = 1
CanPass(atom/movable/mover, turf/target, height=0, air_group=0) CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(istype(mover) && mover.checkpass(PASSGLASS)) if(istype(mover) && mover.checkpass(PASSGLASS))

View File

@@ -11,6 +11,7 @@
opacity = 0 opacity = 0
var/obj/item/weapon/airlock_electronics/electronics = null var/obj/item/weapon/airlock_electronics/electronics = null
explosion_resistance = 5 explosion_resistance = 5
air_properties_vary_with_direction = 1
/obj/machinery/door/window/update_nearby_tiles(need_rebuild) /obj/machinery/door/window/update_nearby_tiles(need_rebuild)

View File

@@ -153,6 +153,7 @@ obj/machinery/embedded_controller/radio/access_controller
name = "Access Console" name = "Access Console"
density = 0 density = 0
power_channel = ENVIRON power_channel = ENVIRON
unacidable = 1
frequency = 1449 frequency = 1449

View File

@@ -262,6 +262,7 @@ obj/machinery/embedded_controller/radio/airlock_controller
name = "Airlock Console" name = "Airlock Console"
density = 0 density = 0
unacidable = 1
frequency = 1449 frequency = 1449
power_channel = ENVIRON power_channel = ENVIRON

View File

@@ -44,6 +44,7 @@
name = "Vent Controller" name = "Vent Controller"
density = 0 density = 0
unacidable = 1
frequency = 1229 frequency = 1229
power_channel = ENVIRON power_channel = ENVIRON

View File

@@ -252,7 +252,7 @@ obj/machinery/embedded_controller/radio/smart_airlock_controller
name = "Cycling Airlock Console" name = "Cycling Airlock Console"
density = 0 density = 0
unacidable = 1
frequency = 1449 frequency = 1449
power_channel = ENVIRON power_channel = ENVIRON

View File

@@ -99,4 +99,32 @@ obj/machinery/recharger/update_icon() //we have an update_icon() in addition to
if(charging) if(charging)
icon_state = "recharger1" icon_state = "recharger1"
else else
icon_state = "recharger0" icon_state = "recharger0"
obj/machinery/recharger/wallcharger
name = "wall recharger"
icon = 'icons/obj/stationobjs.dmi'
icon_state = "wrecharger0"
obj/machinery/recharger/wallcharger/process()
if(stat & (NOPOWER|BROKEN) || !anchored)
return
if(charging)
if(istype(charging, /obj/item/weapon/gun/energy))
var/obj/item/weapon/gun/energy/E = charging
if(E.power_supply.charge < E.power_supply.maxcharge)
E.power_supply.give(100)
icon_state = "wrecharger1"
use_power(250)
else
icon_state = "wrecharger2"
return
if(istype(charging, /obj/item/weapon/melee/baton))
var/obj/item/weapon/melee/baton/B = charging
if(B.charges < initial(B.charges))
B.charges++
icon_state = "wrecharger1"
use_power(150)
else
icon_state = "wrecharger2"

View File

@@ -148,6 +148,15 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
signal.data["radio"], signal.data["message"], signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"], signal.data["name"], signal.data["job"],
signal.data["realname"], signal.data["vname"],, signal.data["compression"], list(0), connection.frequency) signal.data["realname"], signal.data["vname"],, signal.data["compression"], list(0), connection.frequency)
if(connection.frequency == ERT_FREQ)
Broadcast_Message(signal.data["connection"], signal.data["mob"],
signal.data["vmask"], signal.data["vmessage"],
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
signal.data["realname"], signal.data["vname"],, signal.data["compression"], list(0), connection.frequency)
else else
if(intercept) if(intercept)
Broadcast_Message(signal.data["connection"], signal.data["mob"], Broadcast_Message(signal.data["connection"], signal.data["mob"],

View File

@@ -24,12 +24,18 @@
toggled = 0 toggled = 0
autolinkers = list("r_relay") autolinkers = list("r_relay")
/obj/machinery/telecomms/relay/preset/centcom
id = "Centcom Relay"
hide = 1
toggled = 0
autolinkers = list("c_relay")
//HUB //HUB
/obj/machinery/telecomms/hub/preset /obj/machinery/telecomms/hub/preset
id = "Hub" id = "Hub"
network = "tcommsat" network = "tcommsat"
autolinkers = list("hub", "relay", "s_relay", "m_relay", "r_relay", "science", "medical", autolinkers = list("hub", "relay", "c_relay", "s_relay", "m_relay", "r_relay", "science", "medical",
"supply", "common", "command", "engineering", "security", "supply", "common", "command", "engineering", "security",
"receiverA", "receiverB", "broadcasterA", "broadcasterB") "receiverA", "receiverB", "broadcasterA", "broadcasterB")

View File

@@ -84,3 +84,45 @@
icon_state = icon_closed icon_state = icon_closed
else else
icon_state = icon_opened icon_state = icon_opened
/obj/item/bodybag/cryobag
name = "stasis bag"
desc = "A folded, non-reusable bag designed for the preservation of an occupant's brain by stasis."
icon = 'icons/obj/cryobag.dmi'
icon_state = "bodybag_folded"
attack_self(mob/user)
var/obj/structure/closet/body_bag/cryobag/R = new /obj/structure/closet/body_bag/cryobag(user.loc)
R.add_fingerprint(user)
del(src)
/obj/structure/closet/body_bag/cryobag
name = "stasis bag"
desc = "A non-reusable plastic bag designed for the preservation of an occupant's brain by stasis."
icon = 'icons/obj/cryobag.dmi'
icon_state = "bodybag_closed"
icon_closed = "bodybag_closed"
icon_opened = "bodybag_open"
density = 0
var/used = 0
open()
. = ..()
if(used)
var/obj/item/O = new/obj/item(src.loc)
O.name = "used stasis bag"
O.icon = src.icon
O.icon_state = "bodybag_used"
O.desc = "Pretty useless now.."
del(src)
MouseDrop(over_object, src_location, over_location)
if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src))))
if(!ishuman(usr)) return
usr << "\red You can't fold that up anymore.."
..()

View File

@@ -0,0 +1,45 @@
/**
* Multitool -- A multitool is used for hacking electronic devices.
* TO-DO -- Using it as a power measurement tool for cables etc. Nannek.
*
*/
/obj/item/device/debugger
icon = 'icons/obj/hacktool.dmi'
name = "debugger"
desc = "Used to debug electronic equipment."
icon_state = "hacktool-g"
flags = FPRINT | TABLEPASS| CONDUCT
force = 5.0
w_class = 2.0
throwforce = 5.0
throw_range = 15
throw_speed = 3
desc = "You can use this on airlocks or APCs to try to hack them without cutting wires."
m_amt = 50
g_amt = 20
origin_tech = "magnets=1;engineering=1"
var/obj/machinery/telecomms/buffer // simple machine buffer for device linkage
/obj/item/device/debugger/is_used_on(obj/O, mob/user)
if(istype(O, /obj/machinery/power/apc))
var/obj/machinery/power/apc/A = O
if(A.emagged || A.malfhack)
user << "\red There is a software error with the device."
else
user << "\blue The device's software appears to be fine."
return 1
if(istype(O, /obj/machinery/door))
var/obj/machinery/door/D = O
if(D.operating == -1)
user << "\red There is a software error with the device."
else
user << "\blue The device's software appears to be fine."
return 1
else if(istype(O, /obj/machinery))
var/obj/machinery/A = O
if(A.emagged)
user << "\red There is a software error with the device."
else
user << "\blue The device's software appears to be fine."
return 1

View File

@@ -76,9 +76,9 @@
M.updatehealth() M.updatehealth()
/obj/item/stack/medical/bruise_pack /obj/item/stack/medical/bruise_pack
name = "bruise pack" name = "roll of gauze"
singular_name = "bruise pack" singular_name = "gauze length"
desc = "A pack designed to treat blunt-force trauma." desc = "Some sterile gauze to wrap around bloody stumps."
icon_state = "brutepack" icon_state = "brutepack"
heal_brute = 60 heal_brute = 60
origin_tech = "biotech=1" origin_tech = "biotech=1"

View File

@@ -119,7 +119,7 @@
/obj/item/weapon/card/id/syndicate /obj/item/weapon/card/id/syndicate
name = "agent card" name = "agent card"
access = list(access_maint_tunnels, access_syndicate) access = list(access_maint_tunnels, access_syndicate, access_external_airlocks)
origin_tech = "syndicate=3" origin_tech = "syndicate=3"
/obj/item/weapon/card/id/syndicate/afterattack(var/obj/item/weapon/O as obj, mob/user as mob) /obj/item/weapon/card/id/syndicate/afterattack(var/obj/item/weapon/O as obj, mob/user as mob)
@@ -156,7 +156,7 @@
desc = "An ID straight from the Syndicate." desc = "An ID straight from the Syndicate."
registered_name = "Syndicate" registered_name = "Syndicate"
assignment = "Syndicate Overlord" assignment = "Syndicate Overlord"
access = list(access_syndicate) access = list(access_syndicate, access_external_airlocks)
/obj/item/weapon/card/id/captains_spare /obj/item/weapon/card/id/captains_spare
name = "captain's spare ID" name = "captain's spare ID"

View File

@@ -16,6 +16,8 @@
var/damtype = "brute" var/damtype = "brute"
var/force = 0 var/force = 0
/obj/item/proc/is_used_on(obj/O, mob/user)
/obj/proc/process() /obj/proc/process()
processing_objects.Remove(src) processing_objects.Remove(src)
return 0 return 0

View File

@@ -94,7 +94,7 @@
new /obj/item/clothing/under/rank/nurse(src) new /obj/item/clothing/under/rank/nurse(src)
new /obj/item/clothing/under/rank/orderly(src) new /obj/item/clothing/under/rank/orderly(src)
new /obj/item/clothing/suit/storage/labcoat(src) new /obj/item/clothing/suit/storage/labcoat(src)
new /obj/item/clothing/suit/fr_jacket(src) new /obj/item/clothing/suit/storage/fr_jacket(src)
new /obj/item/clothing/shoes/white(src) new /obj/item/clothing/shoes/white(src)
// new /obj/item/weapon/cartridge/medical(src) // new /obj/item/weapon/cartridge/medical(src)
new /obj/item/device/radio/headset/headset_med(src) new /obj/item/device/radio/headset/headset_med(src)

View File

@@ -349,7 +349,7 @@ obj/structure/door_assembly
src.state = 0 src.state = 0
src.name = "Secured Airlock Assembly" src.name = "Secured Airlock Assembly"
else if(istype(W, /obj/item/weapon/airlock_electronics) && state == 1 ) else if(istype(W, /obj/item/weapon/airlock_electronics) && state == 1 && W:icon_state != "door_electronics_smoked")
playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly.") user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly.")
user.drop_item() user.drop_item()

View File

@@ -3,6 +3,7 @@
desc = "A huge chunk of metal used to seperate rooms." desc = "A huge chunk of metal used to seperate rooms."
icon = 'icons/turf/walls.dmi' icon = 'icons/turf/walls.dmi'
var/mineral = "metal" var/mineral = "metal"
var/rotting = 0
opacity = 1 opacity = 1
density = 1 density = 1
blocks_air = 1 blocks_air = 1
@@ -59,9 +60,11 @@
P.roll_and_drop(src) P.roll_and_drop(src)
else else
O.loc = src O.loc = src
ChangeTurf(/turf/simulated/floor/plating) ChangeTurf(/turf/simulated/floor/plating)
/turf/simulated/wall/ex_act(severity) /turf/simulated/wall/ex_act(severity)
if(rotting) severity = 1.0
switch(severity) switch(severity)
if(1.0) if(1.0)
//SN src = null //SN src = null
@@ -84,7 +87,7 @@
return return
/turf/simulated/wall/blob_act() /turf/simulated/wall/blob_act()
if(prob(50)) if(prob(50) || rotting)
dismantle_wall() dismantle_wall()
/turf/simulated/wall/attack_paw(mob/user as mob) /turf/simulated/wall/attack_paw(mob/user as mob)
@@ -103,11 +106,11 @@
/turf/simulated/wall/attack_animal(mob/living/simple_animal/M as mob) /turf/simulated/wall/attack_animal(mob/living/simple_animal/M as mob)
if(M.wall_smash) if(M.wall_smash)
if (istype(src, /turf/simulated/wall/r_wall)) if (istype(src, /turf/simulated/wall/r_wall) && !rotting)
M << text("\blue This wall is far too strong for you to destroy.") M << text("\blue This wall is far too strong for you to destroy.")
return return
else else
if (prob(40)) if (prob(40) || rotting)
M << text("\blue You smash through the wall.") M << text("\blue You smash through the wall.")
dismantle_wall(1) dismantle_wall(1)
return return
@@ -120,7 +123,7 @@
/turf/simulated/wall/attack_hand(mob/user as mob) /turf/simulated/wall/attack_hand(mob/user as mob)
if (HULK in user.mutations) if (HULK in user.mutations)
if (prob(40)) if (prob(40) || rotting)
usr << text("\blue You smash through the wall.") usr << text("\blue You smash through the wall.")
usr.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) usr.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
dismantle_wall(1) dismantle_wall(1)
@@ -129,6 +132,11 @@
usr << text("\blue You punch the wall.") usr << text("\blue You punch the wall.")
return return
if(rotting)
user << "\blue The wall crumbles under your touch."
dismantle_wall()
return
user << "\blue You push the wall but nothing happens!" user << "\blue You push the wall but nothing happens!"
playsound(src.loc, 'sound/weapons/Genhit.ogg', 25, 1) playsound(src.loc, 'sound/weapons/Genhit.ogg', 25, 1)
src.add_fingerprint(user) src.add_fingerprint(user)
@@ -143,6 +151,21 @@
//get the user's location //get the user's location
if( !istype(user.loc, /turf) ) return //can't do this stuff whilst inside objects and such if( !istype(user.loc, /turf) ) return //can't do this stuff whilst inside objects and such
if(rotting)
if(istype(W, /obj/item/weapon/weldingtool) )
var/obj/item/weapon/weldingtool/WT = W
if( WT.remove_fuel(0,user) )
user << "<span class='notice'>You burn away the fungi with \the [WT].</span>"
playsound(src.loc, 'sound/items/Welder.ogg', 10, 1)
for(var/obj/effect/E in src) if(E.name == "Wallrot")
del E
rotting = 0
return
else if(!is_sharp(W) && W.force >= 10 || W.force >= 20)
user << "<span class='notice'>\The [src] crumbles away under the force of your [W.name].</span>"
src.dismantle_wall(1)
return
//THERMITE related stuff. Calls src.thermitemelt() which handles melting simulated walls and the relevant effects //THERMITE related stuff. Calls src.thermitemelt() which handles melting simulated walls and the relevant effects
if( thermite ) if( thermite )
if( istype(W, /obj/item/weapon/weldingtool) ) if( istype(W, /obj/item/weapon/weldingtool) )
@@ -284,6 +307,24 @@
return attack_hand(user) return attack_hand(user)
return return
// Wall-rot effect, a nasty fungus that destroys walls.
/turf/simulated/wall/proc/rot()
if(!rotting)
rotting = 1
var/number_rots = rand(2,3)
for(var/i=0, i<number_rots, i++)
var/obj/effect/overlay/O = new/obj/effect/overlay( src )
O.name = "Wallrot"
O.desc = "Ick..."
O.icon = 'icons/effects/wallrot.dmi'
O.pixel_x += rand(-10, 10)
O.pixel_y += rand(-10, 10)
O.anchored = 1
O.density = 1
O.layer = 5
O.mouse_opacity = 0
/turf/simulated/wall/proc/thermitemelt(mob/user as mob) /turf/simulated/wall/proc/thermitemelt(mob/user as mob)
if(mineral == "diamond") if(mineral == "diamond")
return return
@@ -307,10 +348,18 @@
return return
/turf/simulated/wall/meteorhit(obj/M as obj) /turf/simulated/wall/meteorhit(obj/M as obj)
if (prob(15)) if (prob(15) && !rotting)
dismantle_wall() dismantle_wall()
else if(prob(70)) else if(prob(70) && !rotting)
ChangeTurf(/turf/simulated/floor/plating) ChangeTurf(/turf/simulated/floor/plating)
else else
ReplaceWithLattice() ReplaceWithLattice()
return 0 return 0
/turf/simulated/wall/Del()
for(var/obj/effect/E in src) if(E.name == "Wallrot") del E
..()
/turf/simulated/wall/ChangeTurf(var/newtype)
for(var/obj/effect/E in src) if(E.name == "Wallrot") del E
..(newtype)

View File

@@ -11,7 +11,7 @@
/turf/simulated/wall/r_wall/attack_hand(mob/user as mob) /turf/simulated/wall/r_wall/attack_hand(mob/user as mob)
if (HULK in user.mutations) if (HULK in user.mutations)
if (prob(10)) if (prob(10) || rotting)
usr << text("\blue You smash through the wall.") usr << text("\blue You smash through the wall.")
usr.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) usr.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
dismantle_wall(1) dismantle_wall(1)
@@ -20,6 +20,10 @@
usr << text("\blue You punch the wall.") usr << text("\blue You punch the wall.")
return return
if(rotting)
user << "\blue This wall feels rather unstable."
return
user << "\blue You push the wall but nothing happens!" user << "\blue You push the wall but nothing happens!"
playsound(src.loc, 'sound/weapons/Genhit.ogg', 25, 1) playsound(src.loc, 'sound/weapons/Genhit.ogg', 25, 1)
src.add_fingerprint(user) src.add_fingerprint(user)
@@ -35,6 +39,20 @@
//get the user's location //get the user's location
if( !istype(user.loc, /turf) ) return //can't do this stuff whilst inside objects and such if( !istype(user.loc, /turf) ) return //can't do this stuff whilst inside objects and such
if(rotting)
if(istype(W, /obj/item/weapon/weldingtool) )
var/obj/item/weapon/weldingtool/WT = W
if( WT.remove_fuel(0,user) )
user << "<span class='notice'>You burn away the fungi with \the [WT].</span>"
playsound(src.loc, 'sound/items/Welder.ogg', 10, 1)
for(var/obj/effect/E in src) if(E.name == "Wallrot")
del E
rotting = 0
return
else if(!is_sharp(W) && W.force >= 10 || W.force >= 20)
user << "<span class='notice'>\The [src] crumbles away under the force of your [W.name].</span>"
src.dismantle_wall()
return
//THERMITE related stuff. Calls src.thermitemelt() which handles melting simulated walls and the relevant effects //THERMITE related stuff. Calls src.thermitemelt() which handles melting simulated walls and the relevant effects
if( thermite ) if( thermite )

View File

@@ -27,6 +27,12 @@ var/global/list/global_map = null
////////////// //////////////
var/list/paper_tag_whitelist = list("center","p","div","span","h1","h2","h3","h4","h5","h6","hr","pre", \
"big","small","font","i","u","b","s","sub","sup","tt","br","hr","ol","ul","li","caption","col", \
"table","td","th","tr")
var/list/paper_blacklist = list("java","onblur","onchange","onclick","ondblclick","onfocus","onkeydown", \
"onkeypress","onkeyup","onload","onmousedown","onmousemove","onmouseout","onmouseover", \
"onmouseup","onreset","onselect","onsubmit","onunload")
var/BLINDBLOCK = 0 var/BLINDBLOCK = 0
var/DEAFBLOCK = 0 var/DEAFBLOCK = 0

View File

@@ -64,6 +64,7 @@ var/list/admin_verbs_admin = list(
/client/proc/cmd_admin_change_custom_event, /client/proc/cmd_admin_change_custom_event,
/client/proc/cmd_admin_rejuvenate, /client/proc/cmd_admin_rejuvenate,
/client/proc/toggleattacklogs, /client/proc/toggleattacklogs,
/client/proc/toggledebuglogs,
/datum/admins/proc/show_skills, /datum/admins/proc/show_skills,
/client/proc/check_customitem_activity /client/proc/check_customitem_activity
) )
@@ -134,7 +135,8 @@ var/list/admin_verbs_debug = list(
/client/proc/reload_admins, /client/proc/reload_admins,
/client/proc/restart_controller, /client/proc/restart_controller,
/client/proc/enable_debug_verbs, /client/proc/enable_debug_verbs,
/client/proc/callproc /client/proc/callproc,
/client/proc/toggledebuglogs
) )
var/list/admin_verbs_possess = list( var/list/admin_verbs_possess = list(
/proc/possess, /proc/possess,
@@ -222,6 +224,7 @@ var/list/admin_verbs_mod = list(
/client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/ /client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
/client/proc/cmd_admin_pm_panel, /*admin-pm list*/ /client/proc/cmd_admin_pm_panel, /*admin-pm list*/
/client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game.*/ /client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game.*/
/client/proc/toggledebuglogs,
/datum/admins/proc/PlayerNotes, /datum/admins/proc/PlayerNotes,
/client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/ /client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/
/client/proc/cmd_mod_say, /client/proc/cmd_mod_say,
@@ -721,4 +724,15 @@ var/list/admin_verbs_mod = list(
if (prefs.toggles & CHAT_ATTACKLOGS) if (prefs.toggles & CHAT_ATTACKLOGS)
usr << "You now will get attack log messages" usr << "You now will get attack log messages"
else else
usr << "You now won't get attack log messages" usr << "You now won't get attack log messages"
/client/proc/toggledebuglogs()
set name = "Toggle Debug Log Messages"
set category = "Preferences"
prefs.toggles ^= CHAT_DEBUGLOGS
if (prefs.toggles & CHAT_DEBUGLOGS)
usr << "You now will get debug log messages"
else
usr << "You now won't get debug log messages"

View File

@@ -158,7 +158,7 @@
icon_state = "suspenders" icon_state = "suspenders"
blood_overlay_type = "armor" //it's the less thing that I can put here blood_overlay_type = "armor" //it's the less thing that I can put here
/obj/item/clothing/suit/fr_jacket /obj/item/clothing/suit/storage/fr_jacket
name = "first responder jacket" name = "first responder jacket"
desc = "A high-visibility jacket worn by medical first responders." desc = "A high-visibility jacket worn by medical first responders."
icon_state = "fr_jacket_open" icon_state = "fr_jacket_open"

View File

@@ -20,6 +20,8 @@
sleep(2400) sleep(2400)
*/ */
var/list/event_last_fired = list()
//Always triggers an event when called, dynamically chooses events based on job population //Always triggers an event when called, dynamically chooses events based on job population
/proc/spawn_dynamic_event() /proc/spawn_dynamic_event()
if(!config.allow_random_events) if(!config.allow_random_events)
@@ -61,6 +63,7 @@
possibleEvents[/datum/event/ionstorm] = 25 + active_with_role["AI"] * 25 + active_with_role["Cyborg"] * 25 + active_with_role["Engineer"] * 10 + active_with_role["Scientist"] * 5 possibleEvents[/datum/event/ionstorm] = 25 + active_with_role["AI"] * 25 + active_with_role["Cyborg"] * 25 + active_with_role["Engineer"] * 10 + active_with_role["Scientist"] * 5
possibleEvents[/datum/event/grid_check] = 25 + 10 * active_with_role["Engineer"] possibleEvents[/datum/event/grid_check] = 25 + 10 * active_with_role["Engineer"]
possibleEvents[/datum/event/electrical_storm] = 75 + 25 * active_with_role["Janitor"] + 5 * active_with_role["Engineer"] possibleEvents[/datum/event/electrical_storm] = 75 + 25 * active_with_role["Janitor"] + 5 * active_with_role["Engineer"]
possibleEvents[/datum/event/wallrot] = 50 * active_with_role["Engineer"] + 100 * active_with_role["Botanist"]
if(!spacevines_spawned) if(!spacevines_spawned)
possibleEvents[/datum/event/spacevine] = 5 + 10 * active_with_role["Engineer"] possibleEvents[/datum/event/spacevine] = 5 + 10 * active_with_role["Engineer"]
@@ -69,11 +72,12 @@
possibleEvents[/datum/event/meteor_shower] = 80 * active_with_role["Engineer"] possibleEvents[/datum/event/meteor_shower] = 80 * active_with_role["Engineer"]
possibleEvents[/datum/event/blob] = 30 * active_with_role["Engineer"] possibleEvents[/datum/event/blob] = 30 * active_with_role["Engineer"]
possibleEvents[/datum/event/viral_infection] = 25 + active_with_role["Medical"] * 25 possibleEvents[/datum/event/viral_infection] = 25 + active_with_role["Medical"] * 100
if(active_with_role["Medical"] > 0) if(active_with_role["Medical"] > 0)
possibleEvents[/datum/event/radiation_storm] = active_with_role["Medical"] * 100 possibleEvents[/datum/event/radiation_storm] = active_with_role["Medical"] * 100
possibleEvents[/datum/event/spontaneous_appendicitis] = active_with_role["Medical"] * 75 possibleEvents[/datum/event/spontaneous_appendicitis] = active_with_role["Medical"] * 150
possibleEvents[/datum/event/viral_outbreak] = active_with_role["Medical"] * 5 possibleEvents[/datum/event/viral_outbreak] = active_with_role["Medical"] * 10
possibleEvents[/datum/event/organ_failure] = active_with_role["Medical"] * 50
possibleEvents[/datum/event/prison_break] = active_with_role["Security"] * 50 possibleEvents[/datum/event/prison_break] = active_with_role["Security"] * 50
if(active_with_role["Security"] > 0) if(active_with_role["Security"] > 0)
@@ -84,16 +88,26 @@
if(!sent_ninja_to_station && toggle_space_ninja) if(!sent_ninja_to_station && toggle_space_ninja)
possibleEvents[/datum/event/space_ninja] = max(active_with_role["Security"], 5) possibleEvents[/datum/event/space_ninja] = max(active_with_role["Security"], 5)
for(var/event_type in event_last_fired) if(possibleEvents[event_type])
var/time_passed = world.time - event_last_fired[event_type]
var/full_recharge_after = 60 * 60 * 10 * 3 // 3 hours
var/weight_modifier = max(0, (full_recharge_after - time_passed) / 300)
possibleEvents[event_type] = max(possibleEvents[event_type] - weight_modifier, 0)
var/picked_event = pickweight(possibleEvents)
event_last_fired[picked_event] = world.time
// Debug code below here, very useful for testing so don't delete please. // Debug code below here, very useful for testing so don't delete please.
/*var/debug_message = "Firing random event. " var/debug_message = "Firing random event. "
for(var/V in active_with_role) for(var/V in active_with_role)
debug_message += "#[V]:[active_with_role[V]] " debug_message += "#[V]:[active_with_role[V]] "
debug_message += "||| " debug_message += "||| "
for(var/V in possibleEvents) for(var/V in possibleEvents)
debug_message += "[V]:[possibleEvents[V]]" debug_message += "[V]:[possibleEvents[V]]"
message_admins(debug_message)*/ debug_message += "|||Picked:[picked_event]"
log_debug(debug_message)
var/picked_event = pickweight(possibleEvents)
if(!picked_event) if(!picked_event)
return return
@@ -176,6 +190,7 @@
active_with_role["AI"] = 0 active_with_role["AI"] = 0
active_with_role["Cyborg"] = 0 active_with_role["Cyborg"] = 0
active_with_role["Janitor"] = 0 active_with_role["Janitor"] = 0
active_with_role["Botanist"] = 0
for(var/mob/M in player_list) for(var/mob/M in player_list)
if(!M.mind || !M.client || M.client.inactivity > 10 * 10 * 60) // longer than 10 minutes AFK counts them as inactive if(!M.mind || !M.client || M.client.inactivity > 10 * 10 * 60) // longer than 10 minutes AFK counts them as inactive
@@ -208,4 +223,7 @@
if(M.mind.assigned_role == "Janitor") if(M.mind.assigned_role == "Janitor")
active_with_role["Janitor"]++ active_with_role["Janitor"]++
if(M.mind.assigned_role == "Botanist")
active_with_role["Botanist"]++
return active_with_role return active_with_role

View File

@@ -2,8 +2,8 @@ var/list/allEvents = typesof(/datum/event) - /datum/event
var/list/potentialRandomEvents = typesof(/datum/event) - /datum/event var/list/potentialRandomEvents = typesof(/datum/event) - /datum/event
//var/list/potentialRandomEvents = typesof(/datum/event) - /datum/event - /datum/event/spider_infestation - /datum/event/alien_infestation //var/list/potentialRandomEvents = typesof(/datum/event) - /datum/event - /datum/event/spider_infestation - /datum/event/alien_infestation
var/eventTimeLower = 10000 //15 minutes var/eventTimeLower = 6000 //10 minutes
var/eventTimeUpper = 25000 //30 minutes var/eventTimeUpper = 12000 //15 minutes
var/scheduledEvent = null var/scheduledEvent = null
@@ -30,7 +30,9 @@ var/scheduledEvent = null
playercount_modifier = 0.9 playercount_modifier = 0.9
if(36 to 100000) if(36 to 100000)
playercount_modifier = 0.8 playercount_modifier = 0.8
scheduledEvent = world.timeofday + rand(eventTimeLower, eventTimeUpper) * playercount_modifier var/next_event_delay = rand(eventTimeLower, eventTimeUpper) * playercount_modifier
scheduledEvent = world.timeofday + next_event_delay
log_debug("Next event in [next_event_delay/600] minutes.")
else if(world.timeofday > scheduledEvent) else if(world.timeofday > scheduledEvent)
spawn_dynamic_event() spawn_dynamic_event()

View File

@@ -0,0 +1,28 @@
datum/event/organ_failure
var/severity = 1
datum/event/organ_failure/setup()
announceWhen = rand(0, 300)
endWhen = announceWhen + 1
severity = rand(1, 3)
datum/event/organ_failure/announce()
command_alert("Confirmed outbreak of level [rand(3,7)] biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
world << sound('sound/AI/outbreak5.ogg')
datum/event/organ_failure/start()
var/list/candidates = list() //list of candidate keys
for(var/mob/living/carbon/human/G in player_list)
if(G.mind && G.mind.current && G.mind.current.stat != DEAD && G.health > 70)
candidates += G
if(!candidates.len) return
candidates = shuffle(candidates)//Incorporating Donkie's list shuffle
while(severity > 0 && candidates.len)
var/mob/living/carbon/human/C = candidates[1]
// Bruise one of their organs
var/datum/organ/internal/I = pick(C.internal_organs)
I.damage = I.min_bruised_damage
candidates.Remove(C)
severity--

View File

@@ -1,36 +1,45 @@
/datum/event/radiation_storm /datum/event/radiation_storm
announceWhen = 5 announceWhen = 1
oneShot = 1 oneShot = 1
/datum/event/radiation_storm/announce() /datum/event/radiation_storm/announce()
command_alert("High levels of radiation detected near the station. Please report to the Med-bay if you feel strange.", "Anomaly Alert") // Don't do anything, we want to pack the announcement with the actual event
world << sound('sound/AI/radiation.ogg')
/datum/event/radiation_storm/start() /datum/event/radiation_storm/start()
for(var/mob/living/carbon/human/H in living_mob_list) spawn()
var/turf/T = get_turf(H) command_alert("High levels of radiation detected near the station. Please evacuate into one of the shielded maintenance tunnels.", "Anomaly Alert")
if(!T)
continue
if(T.z != 1)
continue
if(istype(H,/mob/living/carbon/human))
H.apply_effect((rand(15,75)),IRRADIATE,0)
if(prob(5))
H.apply_effect((rand(90,150)),IRRADIATE,0)
if(prob(25))
if (prob(75))
randmutb(H)
domutcheck(H,null,1)
else
randmutg(H)
domutcheck(H,null,1)
for(var/mob/living/carbon/monkey/M in living_mob_list) sleep(200)
var/turf/T = get_turf(M)
if(!T) command_alert("The station has entered the radiation belt. Please remain in a sheltered area until we have passed the radiation belt.", "Anomaly Alert")
continue for(var/i = 0, i < 10, i++)
if(T.z != 1) for(var/mob/living/carbon/human/H in living_mob_list)
continue var/turf/T = get_turf(H)
M.apply_effect((rand(15,75)),IRRADIATE,0) if(!T)
continue
if(T.z != 1)
continue
if(istype(T.loc, /area/maintenance) || istype(T.loc, /area/crew_quarters))
continue
if(istype(H,/mob/living/carbon/human))
H.apply_effect((rand(5,25)),IRRADIATE,0)
if(prob(5))
H.apply_effect((rand(30,50)),IRRADIATE,0)
if (prob(75))
randmutb(H)
domutcheck(H,null,1)
else
randmutg(H)
domutcheck(H,null,1)
for(var/mob/living/carbon/monkey/M in living_mob_list)
var/turf/T = get_turf(M)
if(!T)
continue
if(T.z != 1)
continue
M.apply_effect((rand(5,25)),IRRADIATE,0)
sleep(50)
command_alert("The station has passed the radiation belt. Please report to medbay if you experience any unusual symptoms.", "Anomaly Alert")

View File

@@ -0,0 +1,37 @@
/turf/simulated/wall
datum/event/wallrot
var/severity = 1
datum/event/wallrot/setup()
announceWhen = rand(0, 300)
endWhen = announceWhen + 1
severity = rand(5, 10)
datum/event/wallrot/announce()
command_alert("Harmful fungi detected on station. Station structures may be contaminated.", "Biohazard Alert")
datum/event/wallrot/start()
spawn()
var/turf/center = null
// 100 attempts
for(var/i=0, i<100, i++)
var/turf/candidate = locate(rand(1, world.maxx), rand(1, world.maxy), 1)
if(istype(candidate, /turf/simulated/wall))
center = candidate
if(center)
// Make sure at least one piece of wall rots!
center:rot()
// Have a chance to rot lots of other walls.
var/rotcount = 0
for(var/turf/simulated/wall/W in range(5, center)) if(prob(50))
W:rot()
rotcount++
// Only rot up to severity walls
if(rotcount >= severity)
break

View File

@@ -6,7 +6,8 @@ mob/living/carbon/proc/dream()
"light","a scientist","a monkey","a catastrophe","a loved one","a gun","warmth","freezing","the sun", "light","a scientist","a monkey","a catastrophe","a loved one","a gun","warmth","freezing","the sun",
"a hat","the Luna","a ruined station","a planet","plasma","air","the medical bay","the bridge","blinking lights", "a hat","the Luna","a ruined station","a planet","plasma","air","the medical bay","the bridge","blinking lights",
"a blue light","an abandoned laboratory","Nanotrasen","The Syndicate","blood","healing","power","respect", "a blue light","an abandoned laboratory","Nanotrasen","The Syndicate","blood","healing","power","respect",
"riches","space","a crash","happiness","pride","a fall","water","flames","ice","melons","flying","the eggs" "riches","space","a crash","happiness","pride","a fall","water","flames","ice","melons","flying","the eggs","money",
"a beach","the holodeck","a smokey room","a voice","the cold","a mouse","an operating table","the bar","the rain"
) )
spawn(0) spawn(0)
for(var/i = rand(1,4),i > 0, i--) for(var/i = rand(1,4),i > 0, i--)

View File

@@ -32,19 +32,13 @@ mob/proc/custom_emote(var/m_type=1,var/message = null)
continue continue
if(findtext(message," snores.")) //Because we have so many sleeping people. if(findtext(message," snores.")) //Because we have so many sleeping people.
break break
if(M.stat == 2 && M.client.ghost_sight && !(M in viewers(src,null))) if(M.stat == 2 && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null)))
M.show_message(message) M.show_message(message)
if (m_type & 1) if (m_type & 1)
for (var/mob/O in viewers(src, null)) for (var/mob/O in viewers(src, null))
if(istype(O,/mob/living/carbon/human))
for(var/mob/living/parasite/P in O:parasites)
P.show_message(message, m_type)
O.show_message(message, m_type) O.show_message(message, m_type)
else if (m_type & 2) else if (m_type & 2)
for (var/mob/O in hearers(src.loc, null)) for (var/mob/O in hearers(src.loc, null))
if(istype(O,/mob/living/carbon/human))
for(var/mob/living/parasite/P in O:parasites)
P.show_message(message, m_type)
O.show_message(message, m_type) O.show_message(message, m_type)

View File

@@ -53,27 +53,17 @@
var/input = copytext(sanitize(input("Choose an emote to display.") as text|null),1,MAX_MESSAGE_LEN) var/input = copytext(sanitize(input("Choose an emote to display.") as text|null),1,MAX_MESSAGE_LEN)
if (!input) if (!input)
return return
if(copytext(input,1,5) == "says") var/input2 = input("Is this a visible or hearable emote?") in list("Visible","Hearable")
src << "\red Invalid emote." if (input2 == "Visible")
return m_type = 1
else if(copytext(input,1,9) == "exclaims") else if (input2 == "Hearable")
src << "\red Invalid emote." if (src.miming)
return
else if(copytext(input,1,5) == "asks")
src << "\red Invalid emote."
return
else
var/input2 = input("Is this a visible or hearable emote?") in list("Visible","Hearable")
if (input2 == "Visible")
m_type = 1
else if (input2 == "Hearable")
if (src.miming)
return
m_type = 2
else
alert("Unable to use this emote, must be either hearable or visible.")
return return
message = "<B>[src]</B> [input]" m_type = 2
else
alert("Unable to use this emote, must be either hearable or visible.")
return
message = "<B>[src]</B> [input]"
if ("me") if ("me")
if(silent) if(silent)
@@ -88,17 +78,7 @@
return return
if(!(message)) if(!(message))
return return
if(copytext(message,1,5) == "says") message = "<B>[src]</B> [message]"
src << "\red Invalid emote."
return
else if(copytext(message,1,9) == "exclaims")
src << "\red Invalid emote."
return
else if(copytext(message,1,5) == "asks")
src << "\red Invalid emote."
return
else
message = "<B>[src]</B> [message]"
if ("salute") if ("salute")
if (!src.buckled) if (!src.buckled)

View File

@@ -439,7 +439,7 @@
//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable //Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable
/mob/living/carbon/human/proc/get_face_name() /mob/living/carbon/human/proc/get_face_name()
var/datum/organ/external/head/head = get_organ("head") var/datum/organ/external/head/head = get_organ("head")
if( !head || head.disfigured || (head.status & ORGAN_DESTROYED) || !real_name ) //disfigured. use id-name if possible if( !head || head.disfigured || (head.status & ORGAN_DESTROYED) || !real_name || (HUSK in mutations) ) //disfigured. use id-name if possible
return "Unknown" return "Unknown"
return real_name return real_name

View File

@@ -28,6 +28,7 @@
var/pressure_alert = 0 var/pressure_alert = 0
var/prev_gender = null // Debug for plural genders var/prev_gender = null // Debug for plural genders
var/temperature_alert = 0 var/temperature_alert = 0
var/in_stasis = 0
/mob/living/carbon/human/Life() /mob/living/carbon/human/Life()
@@ -59,8 +60,11 @@
life_tick++ life_tick++
var/datum/gas_mixture/environment = loc.return_air() var/datum/gas_mixture/environment = loc.return_air()
in_stasis = istype(loc, /obj/structure/closet/body_bag/cryobag) && loc:opened == 0
if(in_stasis) loc:used++
//No need to update all of these procs if the guy is dead. //No need to update all of these procs if the guy is dead.
if(stat != DEAD) if(stat != DEAD && !in_stasis)
if(air_master.current_cycle%4==2 || failed_last_breath) //First, resolve location and get a breath if(air_master.current_cycle%4==2 || failed_last_breath) //First, resolve location and get a breath
breathe() //Only try to take a breath every 4 ticks, unless suffocating breathe() //Only try to take a breath every 4 ticks, unless suffocating
@@ -86,18 +90,20 @@
handle_virus_updates() handle_virus_updates()
//stuff in the stomach
handle_stomach()
handle_shock()
handle_pain()
handle_medical_side_effects()
handle_stasis_bag()
//Handle temperature/pressure differences between body and environment //Handle temperature/pressure differences between body and environment
handle_environment(environment) handle_environment(environment)
//stuff in the stomach
handle_stomach()
handle_shock()
handle_pain()
handle_medical_side_effects()
//Status updates, death etc. //Status updates, death etc.
handle_regular_status_updates() //TODO: optimise ~Carn handle_regular_status_updates() //TODO: optimise ~Carn
update_canmove() update_canmove()
@@ -196,6 +202,16 @@
src << "\red Your legs won't respond properly, you fall down." src << "\red Your legs won't respond properly, you fall down."
lying = 1 lying = 1
proc/handle_stasis_bag()
// Handle side effects from stasis bag
if(in_stasis)
// First off, there's no oxygen supply, so the mob will slowly take brain damage
adjustBrainLoss(0.1)
// Next, the method to induce stasis has some adverse side-effects, manifesting
// as cloneloss
adjustCloneLoss(0.1)
proc/handle_mutations_and_radiation() proc/handle_mutations_and_radiation()
if(getFireLoss()) if(getFireLoss())
if((COLD_RESISTANCE in mutations) || (prob(1))) if((COLD_RESISTANCE in mutations) || (prob(1)))
@@ -787,8 +803,8 @@
var/total_plasmaloss = 0 var/total_plasmaloss = 0
for(var/obj/item/I in src) for(var/obj/item/I in src)
if(I.contaminated) if(I.contaminated)
total_plasmaloss += vsc.plc.CONTAMINATION_LOSS total_plasmaloss += vsc.plc.CONTAMINATION_LOSS
if(status_flags & GODMODE) return 0 //godmode if(status_flags & GODMODE) return 0 //godmode
adjustToxLoss(total_plasmaloss) adjustToxLoss(total_plasmaloss)
// if(dna && dna.mutantrace == "plant") //couldn't think of a better place to place it, since it handles nutrition -- Urist // if(dna && dna.mutantrace == "plant") //couldn't think of a better place to place it, since it handles nutrition -- Urist
@@ -886,8 +902,10 @@
silent = 0 silent = 0
else //ALIVE. LIGHTS ARE ON else //ALIVE. LIGHTS ARE ON
updatehealth() //TODO updatehealth() //TODO
handle_organs() if(!in_stasis)
handle_blood() handle_organs()
handle_blood()
if(health <= config.health_threshold_dead || brain_op_stage == 4.0) if(health <= config.health_threshold_dead || brain_op_stage == 4.0)
death() death()
blinded = 1 blinded = 1

View File

@@ -1,4 +1,4 @@
/mob/living/carbon/slime/emote(var/act) /mob/living/carbon/slime/emote(var/act, var/type, var/desc)
if (findtext(act, "-", 1, null)) if (findtext(act, "-", 1, null))
@@ -13,6 +13,10 @@
var/message var/message
switch(act) switch(act)
if ("me")
return custom_emote(m_type, desc)
if ("custom")
return custom_emote(m_type, desc)
if("moan") if("moan")
message = "<B>The [src.name]</B> moans." message = "<B>The [src.name]</B> moans."
m_type = 2 m_type = 2

View File

@@ -1,4 +1,4 @@
/mob/living/carbon/monkey/emote(var/act) /mob/living/carbon/monkey/emote(var/act, var/type, var/desc)
var/param = null var/param = null
if (findtext(act, "-", 1, null)) if (findtext(act, "-", 1, null))
@@ -14,6 +14,12 @@
var/message var/message
switch(act) switch(act)
if ("me")
return custom_emote(m_type, desc)
if ("custom")
return custom_emote(m_type, desc)
if("sign") if("sign")
if (!src.restrained()) if (!src.restrained())
message = text("<B>The monkey</B> signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null)) message = text("<B>The monkey</B> signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null))

View File

@@ -9,6 +9,12 @@
act = copytext(act,1,length(act)) act = copytext(act,1,length(act))
switch(act) switch(act)
if ("me")
return custom_emote(m_type, message)
if ("custom")
return custom_emote(m_type, message)
if ("salute") if ("salute")
if (!src.buckled) if (!src.buckled)
var/M = null var/M = null
@@ -56,20 +62,6 @@
message = "<B>[src]</B> flaps his wings ANGRILY!" message = "<B>[src]</B> flaps his wings ANGRILY!"
m_type = 2 m_type = 2
if ("custom")
var/input = copytext(sanitize(input("Choose an emote to display.") as text|null),1,MAX_MESSAGE_LEN)
if (!input)
return
var/input2 = input("Is this a visible or hearable emote?") in list("Visible","Hearable")
if (input2 == "Visible")
m_type = 1
else if (input2 == "Hearable")
m_type = 2
else
alert("Unable to use this emote, must be either hearable or visible.")
return
message = "<B>[src]</B> [input]"
if ("me") if ("me")
if (src.client) if (src.client)
if(client.prefs.muted & MUTE_IC) if(client.prefs.muted & MUTE_IC)

View File

@@ -226,14 +226,8 @@
/mob/living/simple_animal/emote(var/act, var/type, var/desc) /mob/living/simple_animal/emote(var/act, var/type, var/desc)
if(act) if(act)
if(act == "scream") act = "makes a loud and pained whimper" //ugly hack to stop animals screaming when crushed :P if(act == "scream") act = "whimper" //ugly hack to stop animals screaming when crushed :P
if(act == "me") //Allow me-emotes. ..(act, type, desc)
act = desc
if( findtext(act,".",lentext(act)) == 0 && findtext(act,"!",lentext(act)) == 0 && findtext(act,"?",lentext(act)) == 0 )
act = addtext(act,".") //Makes sure all emotes end with a period.
for (var/mob/O in viewers(src, null))
O.show_message("<B>[src]</B> [act]")
/mob/living/simple_animal/attack_animal(mob/living/simple_animal/M as mob) /mob/living/simple_animal/attack_animal(mob/living/simple_animal/M as mob)
if(M.melee_damage_upper == 0) if(M.melee_damage_upper == 0)

View File

@@ -277,6 +277,8 @@
character.loc = pick(latejoin) character.loc = pick(latejoin)
character.lastarea = get_area(loc) character.lastarea = get_area(loc)
ticker.mode.latespawn(character)
//ticker.mode.latespawn(character) //ticker.mode.latespawn(character)
if(character.mind.assigned_role != "Cyborg") if(character.mind.assigned_role != "Cyborg")

View File

@@ -75,31 +75,32 @@
//tcomms code is still runtiming somewhere here //tcomms code is still runtiming somewhere here
var/ending = copytext(text, length(text)) var/ending = copytext(text, length(text))
if (is_speaking_soghun) if (is_speaking_soghun)
return "hisses, \"<span class='soghun'>[text]</span>\""; return "<span class='say_quote'>hisses</span>, \"<span class='soghun'>[text]</span>\"";
if (is_speaking_skrell) if (is_speaking_skrell)
return "warbles, \"<span class='skrell'>[text]</span>\""; return "<span class='say_quote'>warbles</span>, \"<span class='skrell'>[text]</span>\"";
if (is_speaking_tajaran) if (is_speaking_tajaran)
return "mrowls, \"<span class='tajaran'>[text]</span>\""; return "<span class='say_quote'>mrowls</span>, \"<span class='tajaran'>[text]</span>\"";
//Needs Virus2 //Needs Virus2
// if (src.disease_symptoms & DISEASE_HOARSE) // if (src.disease_symptoms & DISEASE_HOARSE)
// return "rasps, \"[text]\""; // return "rasps, \"[text]\"";
if (src.stuttering) if (src.stuttering)
return "stammers, \"[text]\""; return "<span class='say_quote'>stammers</span>, \"[text]\"";
if (src.slurring) if (src.slurring)
return "slurrs, \"[text]\""; return "<span class='say_quote'>slurrs</span>, \"[text]\"";
if(isliving(src)) if(isliving(src))
var/mob/living/L = src var/mob/living/L = src
if (L.getBrainLoss() >= 60) if (L.getBrainLoss() >= 60)
return "gibbers, \"[text]\""; return "<span class='say_quote'>gibbers</span>, \"[text]\"";
if (ending == "?") if (ending == "?")
return "asks, \"[text]\""; return "<span class='say_quote'>asks</span>, \"[text]\"";
if (ending == "!") if (ending == "!")
return "exclaims, \"[text]\""; return "<span class='say_quote'>exclaims</span>, \"[text]\"";
return "says, \"[text]\""; return "<span class='say_quote'>says</span>, \"[text]\"";
/mob/proc/emote(var/act) /mob/proc/emote(var/act, var/type, var/message)
return if(act == "me")
return custom_emote(type, message)
/mob/proc/get_ear() /mob/proc/get_ear()
// returns an atom representing a location on the map from which this // returns an atom representing a location on the map from which this

View File

@@ -236,7 +236,8 @@
if(href_list["write"]) if(href_list["write"])
var/id = href_list["write"] var/id = href_list["write"]
//var/t = strip_html_simple(input(usr, "What text do you wish to add to " + (id=="end" ? "the end of the paper" : "field "+id) + "?", "[name]", null),8192) as message //var/t = strip_html_simple(input(usr, "What text do you wish to add to " + (id=="end" ? "the end of the paper" : "field "+id) + "?", "[name]", null),8192) as message
var/t = strip_html_simple(input("Enter what you want to write:", "Write", null, null) as message, MAX_MESSAGE_LEN) //var/t = strip_html_simple(input("Enter what you want to write:", "Write", null, null) as message, MAX_MESSAGE_LEN)
var/t = input("Enter what you want to write:", "Write", null, null) as message
var/obj/item/i = usr.get_active_hand() // Check to see if he still got that darn pen, also check if he's using a crayon or pen. var/obj/item/i = usr.get_active_hand() // Check to see if he still got that darn pen, also check if he's using a crayon or pen.
var/iscrayon = 0 var/iscrayon = 0
if(!istype(i, /obj/item/weapon/pen)) if(!istype(i, /obj/item/weapon/pen))
@@ -248,6 +249,17 @@
if((!in_range(src, usr) && loc != usr && !( istype(loc, /obj/item/weapon/clipboard) ) && loc.loc != usr && usr.get_active_hand() != i)) // Some check to see if he's allowed to write if((!in_range(src, usr) && loc != usr && !( istype(loc, /obj/item/weapon/clipboard) ) && loc.loc != usr && usr.get_active_hand() != i)) // Some check to see if he's allowed to write
return return
t = checkhtml(t)
// check for exploits
for(var/bad in paper_blacklist)
if(findtext(t,bad))
usr << "\blue You think to yourself, \"Hm.. this is only paper...\""
log_admin("PAPER: [usr] ([usr.ckey]) tried to use forbidden word in [src]: [bad].")
message_admins("PAPER: [usr] ([usr.ckey]) tried to use forbidden word in [src]: [bad].")
return
t = replacetext(t, "\n", "<BR>")
t = parsepencode(t, i, usr, iscrayon) // Encode everything from pencode to html t = parsepencode(t, i, usr, iscrayon) // Encode everything from pencode to html
if(id!="end") if(id!="end")

View File

@@ -187,10 +187,7 @@
else else
icon_state = basestate icon_state = basestate
else if (opened == 2) else if (opened == 2)
if ((stat & BROKEN) || malfhack ) icon_state = "[basestate]-nocover"
icon_state = "[basestate]-b-nocover"
else /* if (emagged)*/
icon_state = "[basestate]-nocover"
else if (stat & BROKEN) else if (stat & BROKEN)
icon_state = "apc-b" icon_state = "apc-b"
else if(emagged || malfai) else if(emagged || malfai)

View File

@@ -1,5 +1,4 @@
//updated by cael_aislinn on 5/3/2013 to be rotateable, moveable and generally more flexible
/obj/machinery/power/generator /obj/machinery/power/generator
name = "thermoelectric generator" name = "thermoelectric generator"
desc = "It's a high efficiency thermoelectric generator." desc = "It's a high efficiency thermoelectric generator."
@@ -57,39 +56,26 @@
if(lastgenlev != 0) if(lastgenlev != 0)
overlays += image('icons/obj/power.dmi', "teg-op[lastgenlev]") overlays += image('icons/obj/power.dmi', "teg-op[lastgenlev]")
/obj/machinery/power/generator/process() /obj/machinery/power/generator/process()
//world << "Generator process ran"
if(!circ1 || !circ2 || !anchored || stat & (BROKEN|NOPOWER)) if(!circ1 || !circ2 || !anchored || stat & (BROKEN|NOPOWER))
return return
//world << "circ1 and circ2 pass" updateDialog()
var/datum/gas_mixture/air1 = circ1.return_transfer_air() var/datum/gas_mixture/air1 = circ1.return_transfer_air()
var/datum/gas_mixture/air2 = circ2.return_transfer_air() var/datum/gas_mixture/air2 = circ2.return_transfer_air()
lastgen = 0 lastgen = 0
//world << "hot_air = [hot_air]; cold_air = [cold_air];"
if(air1 && air2) if(air1 && air2)
//world << "hot_air = [hot_air] temperature = [air2.temperature]; cold_air = [cold_air] temperature = [air2.temperature];"
//world << "coldair and hotair pass"
var/air1_heat_capacity = air1.heat_capacity() var/air1_heat_capacity = air1.heat_capacity()
var/air2_heat_capacity = air2.heat_capacity() var/air2_heat_capacity = air2.heat_capacity()
var/delta_temperature = abs(air2.temperature - air1.temperature) var/delta_temperature = abs(air2.temperature - air1.temperature)
//world << "delta_temperature = [delta_temperature]; air1_heat_capacity = [air1_heat_capacity]; air2_heat_capacity = [air2_heat_capacity]"
if(delta_temperature > 0 && air1_heat_capacity > 0 && air2_heat_capacity > 0) if(delta_temperature > 0 && air1_heat_capacity > 0 && air2_heat_capacity > 0)
var/efficiency = 0.65 var/efficiency = 0.65
var/energy_transfer = delta_temperature*air2_heat_capacity*air1_heat_capacity/(air2_heat_capacity+air1_heat_capacity) var/energy_transfer = delta_temperature*air2_heat_capacity*air1_heat_capacity/(air2_heat_capacity+air1_heat_capacity)
var/heat = energy_transfer*(1-efficiency) var/heat = energy_transfer*(1-efficiency)
lastgen = energy_transfer*efficiency*0.05
if(air2.temperature > air1.temperature) if(air2.temperature > air1.temperature)
air2.temperature = air2.temperature - energy_transfer/air2_heat_capacity air2.temperature = air2.temperature - energy_transfer/air2_heat_capacity
@@ -98,20 +84,29 @@
air2.temperature = air2.temperature + heat/air2_heat_capacity air2.temperature = air2.temperature + heat/air2_heat_capacity
air1.temperature = air1.temperature - energy_transfer/air1_heat_capacity air1.temperature = air1.temperature - energy_transfer/air1_heat_capacity
lastgen = circ1.ReturnPowerGeneration() + circ2.ReturnPowerGeneration() //Transfer the air
if(lastgen > 0) circ1.air2.merge(air1)
add_avail(lastgen) circ2.air2.merge(air2)
else //Update the gas networks
add_load(-lastgen) if(circ1.network2)
circ1.network2.update = 1
if(circ2.network2)
circ2.network2.update = 1
// update icon overlays and power usage only if displayed level has changed // update icon overlays and power usage only if displayed level has changed
var/genlev = max(0, min( round(11*lastgen / 100000), 11)) if(lastgen > 250000 && prob(10))
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
lastgen *= 0.5
var/genlev = max(0, min( round(11*lastgen / 250000), 11))
if(lastgen > 100 && genlev == 0)
genlev = 1
if(genlev != lastgenlev) if(genlev != lastgenlev)
lastgenlev = genlev lastgenlev = genlev
updateicon() updateicon()
add_avail(lastgen)
updateDialog()
/obj/machinery/power/generator/attack_ai(mob/user) /obj/machinery/power/generator/attack_ai(mob/user)
if(stat & (BROKEN|NOPOWER)) return if(stat & (BROKEN|NOPOWER)) return
@@ -145,19 +140,17 @@
if(circ1 && circ2) if(circ1 && circ2)
t += "Output : [round(lastgen)] W<BR><BR>" t += "Output : [round(lastgen)] W<BR><BR>"
t += "<B>Primary Circulator (top/right)</B><BR>" t += "<B>Primary Circulator (top or right)</B><BR>"
t += "Inlet Pressure: [round(circ1.air1.return_pressure(), 0.1)] kPa<BR>" t += "Inlet Pressure: [round(circ1.air1.return_pressure(), 0.1)] kPa<BR>"
t += "Inlet Temperature: [round(circ1.air1.temperature, 0.1)] K<BR>" t += "Inlet Temperature: [round(circ1.air1.temperature, 0.1)] K<BR>"
t += "Outlet Pressure: [round(circ1.air2.return_pressure(), 0.1)] kPa<BR>" t += "Outlet Pressure: [round(circ1.air2.return_pressure(), 0.1)] kPa<BR>"
t += "Outlet Temperature: [round(circ1.air2.temperature, 0.1)] K<BR>" t += "Outlet Temperature: [round(circ1.air2.temperature, 0.1)] K<BR>"
t += "Turbine Status: <A href='?src=\ref[src];turbine1=1'>[circ1.turbine_pumping ? "Pumping" : "Generating"]</a><br><br>"
t += "<B>Secondary Circulator (bottom/left)</B><BR>" t += "<B>Secondary Circulator (bottom or left)</B><BR>"
t += "Inlet Pressure: [round(circ2.air1.return_pressure(), 0.1)] kPa<BR>" t += "Inlet Pressure: [round(circ2.air1.return_pressure(), 0.1)] kPa<BR>"
t += "Inlet Temperature: [round(circ2.air1.temperature, 0.1)] K<BR>" t += "Inlet Temperature: [round(circ2.air1.temperature, 0.1)] K<BR>"
t += "Outlet Pressure: [round(circ2.air2.return_pressure(), 0.1)] kPa<BR>" t += "Outlet Pressure: [round(circ2.air2.return_pressure(), 0.1)] kPa<BR>"
t += "Outlet Temperature: [round(circ2.air2.temperature, 0.1)] K<BR>" t += "Outlet Temperature: [round(circ2.air2.temperature, 0.1)] K<BR>"
t += "Turbine Status: <A href='?src=\ref[src];turbine2=1'>[circ2.turbine_pumping ? "Pumping" : "Generating"]</a><br>"
else else
t += "Unable to connect to circulators.<br>" t += "Unable to connect to circulators.<br>"
@@ -179,14 +172,6 @@
usr.unset_machine() usr.unset_machine()
return 0 return 0
if( href_list["turbine2"] )
if(circ2)
circ2.turbine_pumping = !circ2.turbine_pumping
if( href_list["turbine1"] )
if(circ1)
circ1.turbine_pumping = !circ1.turbine_pumping
updateDialog() updateDialog()
return 1 return 1

View File

@@ -1214,6 +1214,17 @@ datum
..() ..()
return return
// Clear off wallrot fungi
reaction_turf(var/turf/T, var/volume)
if(istype(T, /turf/simulated/wall))
var/turf/simulated/wall/W = T
if(W.rotting)
W.rotting = 0
for(var/obj/effect/E in W) if(E.name == "Wallrot") del E
for(var/mob/O in viewers(W, null))
O.show_message(text("\blue The fungi are completely dissolved by the solution!"), 1)
reaction_obj(var/obj/O, var/volume) reaction_obj(var/obj/O, var/volume)
if(istype(O,/obj/effect/alien/weeds/)) if(istype(O,/obj/effect/alien/weeds/))
var/obj/effect/alien/weeds/alien_weeds = O var/obj/effect/alien/weeds/alien_weeds = O

View File

@@ -42,9 +42,9 @@
icon_state = "chocolateglass" icon_state = "chocolateglass"
name = "Glass of chocolate" name = "Glass of chocolate"
desc = "Tasty" desc = "Tasty"
if("lemon") if("lemonjuice")
icon_state = "lemonglass" icon_state = "lemonglass"
name = "Glass of lemon" name = "Glass of lemonjuice"
desc = "Sour..." desc = "Sour..."
if("cola") if("cola")
icon_state = "glass_brown" icon_state = "glass_brown"

View File

@@ -49,12 +49,20 @@
D.icon += mix_color_from_reagents(D.reagents.reagent_list) D.icon += mix_color_from_reagents(D.reagents.reagent_list)
var/turf/A_turf = get_turf(A)
spawn(0) spawn(0)
for(var/i=0, i<3, i++) for(var/i=0, i<3, i++)
step_towards(D,A) step_towards(D,A)
D.reagents.reaction(get_turf(D)) D.reagents.reaction(get_turf(D))
for(var/atom/T in get_turf(D)) for(var/atom/T in get_turf(D))
D.reagents.reaction(T) D.reagents.reaction(T)
// When spraying against the wall, also react with the wall, but
// not its contents.
if(get_dist(D, A_turf) == 1 && A_turf.density)
D.reagents.reaction(A_turf)
sleep(2)
sleep(3) sleep(3)
del(D) del(D)

View File

@@ -621,6 +621,8 @@ var/list/TAGGERLOCATIONS = list("Disposals",
#define CHAT_PRAYER 256 #define CHAT_PRAYER 256
#define CHAT_RADIO 512 #define CHAT_RADIO 512
#define CHAT_ATTACKLOGS 1024 #define CHAT_ATTACKLOGS 1024
#define CHAT_DEBUGLOGS 2048
#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_ATTACKLOGS) #define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_ATTACKLOGS)

View File

@@ -55,6 +55,7 @@ h1.alert, h2.alert {color: #000000;}
.tajaran {color: #803B56;} .tajaran {color: #803B56;}
.skrell {color: #00CED1;} .skrell {color: #00CED1;}
.soghun {color: #228B22;} .soghun {color: #228B22;}
.say_quote {font-family: Georgia, Verdana, sans-serif;}
.interface {color: #330033;} .interface {color: #330033;}
</style>"} </style>"}

View File

@@ -57,7 +57,47 @@ Stuff which is in development and not yet visible to players or just code relate
(ie. code improvements for expandability, etc.) should not be listed here. They (ie. code improvements for expandability, etc.) should not be listed here. They
should be listed in the changelog upon commit though. Thanks. --> should be listed in the changelog upon commit though. Thanks. -->
<!-- To take advantage of the pretty new format (well it was new when I wrote this anyway), open the "add-to-changelog.html" file in any browser and add the stuff and then generate the html code and paste it here --> <!-- To take advantage of the pretty new format (well it was new when I wrote this anyway), open the "add-to-changelog.html" file in any browser and add the stuff and then generate the html code and paste it here --><div class="commit sansserif">
<div class="commit sansserif">
<h2 class="date">5/26/2013</h2>
<h3 class="author">Meyar updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">The syndicate shuttle now has a cycling airlock during Nuke rounds.</li>
<li class="rscadd">Restored the ability for the syndicate Agent ID to change the name on the card (reforge it) more than once.</li>
<li class="rscadd">ERT Radio now functional again.</li>
<li class="rscadd">Research blast doors now actually lock down the entirety of station-side Research. </li>
<li class="rscadd">Added lock down buttons to the wardens office. </li>
<li class="rscadd">The randomized barsign has made a return. </li>
<li class="rscadd">Syndicate Agent ID's external airlock access restored.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">21 May 2013</h2>
<h3 class="author">SkyMarshal updated:</h3>
<ul class="changes bgimages16">
<li class="experiment">ZAS will now speed air movement into/out of a zone when unsimulated tiles (e.g. space) are involved, in relation to the number of tiles.</li>
<li class="experiment">Portable Canisters will now automatically connect to any portable connecter beneath them on map load.</li>
<li class="bugfix">Bug involving mis-mapped disposal junction fixed</li>
<li class="bugfix">Air alarms now work for atmos techs (whoops!)</li>
<li class="bugfix">The Master Controller now properly stops atmos when it runtimes.</li>
<li class="bugfix">Backpacks can no longer be contaminated</li>
<li class="tweak">ZAS no longer logs air statistics.</li>
<li class="tweak">ZAS now rebuilds as soon as it detects a semi-complex change in geometry. (It was doing this already, but in a convoluted way which was actually less efficient)</li>
<li class="tweak">General code cleanup/commenting of ZAS</li>
<li class="tweak">Jungle now initializes after the random Z-level loads and atmos initializes.</li>
</ul>
</div>
<div>
<h2 class="date">May 18th, 2013</h2>
<h3 class="author">CIB updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">A new event type: Wallrot. Use welder or plantbgone on infected walls.</li>
<li class="tweak">Newscasters now can deliver preset news stories over the course of a round. See http://baystation12.net/forums/viewtopic.php?f=14&t=7619 to add your own!</li>
</ul>
</div>
<div class="commit sansserif"> <div class="commit sansserif">
<h2 class="date">25th May 2013</h2> <h2 class="date">25th May 2013</h2>
@@ -79,6 +119,7 @@ should be listed in the changelog upon commit though. Thanks. -->
<li class="bugfix">Iced tea no longer makes a glass of .what?</li> <li class="bugfix">Iced tea no longer makes a glass of .what?</li>
</ul> </ul>
</div> </div>
<div class="commit sansserif"> <div class="commit sansserif">
<h2 class="date">April 24, 2013</h2> <h2 class="date">April 24, 2013</h2>
<h3 class="author">faux updated:</h3> <h3 class="author">faux updated:</h3>

BIN
icons/effects/wallrot.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 373 B

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 36 KiB

BIN
icons/obj/hacktool.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 83 KiB

View File

@@ -3,309 +3,303 @@
"ac" = (/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor,/area/engine/control) "ac" = (/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor,/area/engine/control)
"ad" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engine/control) "ad" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engine/control)
"ae" = (/obj/machinery/power/apc{cell_type = 15000; dir = 1; name = "Engineering APC"; pixel_x = 0; pixel_y = 0},/obj/structure/cable{d1 = 0; d2 = 2; icon_state = "0-2"},/turf/simulated/floor,/area/engine/control) "ae" = (/obj/machinery/power/apc{cell_type = 15000; dir = 1; name = "Engineering APC"; pixel_x = 0; pixel_y = 0},/obj/structure/cable{d1 = 0; d2 = 2; icon_state = "0-2"},/turf/simulated/floor,/area/engine/control)
"af" = (/turf/simulated/floor,/area/engine/control) "af" = (/obj/machinery/door_control{id = 1; step_y = 32},/turf/simulated/floor,/area/engine/control)
"ag" = (/obj/machinery/power/monitor,/turf/simulated/floor,/area/engine/control) "ag" = (/obj/machinery/power/monitor,/turf/simulated/floor,/area/engine/control)
"ah" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/machinery/light{dir = 4},/turf/simulated/floor,/area/engine/control) "ah" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/machinery/light{dir = 4},/turf/simulated/floor,/area/engine/control)
"ai" = (/obj/effect/landmark/start{name = "Chief Engineer"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/engine/control) "ai" = (/turf/simulated/floor,/area/engine/control)
"aj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/engine/control) "aj" = (/obj/effect/landmark/start{name = "Chief Engineer"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/engine/control)
"ak" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor,/area/engine/control) "ak" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/engine/control)
"al" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/control) "al" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor,/area/engine/control)
"am" = (/obj/machinery/computer/rust_fuel_control,/turf/simulated/floor,/area/engine/control) "am" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/control)
"an" = (/obj/machinery/computer/rust_core_control,/turf/simulated/floor,/area/engine/control) "an" = (/obj/machinery/computer/rust_fuel_control,/turf/simulated/floor,/area/engine/control)
"ao" = (/obj/machinery/computer/rust_radiation_monitor,/turf/simulated/floor,/area/engine/control) "ao" = (/obj/machinery/computer/rust_core_control,/turf/simulated/floor,/area/engine/control)
"ap" = (/obj/machinery/light,/turf/simulated/floor,/area/engine/control) "ap" = (/obj/machinery/computer/rust_radiation_monitor,/turf/simulated/floor,/area/engine/control)
"aq" = (/turf/space,/area/engine/engineering) "aq" = (/obj/machinery/light,/turf/simulated/floor,/area/engine/control)
"ar" = (/turf/simulated/wall/r_wall,/area/engine/engineering) "ar" = (/turf/space,/area/engine/engineering)
"as" = (/obj/machinery/door/airlock/engineering,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering) "as" = (/turf/simulated/wall/r_wall,/area/engine/engineering)
"at" = (/obj/effect/landmark{name = "LateStart"},/turf/simulated/floor,/area/engine/engineering) "at" = (/obj/machinery/door/airlock/engineering,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering)
"au" = (/obj/effect/landmark{name = "LateStart"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering) "au" = (/obj/effect/landmark{name = "LateStart"},/turf/simulated/floor,/area/engine/engineering)
"av" = (/obj/effect/landmark{name = "LateStart"},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engine/engineering) "av" = (/obj/effect/landmark{name = "LateStart"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering)
"aw" = (/turf/simulated/floor,/area/engine/engineering) "aw" = (/obj/effect/landmark{name = "LateStart"},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engine/engineering)
"ax" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engine/engineering) "ax" = (/turf/simulated/floor,/area/engine/engineering)
"ay" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor,/area/engine/engineering) "ay" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engine/engineering)
"az" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/engine/engineering) "az" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor,/area/engine/engineering)
"aA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light,/turf/simulated/floor,/area/engine/engineering) "aA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/engine/engineering)
"aB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door_control{id = 1; pixel_y = -24},/turf/simulated/floor,/area/engine/engineering) "aB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light,/turf/simulated/floor,/area/engine/engineering)
"aC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor,/area/engine/engineering) "aC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door_control{id = 1; pixel_y = -24},/turf/simulated/floor,/area/engine/engineering)
"aD" = (/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) "aD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor,/area/engine/engineering)
"aE" = (/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) "aE" = (/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)
"aF" = (/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 = ""},/turf/simulated/floor,/area/engine/engineering) "aF" = (/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)
"aG" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor,/area/engine/engineering) "aG" = (/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 = ""},/turf/simulated/floor,/area/engine/engineering)
"aH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 8},/turf/simulated/floor,/area/engine/engineering) "aH" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor,/area/engine/engineering)
"aI" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/engine/engineering) "aI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 8},/turf/simulated/floor,/area/engine/engineering)
"aJ" = (/obj/machinery/door/airlock/engineering,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engineering) "aJ" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/engine/engineering)
"aK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering) "aK" = (/obj/machinery/door/airlock/engineering,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engineering)
"aL" = (/turf/simulated/floor/plating,/area/engine/engineering) "aL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering)
"aM" = (/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) "aM" = (/turf/simulated/floor/plating,/area/engine/engineering)
"aN" = (/obj/machinery/power/rust_fuel_injector,/turf/simulated/floor/plating,/area/engine/engineering) "aN" = (/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)
"aO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engineering) "aO" = (/obj/machinery/power/rust_fuel_injector{anchored = 1; state = 2},/turf/simulated/floor/plating,/area/engine/engineering)
"aP" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering) "aP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engineering)
"aQ" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/engine/engineering) "aQ" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering)
"aR" = (/obj/machinery/light{dir = 4},/turf/simulated/floor,/area/engine/engineering) "aR" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/engine/engineering)
"aS" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/turf/space,/area) "aS" = (/obj/machinery/light{dir = 4},/turf/simulated/floor,/area/engine/engineering)
"aT" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/space,/area) "aT" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/turf/space,/area)
"aU" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 10},/turf/space,/area) "aU" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/space,/area)
"aV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/engine/engineering) "aV" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 10},/turf/space,/area)
"aW" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering) "aW" = (/obj/structure/lattice,/turf/space,/area)
"aX" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/plating,/area/engine/engineering) "aX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/engine/engineering)
"aY" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/plating,/area/engine/engineering) "aY" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering)
"aZ" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/space,/area) "aZ" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/plating,/area/engine/engineering)
"ba" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 9},/turf/space,/area) "ba" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/plating,/area/engine/engineering)
"bb" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/plating,/area/engine/engineering) "bb" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/space,/area)
"bc" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/engine/engineering) "bc" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 9},/turf/space,/area)
"bd" = (/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = "icon-warnplate (SOUTHEAST)"},/area/engine/engineering) "bd" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/plating,/area/engine/engineering)
"be" = (/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) "be" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/engine/engineering)
"bf" = (/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) "bf" = (/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = "icon-warnplate (SOUTHEAST)"},/area/engine/engineering)
"bg" = (/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) "bg" = (/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)
"bh" = (/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/engine/engineering) "bh" = (/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)
"bi" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/space,/area) "bi" = (/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)
"bj" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8; icon_state = "manifold"; initialize_directions = 11; level = 2},/turf/simulated/floor/plating,/area/engine/engineering) "bj" = (/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/engine/engineering)
"bk" = (/obj/machinery/atmospherics/pipe/manifold{icon_state = "manifold"; level = 2},/turf/simulated/floor/plating,/area/engine/engineering) "bk" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/space,/area)
"bl" = (/obj/machinery/atmospherics/pipe/simple{dir = 9; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area/engine/engineering) "bl" = (/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area/engine/engineering)
"bm" = (/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area/engine/engineering) "bm" = (/obj/machinery/atmospherics/pipe/manifold4w{tag = "icon-manifold4w"; icon_state = "manifold4w"},/turf/simulated/floor/plating,/area/engine/engineering)
"bn" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; initialize_directions = 11; level = 2},/turf/simulated/floor/plating,/area/engine/engineering) "bn" = (/obj/machinery/atmospherics/pipe/manifold{icon_state = "manifold"; level = 2},/turf/simulated/floor/plating,/area/engine/engineering)
"bo" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/engine/engineering) "bo" = (/obj/machinery/atmospherics/pipe/simple{dir = 9; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area/engine/engineering)
"bp" = (/obj/machinery/door/poddoor,/turf/simulated/floor/engine,/area/engine/engineering) "bp" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; initialize_directions = 11; level = 2},/turf/simulated/floor/plating,/area/engine/engineering)
"bq" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering) "bq" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/engine/engineering)
"br" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering) "br" = (/obj/machinery/door/poddoor,/turf/simulated/floor/engine,/area/engine/engineering)
"bs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering) "bs" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area/engine/engineering)
"bt" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering) "bt" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
"bu" = (/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) "bu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
"bv" = (/obj/machinery/power/apc{cell_type = 15000; dir = 4; name = "Engineering APC"; pixel_x = 25; pixel_y = 0},/obj/structure/cable{d1 = 0; d2 = 2; icon_state = "0-2"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/engine/engineering) "bv" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
"bw" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/engine/engineering) "bw" = (/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)
"bx" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/turf/simulated/wall/r_wall,/area/engine/engineering) "bx" = (/obj/machinery/power/apc{cell_type = 15000; dir = 4; name = "Engineering APC"; pixel_x = 25; pixel_y = 0},/obj/structure/cable{d1 = 0; d2 = 2; icon_state = "0-2"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/engine/engineering)
"by" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8},/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering) "by" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/engine/engineering)
"bz" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/engine,/area/engine/engineering) "bz" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/turf/simulated/wall/r_wall,/area/engine/engineering)
"bA" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/turf/simulated/floor/engine,/area/engine/engineering) "bA" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8},/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering)
"bB" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/simulated/floor/engine,/area/engine/engineering) "bB" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/engine,/area/engine/engineering)
"bC" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/engine/engineering) "bC" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/turf/simulated/floor/engine,/area/engine/engineering)
"bD" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 10},/turf/simulated/floor/engine,/area/engine/engineering) "bD" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/simulated/floor/engine,/area/engine/engineering)
"bE" = (/turf/simulated/floor/engine,/area/engine/engineering) "bE" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/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) "bF" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 10},/turf/simulated/floor/engine,/area/engine/engineering)
"bG" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/engine/engineering) "bG" = (/turf/simulated/floor/engine,/area/engine/engineering)
"bH" = (/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold"; level = 2},/turf/simulated/floor/plating,/area/engine/engineering) "bH" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4},/turf/simulated/floor/plating,/area/engine/engineering)
"bI" = (/obj/machinery/atmospherics/binary/pump/highcap{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering) "bI" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/oxygen,/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) "bJ" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/obj/structure/lattice,/turf/space,/area)
"bK" = (/obj/machinery/atmospherics/pipe/simple{dir = 6; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area/engine/engineering) "bK" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/obj/structure/lattice,/turf/space,/area)
"bL" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/obj/machinery/meter,/turf/simulated/floor/plating,/area/engine/engineering) "bL" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{dir = 8},/turf/simulated/wall/r_wall,/area/engine/engineering)
"bM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 4},/turf/simulated/floor,/area/engine/engineering) "bM" = (/obj/machinery/atmospherics/binary/pump/highcap{dir = 4},/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) "bN" = (/obj/machinery/atmospherics/binary/pump/highcap{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering)
"bO" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 9},/turf/simulated/floor/engine,/area/engine/engineering) "bO" = (/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)
"bP" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4},/turf/simulated/floor/engine,/area/engine/engineering) "bP" = (/obj/machinery/atmospherics/pipe/simple{dir = 6; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/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) "bQ" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/obj/machinery/meter,/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) "bR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 4},/turf/simulated/floor,/area/engine/engineering)
"bS" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plating,/area/engine/engineering) "bS" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{dir = 4},/turf/simulated/wall/r_wall,/area/engine/engineering)
"bT" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 4},/turf/simulated/floor/plating,/area/engine/engineering) "bT" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 9},/turf/simulated/floor/engine,/area/engine/engineering)
"bU" = (/obj/machinery/atmospherics/binary/circulator{anchored = 1; dir = 1},/turf/simulated/floor/plating,/area/engine/engineering) "bU" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4},/turf/simulated/floor/engine,/area/engine/engineering)
"bV" = (/obj/machinery/power/generator{anchored = 1; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering) "bV" = (/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)
"bW" = (/obj/machinery/atmospherics/binary/circulator{anchored = 1},/turf/simulated/floor/plating,/area/engine/engineering) "bW" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 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) "bX" = (/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold"; level = 2},/turf/simulated/floor/plating,/area/engine/engineering)
"bY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering) "bY" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister,/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) "bZ" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/space,/area)
"ca" = (/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) "ca" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 4},/turf/simulated/floor/plating,/area/engine/engineering)
"cb" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/simulated/floor/engine,/area/engine/engineering) "cb" = (/obj/machinery/atmospherics/binary/circulator{anchored = 1; dir = 1},/turf/simulated/floor/plating,/area/engine/engineering)
"cc" = (/obj/machinery/power/emitter{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/engineering) "cc" = (/obj/machinery/power/generator{anchored = 1; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
"cd" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering) "cd" = (/obj/machinery/atmospherics/binary/circulator{anchored = 1},/turf/simulated/floor/plating,/area/engine/engineering)
"ce" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{dir = 1},/turf/space,/area) "ce" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering)
"cf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering) "cf" = (/obj/machinery/power/emitter{anchored = 1; dir = 4; state = 2},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engineering)
"cg" = (/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact"; level = 2},/obj/machinery/meter,/turf/simulated/floor/plating,/area/engine/engineering) "cg" = (/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)
"ch" = (/obj/machinery/atmospherics/binary/pump/highcap{dir = 4},/turf/simulated/floor/plating,/area/engine/engineering) "ch" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/simulated/floor/engine,/area/engine/engineering)
"ci" = (/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) "ci" = (/obj/machinery/power/emitter{anchored = 1; dir = 8; state = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/engineering)
"cj" = (/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) "cj" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
"ck" = (/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) "ck" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{dir = 1},/turf/space,/area)
"cl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering) "cl" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/obj/structure/lattice,/turf/space,/area)
"cm" = (/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) "cm" = (/obj/machinery/atmospherics/valve/digital{dir = 4},/turf/simulated/floor/plating,/area/engine/engineering)
"cn" = (/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) "cn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
"co" = (/obj/machinery/power/rust_core,/obj/structure/cable,/turf/simulated/floor/engine,/area/engine/engineering) "co" = (/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact"; level = 2},/obj/machinery/meter,/turf/simulated/floor/plating,/area/engine/engineering)
"cp" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/simulated/floor/engine,/area/engine/engineering) "cp" = (/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)
"cq" = (/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) "cq" = (/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)
"cr" = (/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) "cr" = (/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)
"cs" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/toxins,/obj/machinery/light{dir = 4},/turf/simulated/floor/plating,/area/engine/engineering) "cs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
"ct" = (/turf/simulated/wall/r_wall,/area) "ct" = (/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)
"cu" = (/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) "cu" = (/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)
"cv" = (/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) "cv" = (/obj/machinery/power/rust_core{anchored = 1; state = 2},/obj/structure/cable,/turf/simulated/floor/engine,/area/engine/engineering)
"cw" = (/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) "cw" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/simulated/floor/engine,/area/engine/engineering)
"cx" = (/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) "cx" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
"cy" = (/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) "cy" = (/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)
"cz" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering) "cz" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/toxins,/obj/machinery/light{dir = 4},/turf/simulated/floor/plating,/area/engine/engineering)
"cA" = (/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) "cA" = (/turf/simulated/wall/r_wall,/area)
"cB" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering) "cB" = (/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)
"cC" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/plating,/area/engine/engineering) "cC" = (/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)
"cD" = (/turf/simulated/floor/plating,/area) "cD" = (/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)
"cE" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8; icon_state = "manifold"; initialize_directions = 11; level = 2},/turf/simulated/floor/plating,/area) "cE" = (/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)
"cF" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/plating,/area) "cF" = (/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)
"cG" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; dir = 10; pixel_x = 0; level = 2; initialize_directions = 10},/turf/simulated/floor/plating,/area) "cG" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
"cH" = (/obj/machinery/atmospherics/pipe/simple{dir = 6; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area) "cH" = (/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)
"cI" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area) "cI" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
"cJ" = (/turf/simulated/floor,/area) "cJ" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8; icon_state = "manifold"; initialize_directions = 11; level = 2},/turf/simulated/floor/plating,/area/engine/engineering)
"cK" = (/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) "cK" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/plating,/area/engine/engineering)
"cL" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area) "cL" = (/turf/simulated/floor/plating,/area)
"cM" = (/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) "cM" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8; icon_state = "manifold"; initialize_directions = 11; level = 2},/turf/simulated/floor/plating,/area)
"cN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area) "cN" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/plating,/area)
"cO" = (/obj/machinery/power/smes,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area) "cO" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; dir = 10; pixel_x = 0; level = 2; initialize_directions = 10},/turf/simulated/floor/plating,/area)
"cP" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable{d1 = 0; d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area) "cP" = (/obj/machinery/atmospherics/pipe/simple{dir = 6; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area)
"cQ" = (/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) "cQ" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area)
"cR" = (/obj/machinery/computer/turbine_computer,/turf/simulated/floor,/area) "cR" = (/turf/simulated/floor,/area)
"cS" = (/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) "cS" = (/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)
"cT" = (/obj/machinery/atmospherics/valve/digital{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering) "cT" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area)
"cU" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold{icon_state = "manifold"; level = 2},/turf/simulated/floor/plating,/area/engine/engineering) "cU" = (/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)
"cV" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; icon_state = "on"; on = 1},/turf/simulated/floor/engine,/area/engine/engineering) "cV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area)
"cW" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 4},/turf/simulated/floor/plating,/area) "cW" = (/obj/machinery/power/smes,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area)
"cX" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; initialize_directions = 11; level = 2},/turf/simulated/floor/plating,/area) "cX" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable{d1 = 0; d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area)
"cY" = (/obj/machinery/atmospherics/binary/circulator{anchored = 1; dir = 1},/turf/simulated/floor/plating,/area) "cY" = (/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)
"cZ" = (/obj/machinery/power/generator{anchored = 1},/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) "cZ" = (/obj/machinery/computer/turbine_computer,/turf/simulated/floor,/area)
"da" = (/obj/machinery/atmospherics/binary/circulator{anchored = 1},/turf/simulated/floor/plating,/area) "da" = (/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)
"db" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area) "db" = (/obj/machinery/atmospherics/valve/digital{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering)
"dc" = (/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) "dc" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold{icon_state = "manifold"; level = 2},/turf/simulated/floor/plating,/area/engine/engineering)
"dd" = (/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) "dd" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; icon_state = "on"; on = 1},/turf/simulated/floor/engine,/area/engine/engineering)
"de" = (/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) "de" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 4},/turf/simulated/floor/plating,/area)
"df" = (/turf/simulated/floor/engine,/area) "df" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; initialize_directions = 11; level = 2},/turf/simulated/floor/plating,/area)
"dg" = (/obj/machinery/atmospherics/pipe/simple{dir = 9; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area) "dg" = (/obj/machinery/atmospherics/binary/circulator{anchored = 1; dir = 1},/turf/simulated/floor/plating,/area)
"dh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area) "dh" = (/obj/machinery/power/generator{anchored = 1},/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)
"di" = (/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area) "di" = (/obj/machinery/atmospherics/binary/circulator{anchored = 1},/turf/simulated/floor/plating,/area)
"dj" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area) "dj" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area)
"dk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor,/area) "dk" = (/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)
"dl" = (/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) "dl" = (/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)
"dm" = (/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) "dm" = (/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)
"dn" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area) "dn" = (/turf/simulated/floor/engine,/area)
"do" = (/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) "do" = (/obj/machinery/atmospherics/pipe/simple{dir = 9; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area)
"dp" = (/obj/machinery/power/turbine{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/engine,/area) "dp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area)
"dq" = (/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) "dq" = (/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area)
"dr" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor,/area) "dr" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area)
"ds" = (/obj/machinery/door/airlock/engineering,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area) "ds" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor,/area)
"dt" = (/obj/machinery/power/monitor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor,/area) "dt" = (/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)
"du" = (/obj/machinery/power/terminal{dir = 4; icon_state = "term"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area) "du" = (/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)
"dv" = (/obj/machinery/power/smes,/obj/structure/cable,/turf/simulated/floor/plating,/area) "dv" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area)
"dw" = (/obj/machinery/compressor,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/engine,/area) "dw" = (/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)
"dx" = (/obj/machinery/power/smes,/turf/simulated/floor/plating,/area) "dx" = (/obj/machinery/power/turbine{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/engine,/area)
"dy" = (/obj/machinery/power/monitor,/turf/simulated/floor,/area) "dy" = (/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)
"dz" = (/obj/structure/window/reinforced,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/engine/engineering) "dz" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor,/area)
"dA" = (/obj/structure/window/reinforced,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (SOUTHEAST)"},/area/engine/engineering) "dA" = (/obj/machinery/door/airlock/engineering,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area)
"dB" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/engine,/area/engine/engineering) "dB" = (/obj/machinery/power/monitor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor,/area)
"dC" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/engine,/area/engine/engineering) "dC" = (/obj/machinery/power/terminal{dir = 4; icon_state = "term"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area)
"dD" = (/obj/structure/window/reinforced,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/engine/engineering) "dD" = (/obj/machinery/power/smes,/obj/structure/cable,/turf/simulated/floor/plating,/area)
"dE" = (/obj/machinery/power/generator{anchored = 1},/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) "dE" = (/obj/machinery/compressor,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/engine,/area)
"dF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area) "dF" = (/obj/machinery/power/smes,/turf/simulated/floor/plating,/area)
"dG" = (/obj/machinery/door/window/northleft,/turf/simulated/floor/plating,/area) "dG" = (/obj/machinery/power/monitor,/turf/simulated/floor,/area)
"dH" = (/obj/machinery/door/window/northright,/turf/simulated/floor/plating,/area) "dH" = (/obj/structure/window/reinforced,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/engine/engineering)
"dI" = (/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) "dI" = (/obj/structure/window/reinforced,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (SOUTHEAST)"},/area/engine/engineering)
"dJ" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area) "dJ" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/engine,/area/engine/engineering)
"dK" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHEAST)"; icon_state = "warnplate"; dir = 5},/area) "dK" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/engine,/area/engine/engineering)
"dL" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/engine/engineering) "dL" = (/obj/structure/window/reinforced,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/engine/engineering)
"dM" = (/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) "dM" = (/obj/machinery/power/generator{anchored = 1},/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)
"dN" = (/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) "dN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area)
"dO" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/engine/engineering) "dO" = (/obj/machinery/door/window/northleft,/turf/simulated/floor/plating,/area)
"dP" = (/obj/machinery/power/monitor,/obj/machinery/light{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/engine/engineering) "dP" = (/obj/machinery/door/window/northright,/turf/simulated/floor/plating,/area)
"dQ" = (/obj/machinery/power/apc{cell_type = 15000; dir = 1; name = "Engineering APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering) "dQ" = (/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)
"dR" = (/obj/machinery/power/smes,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engineering) "dR" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area)
"dS" = (/obj/machinery/compressor{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/engine,/area/engine/engineering) "dS" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHEAST)"; icon_state = "warnplate"; dir = 5},/area)
"dT" = (/obj/machinery/power/smes,/turf/simulated/floor/plating,/area/engine/engineering) "dT" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/engine/engineering)
"dU" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/engine/engineering) "dU" = (/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)
"dV" = (/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) "dV" = (/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)
"dW" = (/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) "dW" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/engine/engineering)
"dX" = (/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) "dX" = (/obj/machinery/power/monitor,/obj/machinery/light{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/engine/engineering)
"dY" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area) "dY" = (/obj/machinery/power/apc{cell_type = 15000; dir = 1; name = "Engineering APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
"dZ" = (/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) "dZ" = (/obj/machinery/power/smes,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engineering)
"ea" = (/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area) "ea" = (/obj/machinery/compressor{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/engine,/area/engine/engineering)
"eb" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area) "eb" = (/obj/machinery/power/smes,/turf/simulated/floor/plating,/area/engine/engineering)
"ec" = (/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = "icon-warnplate (SOUTHEAST)"},/area) "ec" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/engine/engineering)
"ed" = (/obj/machinery/door/poddoor,/turf/simulated/floor/engine,/area) "ed" = (/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)
"ee" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; initialize_directions = 11; level = 2},/turf/simulated/wall/r_wall,/area/engine/engineering) "ee" = (/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)
"ef" = (/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) "ef" = (/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)
"eg" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/wall/r_wall,/area/engine/engineering) "eg" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area)
"eh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/wall/r_wall,/area/engine/engineering) "eh" = (/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)
"ei" = (/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) "ei" = (/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area)
"ej" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor,/area/engine/engineering) "ej" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area)
"ek" = (/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 = ""},/turf/simulated/floor/plating,/area/engine/engineering) "ek" = (/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = "icon-warnplate (SOUTHEAST)"},/area)
"el" = (/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) "el" = (/obj/machinery/door/poddoor,/turf/simulated/floor/engine,/area)
"em" = (/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) "em" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; initialize_directions = 11; level = 2},/turf/simulated/wall/r_wall,/area/engine/engineering)
"en" = (/obj/machinery/power/turbine{dir = 2},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/engine,/area/engine/engineering) "en" = (/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)
"eo" = (/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) "eo" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/wall/r_wall,/area/engine/engineering)
"ep" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area) "ep" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/wall/r_wall,/area/engine/engineering)
"eq" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area) "eq" = (/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)
"er" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/turf/simulated/wall/r_wall,/area) "er" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor,/area/engine/engineering)
"es" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8},/turf/simulated/floor/plating,/area) "es" = (/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 = ""},/turf/simulated/floor/plating,/area/engine/engineering)
"et" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/engine,/area) "et" = (/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)
"eu" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4},/turf/simulated/floor/plating,/area) "eu" = (/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)
"ev" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area) "ev" = (/obj/machinery/power/turbine{dir = 2},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/engine,/area/engine/engineering)
"ew" = (/obj/machinery/power/generator{anchored = 1; dir = 4},/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/engineering) "ew" = (/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)
"ex" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/turf/simulated/wall/r_wall,/area/engine/engineering) "ex" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area)
"ey" = (/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) "ey" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area)
"ez" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/engineering) "ez" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/turf/simulated/wall/r_wall,/area)
"eA" = (/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) "eA" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8},/turf/simulated/floor/plating,/area)
"eB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering) "eB" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/engine,/area)
"eC" = (/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) "eC" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4},/turf/simulated/floor/plating,/area)
"eD" = (/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) "eD" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area)
"eE" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area) "eE" = (/obj/machinery/power/generator{anchored = 1; dir = 4},/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/engineering)
"eF" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/obj/machinery/meter,/turf/simulated/floor,/area) "eF" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/turf/simulated/wall/r_wall,/area/engine/engineering)
"eG" = (/obj/machinery/atmospherics/valve/digital{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area) "eG" = (/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)
"eH" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/obj/machinery/meter,/turf/simulated/floor/plating,/area) "eH" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/engineering)
"eI" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; icon_state = "on"; on = 1},/turf/simulated/floor/engine,/area) "eI" = (/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)
"eJ" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4},/turf/simulated/floor/engine,/area) "eJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
"eK" = (/obj/machinery/atmospherics/valve/digital{dir = 4},/turf/simulated/floor/plating,/area) "eK" = (/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)
"eL" = (/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold"; level = 2},/obj/machinery/meter,/turf/simulated/floor/plating,/area) "eL" = (/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)
"eM" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/turf/space,/area) "eM" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area)
"eN" = (/obj/machinery/atmospherics/pipe/simple{dir = 6; icon_state = "intact"; level = 2},/turf/simulated/wall/r_wall,/area) "eN" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/obj/machinery/meter,/turf/simulated/floor,/area)
"eO" = (/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold"; level = 2},/turf/simulated/wall/r_wall,/area/engine/engineering) "eO" = (/obj/machinery/atmospherics/valve/digital{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area)
"eP" = (/obj/machinery/atmospherics/valve/digital{dir = 4},/turf/simulated/floor/plating,/area/engine/engineering) "eP" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/obj/machinery/meter,/turf/simulated/floor/plating,/area)
"eQ" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/engine/engineering) "eQ" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; icon_state = "on"; on = 1},/turf/simulated/floor/engine,/area)
"eR" = (/obj/machinery/atmospherics/pipe/simple{dir = 9; icon_state = "intact"; level = 2},/turf/simulated/wall/r_wall,/area/engine/engineering) "eR" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4},/turf/simulated/floor/engine,/area)
"eS" = (/obj/structure/cable,/obj/machinery/power/terminal{dir = 4; icon_state = "term"},/turf/simulated/floor/plating,/area/engine/engineering) "eS" = (/obj/machinery/atmospherics/valve/digital{dir = 4},/turf/simulated/floor/plating,/area)
"eT" = (/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/machinery/light,/turf/simulated/floor/plating,/area/engine/engineering) "eT" = (/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold"; level = 2},/obj/machinery/meter,/turf/simulated/floor/plating,/area)
"eU" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/engineering) "eU" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/turf/space,/area)
"eV" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor/plating,/area/engine/engineering) "eV" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/engine/engineering)
"eW" = (/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) "eW" = (/obj/machinery/atmospherics/pipe/simple{dir = 9; icon_state = "intact"; level = 2},/turf/simulated/wall/r_wall,/area/engine/engineering)
"eX" = (/obj/machinery/computer/turbine_computer,/turf/simulated/floor,/area/engine/engineering) "eX" = (/obj/structure/cable,/obj/machinery/power/terminal{dir = 4; icon_state = "term"},/turf/simulated/floor/plating,/area/engine/engineering)
"eY" = (/obj/machinery/computer/turbine_computer,/obj/machinery/light,/turf/simulated/floor,/area/engine/engineering) "eY" = (/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/machinery/light,/turf/simulated/floor/plating,/area/engine/engineering)
"eZ" = (/obj/machinery/power/emitter{dir = 4},/turf/simulated/floor/plating,/area) "eZ" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/engineering)
"fa" = (/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) "fa" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor/plating,/area/engine/engineering)
"fb" = (/obj/machinery/power/emitter{dir = 8},/turf/simulated/floor/plating,/area) "fb" = (/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)
"fc" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction,/turf/simulated/wall/r_wall,/area) "fc" = (/obj/machinery/computer/turbine_computer,/turf/simulated/floor,/area/engine/engineering)
"fd" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction,/turf/simulated/wall/r_wall,/area/engine/engineering) "fd" = (/obj/machinery/computer/turbine_computer,/obj/machinery/light,/turf/simulated/floor,/area/engine/engineering)
"fe" = (/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) "fe" = (/obj/machinery/power/emitter{dir = 4},/turf/simulated/floor/plating,/area)
"ff" = (/obj/machinery/door/airlock/engineering,/turf/simulated/floor/plating,/area) "ff" = (/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)
"fg" = (/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) "fg" = (/obj/machinery/power/emitter{dir = 8},/turf/simulated/floor/plating,/area)
"fh" = (/obj/machinery/power/rust_core,/turf/simulated/floor/engine,/area) "fh" = (/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)
"fi" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/obj/structure/lattice,/turf/space,/area) "fi" = (/obj/machinery/door/airlock/engineering,/turf/simulated/floor/plating,/area)
"fj" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/obj/structure/lattice,/turf/space,/area) "fj" = (/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)
"fk" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/simulated/floor/plating,/area) "fk" = (/obj/machinery/power/rust_core,/turf/simulated/floor/engine,/area)
"fl" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 10},/obj/structure/lattice,/turf/space,/area) "fl" = (/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)
"fm" = (/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) "fm" = (/obj/machinery/atmospherics/pipe/manifold{icon_state = "manifold"; level = 2},/turf/simulated/floor/plating,/area)
"fn" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/obj/structure/lattice,/turf/space,/area) "fn" = (/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold"; level = 2},/turf/simulated/floor/plating,/area)
"fo" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 9},/obj/structure/lattice,/turf/space,/area) "fo" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area)
"fp" = (/obj/machinery/atmospherics/pipe/manifold{icon_state = "manifold"; level = 2},/turf/simulated/floor/plating,/area) "fp" = (/obj/machinery/atmospherics/unary/vent_pump/siphon/on{dir = 8},/turf/simulated/floor/engine,/area)
"fq" = (/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold"; level = 2},/turf/simulated/floor/plating,/area) "fq" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; icon_state = "on"; on = 1},/turf/simulated/floor/engine,/area)
"fr" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area) "fr" = (/obj/machinery/atmospherics/valve/digital{dir = 4},/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area)
"fs" = (/obj/machinery/atmospherics/unary/vent_pump/siphon/on{dir = 8},/turf/simulated/floor/engine,/area) "fs" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold"; level = 2},/turf/simulated/floor/plating,/area)
"ft" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; icon_state = "on"; on = 1},/turf/simulated/floor/engine,/area) "ft" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area)
"fu" = (/obj/machinery/atmospherics/valve/digital{dir = 4},/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area) "fu" = (/obj/machinery/atmospherics/binary/pump,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area)
"fv" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold"; level = 2},/turf/simulated/floor/plating,/area) "fv" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor,/area)
"fw" = (/obj/structure/lattice,/turf/space,/area) "fw" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor/plating,/area)
"fx" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/space,/area) "fx" = (/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area)
"fy" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area) "fy" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (SOUTHEAST)"},/area)
"fz" = (/obj/machinery/atmospherics/binary/pump,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area) "fz" = (/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)
"fA" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor,/area) "fA" = (/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)
"fB" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/obj/structure/lattice,/turf/space,/area) "fB" = (/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)
"fC" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor/plating,/area) "fC" = (/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area)
"fD" = (/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area) "fD" = (/obj/machinery/atmospherics/portables_connector{dir = 1; name = "Connector Port (Air Supply)"},/turf/simulated/floor/plating,/area)
"fE" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (SOUTHEAST)"},/area) "fE" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor/plating,/area)
"fF" = (/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) "fF" = (/obj/structure/closet/crate,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/turf/simulated/floor/plating,/area)
"fG" = (/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) "fG" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area)
"fH" = (/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) "fH" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area)
"fI" = (/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area) "fI" = (/obj/machinery/power/rust_fuel_injector{dir = 1},/turf/simulated/floor/plating,/area)
"fJ" = (/obj/machinery/atmospherics/portables_connector{dir = 1; name = "Connector Port (Air Supply)"},/turf/simulated/floor/plating,/area) "fJ" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/plating,/area)
"fK" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor/plating,/area) "fK" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area)
"fL" = (/obj/structure/closet/crate,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/turf/simulated/floor/plating,/area) "fL" = (/obj/machinery/rust_fuel_compressor{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area)
"fM" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area) "fM" = (/obj/machinery/rust_fuel_assembly_port{pixel_y = 32},/turf/simulated/floor/plating,/area)
"fN" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area) "fN" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/turf/simulated/wall/r_wall,/area)
"fO" = (/obj/machinery/power/rust_fuel_injector{dir = 1},/turf/simulated/floor/plating,/area) "fO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area)
"fP" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/plating,/area) "fP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/space,/area)
"fQ" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area)
"fR" = (/obj/machinery/rust_fuel_compressor{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area)
"fS" = (/obj/machinery/rust_fuel_assembly_port{pixel_y = 32},/turf/simulated/floor/plating,/area)
"fT" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/turf/simulated/wall/r_wall,/area)
"fU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area)
"fV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/space,/area)
(1,1,1) = {" (1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -365,44 +359,44 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacadaeafagahabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacadaeafagahabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacafaiajakacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacaiajakalacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacafafafalacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacaiaiaiamacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabamanaoapalacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabanaoapaqamacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaqaqaqaqaqaqaqaqaqaqarararararasarararararararararararararararararararaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarararararararararararasasasasasatasasasasasasasasasasasasasasasasasasasaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaqaqaqaqaqaqaqaqaqaqaratatatatauavatatatawawawaxawawawawawawaxawawawaraaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarararararararararararasauauauauavawauauauaxaxaxayaxaxaxaxaxaxayaxaxaxasaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaqaqaqaqaqaqaqaqaqaqarayazaAaBaCazazaDaEaEaEaFaEaEaEaDazazazaAazaGawaraaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarararararararararararasazaAaBaCaDaAaAaEaFaFaFaGaFaFaFaEaAaAaAaBaAaHaxasaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaqaqaqaqaqaqaqaqaqaqaraHawararaIaIaIararararaJararararaIaIaIararaKawaraaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarararararararararararasaIaxasasaJaJaJasasasasaKasasasasaJaJaJasasaLaxasaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaqaqaqaqaqaqaqaqaqaqaraKawararaLaMaMaraNaNaNaOaNaNaNaraPaQaLararaKaRaraaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarararararararararararasaLaxasasaMaNaNasaOaOaOaPaOaOaOasaQaRaMasasaLaSasaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaSaTaTaTaTaTaTaTaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarararararararararaVararaKawararaWaMaMaraWaLaLaOaLaLaXaraYaYaXararaKawaraaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaTaUaUaUaUaUaUaUaVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWaWaWaWaWasasasasasasasasasaXasasaLaxasasaYaNaNasaYaMaMaPaMaMaZasbabaaZasasaLaxasaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaZaSaTaTaTaTaTaTbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarbbbbbbbbbcbbbbbbaKawaraOaLbdaLararararbebfbgaVbebfbgararararaLbhaOaLaraaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaabbaTaUaUaUaUaUaUbcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWaaaaaaaWasbdbdbdbdbebdbdbdaLaxasaPaMbfaMasasasasbgbhbiaXbgbhbiasasasasaMbjaPaMasaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaZbiaTaTaTaTaTaTaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarbjbkbkblbmbkbkbnaKawaraOaLbdbhbobdaLarbpbpbpaVbpbpbparaWbhbobdbhaOaLaraaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaabbbkaUaUaUaUaUaUaVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWaaaaaaaWasblbmbnboblbnbnbpaLaxasaPaMbfbjbqbfaMasbrbrbraXbrbrbrasaYbjbqbfbjaPaMasaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaZaSaTaTaTaTaTaTbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarbqaLaLaLbrbsbsbtbubvaraOaLbdbwbxbybhbzbAbBbBbCbBbDbEbzbdbFbxbGbhaOaLarararaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaabbaTaUaUaUaUaUaUbcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWaaaaaaaWasaMbsaMaMbtbububvbwbxasaPaMbfbybzbAbjbBbCbDbDbEbDbFbGbBbfbHbzbIbjaPaMasasasaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaZbiaTaTaTaTaTaTaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarbmbHbIbJaObKbLbnaKbMaraObKbxbxbxbxbxbNbObAbBbCbBbObPbxbxbxbxbxbxbQbRbHbSaraaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaabbbkaUaUaUaUaUaUaVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJaUaUaUbKbLbMbmbNbOaPbPbQbpaLbRasaPbPbzbzbzbzbzbSbTbCbDbEbDbTbUbzbzbzbzbzbzbVbWbXbYasaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaZaSaTaTaTaTaTaTbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarbTbnaLbUbVbWaLbXaKaKarbYbXaraLbrbZcabpbEcbbBbCbBbBbDbpcacccdaXaraOaLbmbSaraaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaabbaTaUaUaUaUaUaUbcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabZaaaaaaaWascabpaMcbcccdaMbsaLaLascebsasaMbtcfcgbrbGchbDbEbDbDbFbrcgcicjaZasaPaMblbYasaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaceceaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaraLbjbLblcfcgchbnaKaKarcicjckclcmbZcnbpbEbEbEcobEbEcpbpcncccqclckcraLbKcsaraaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaackckaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaUaUaUbKbLcmbmbQbocncobMbpaLaLascpcqcrcsctcfcubrbGbGbGcvbGbGcwbrcucicxcscrcyaMbPczasaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactcucvcwcxcxcxcxcyctctctctctctctctctctctaaaaaaaaaaaaaactctctctctctctctctaaaaaaaaaaaaaaaaaaaraWbjbIbJcfbKbLbnaKaKaraObXaraWczbZcAbpbEbAbBbBbBbBbObpcAcccBaLaraOaLbjcCaraaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAcBcCcDcEcEcEcEcFcAcAcAcAcAcAcAcAcAcAcAaaaaaaaaaaaaaacAcAcAcAcAcAcAcAcAaaaaaaaabJaUaUaUbKbLbMbmbNbOcnbPbQbpaLaLasaPbsasaYcGcfcHbrbGbCbDbDbDbDbTbrcHcicIaMasaPaMcJcKasaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactcDcEcFcGcDcHcIcGcJcJctcKcLcMcNcOcPcDcQaaaaaaaaaaaaaacQcDcDcRcRcRcRcRctaaaaaaaaaaaaaaaaaaarbTbnaLbUbVbWaLbjcScTbxbQcUbxbxbxbxbxbNbDcbbBbBbBbDcVbxbxbxbxbxbxbQbRbkcCaraaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAcLcMcNcOcLcPcQcOcRcRcAcScTcUcVcWcXcLcYaaaaaaaaaaaaaacYcLcLcZcZcZcZcZcAaaaaaaaabZaaaaaaaWascabpaMcbcccdaMcJdadbbzbVdcbzbzbzbzbzbSbFchbDbDbDbFddbzbzbzbzbzbzbVbWbncKasaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactcWcXcDcYcZdacDdbcJcJctdccLcMcNcOddcDdedfdfdfdfdfdfdfdecDcDcJcJcJcJcJctaaaaaaaaaaaaaaaaaaaraLbjbLblcfcgchbnaKbMaraOaLbdbwbxbybhbzcbbBbBbBbBbObEbzbdbFbxbGbhaOaLarararaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAdedfcLdgdhdicLdjcRcRcAdkcTcUcVcWdlcLdmdndndndndndndndmcLcLcRcRcRcRcRcAaaaaaaaaclaUaUaUbKbLcmbmbQbocncobMbpaLbRasaPaMbfbybzbAbjbBchbDbDbDbDbTbGbBbfbHbzbIbjaPaMasasasaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactcDcEcIdgdhdicGdbcJcJctdjdkdldkdkdmdndodpdpdpdpdpdpdpdocDcDcJcJcJcJcJctaaaaaaaaaaaaaaaaaaaraLbjbIbJcfbKbLbnaKaKarbYaLbdbhbobdaLarbparbpbpbpbpbparaWbhbobdbhaOaLaraaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAcLcMcQdodpdqcOdjcRcRcAdrdsdtdsdsdudvdwdxdxdxdxdxdxdxdwcLcLcRcRcRcRcRcAaaaaaaaabJaUaUaUbKbLbMbmbNbOcnbPbQbpaLaLasceaMbfbjbqbfaMasbrasbrbrbrbrbrasaYbjbqbfbjaPaMasaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactcDcEcFcGdhcHdqcXdrdkdsdkdkdldkdtdudvctdwdwdwdwdwdwdwctdxcDdycRcRcJcJctaaaaaaaaaaaaaaaaaaarbTbnaLbUbVbWaLbXaKaKaraOaLdzdAarararardBarbEbEbEbEdCarararardAdDaOaXaraaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAcLcMcNcOdpcPdydfdzdsdAdsdsdtdsdBdCdDcAdEdEdEdEdEdEdEcAdFcLdGcZcZcRcRcAaaaaaaaabZaaaaaaaWascabpaMcbcccdaMbsaLaLasaPaMdHdIasasasasdJasbGbGbGbGdKasasasasdIdLaPaZasaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactcWcXcDcYdEdadbdbdFcJctdGdHdIdJctctctctdfdfdfdfdfdfdfctctctctdJdKdGdHctaaaaaaaaaaaaaaaaaaaraWbjbLblcfcgchbndLdMdNdMazdOazdPdQdRardSardSdSdSdSdSardTdUdVdWdWdXawaraaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAdedfcLdgdMdidjdjdNcRcAdOdPdQdRcAcAcAcAdndndndndndndncAcAcAcAdRdSdOdPcAaaaaaaaaclaUaUaUbKbLcmbmbQbocncobMbpdTdUdVdUaAdWaAdXdYdZaseaaseaeaeaeaeaasebecedeeeeefaxasaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactcDcEcIdgdhdicXdbdFcJctdYcNdZeaebeccDctedededededededctcDeaebeceacDcDctaaaaaaaaaaaaaaaaaaaraLbjbIbJcfbKbLeeefegeheiejbuejejekelemenarenenenenenemaLaLawawawdLeoaraaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAcLcMcQdodpdqdfdjdNcRcAegcVeheiejekcLcAelelelelelelelcAcLeiejekeicLcLcAaaaaaaaabJaUaUaUbKbLbMbmbNbOcnbPbQemeneoepeqerbwerereseteuevaseveveveveveuaMaMaxaxaxdTewasaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactcDcEcFcGdhcHdqcXdFcJctepcDeceqereseaetdfdfdfdfdfdfdfeteceuerevcDcDcDctaaaaaaaaaaaaaaaactarbTbnaLbUewbWaLexaLaLareyezeAeBdReCaLeDbEbEbEbEbEbEbEeDaLaLawawawawawaraaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAcLcMcNcOdpcPdydfdNcRcAexcLekeyezeAeieBdndndndndndndneBekeCezeDcLcLcLcAaaaaaaaabZaaaaaaaWascabpaMcbeEcdaMeFaMaMaseGeHeIeJdZeKaMeLbGbGbGbGbGbGbGeLaMaMaxaxaxaxaxasaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactcWcXcDcYdEdadbcEeEeFereGeHerererererereIdfdfdfdfdfeJerererererereKeLereMaaaaaaaaaaaaaaeNeOePbkbLbleQcgcheReQaLareSezeTeBdReUeVeWaqaqaqaqaqaqaqeWeVaLeXeXeYeXeXaraaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAdedfcLdgdMdidjcMeMeNezeOePezezezezezezeQdndndndndneRezezezezezezeSeTezeUaaaaaaclaUaUaUbKbLcmbnbQboeVcobMeWeVaMaseXeHeYeJdZeZfafbarararararararfbfaaMfcfcfdfcfcasaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactcDcEcIdgdhdicXdbdFcJctepcDctcDcDeZfaeddfdfdfdfdfdfdfedfafbcDcDctcDdbctaaaaaaaaaaaaaaaafcfdarararararararararboarararararararararaqaqaqaqaqaqaqarararararararararaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAcLcMcQdodpdqdfdjdNcRcAexcLcAcLcLfeffeldndndndndndndnelfffgcLcLcAcLdjcAaaaaaaaaaWcLcLcLaWasasasasasasasasasasbqasasasasasasasasasarararararararasasasasasasasasasaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactcDcEcFcGdhcHfedgdFcJctepcDffcDcDeZfgeddfdfdffhdfdfdfedfgfbcDcDffcDdbctaaaaaaaaaaaaaaaafifjaTaTaTaTaTaTaTaTaTfkaTaTaTaTaTaTaTaTflaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAcLcMcNcOdpcPfhdodNcRcAexcLficLcLfefjeldndndnfkdndndnelfjfgcLcLficLdjcAaaaaaaaaaWcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLaWaWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactcWcXcDcYdEdadbcDdFcJctepcDctcDcDeZfmeddfdfdfdfdfdfdfedfmfbcDcDctcHdgctaaaaaaaaaaaaaaaafjfnaTaTaTaTaTaTaTaTaUcDaSaTaTaTaTaTaTaTfoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAdedfcLdgdMdidjcLdNcRcAexcLcAcLcLfefleldndndndndndndnelflfgcLcLcAcPdocAaaaaaaaaaWcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLaWaWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactcDcEcIdgdhdifpfqfreFereGeHererererererfsdfdfdfdfdfftererererererfufvereMaaaaaaaaaaaaaaaafwfwfwfwfwfwfwfwfwfxcDfxfwfwfwfwfwfwfwfwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAcLcMcQdodpdqfmfnfoeNezeOePezezezezezezfpdndndndndnfqezezezezezezfrfsezeUaaaaaaaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactcDdbcDcDfycNcNfzfAcJctepcDeceqereseaetdfdfdfdfdfdfdfeteceuereveadbdbctaaaaaaaaaaaaaaaaaafBaTaTaTaTaTaTaTaTbacDbiaTaTaTaTaTaTaTflaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAcLdjcLcLftcVcVfufvcRcAexcLekeyezeAeieBdndndndndndndneBekeCezeDeidjdjcAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactcDcEcIcIcIcIcIcXcJcJctepcDeceaebeccDctedededctedededctcDeaebeceafCdbctaaaaaaaaaaaaaaaaaafjaTaTaTaTaTaTaTaTaUcDaSaTaTaTaTaTaTaTfoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAcLcMcQcQcQcQcQdfcRcRcAexcLekeiejekcLcAelelelcAelelelcAcLeiejekeifwdjcAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactcHcXcDcDcDcDcDdbcJcJctepcDfDfEctctctctfFfGfHctfFfGfHctctctctfEfIfJdbctaaaaaaaaaaaaaaaaaafwfwfwfwfwfwfwfwfwfxcDfxfwfwfwfwfwfwfwfwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAcPdfcLcLcLcLcLdjcRcRcAexcLfxfycAcAcAcAfzfAfBcAfzfAfBcAcAcAcAfyfCfDdjcAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactfKfCcDcDcDcDcDdbcJcJctepcDcDcDecfLfLctcDcDcDcDcDcDcDctfMfMfNcDcDcDdbctaaaaaaaaaaaaaaaaaafBaTaTaTaTaTaTaTaTbacDbiaTaTaTaTaTaTaTflaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAfEfwcLcLcLcLcLdjcRcRcAexcLcLcLekfFfFcAcLcLcLcLcLcLcLcAfGfGfHcLcLcLdjcAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactfJfJcDcDcDcDcDdbcJcJctepcDcDcDecfLfLctfOfOfOcDfOfOfOctfPfPfQcDcDcDdbctaaaaaaaaaaaaaaaaaafjaTaTaTaTaTaTaTaTaTfkaTaTaTaTaTaTaTaTfoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAfDfDcLcLcLcLcLdjcRcRcAexcLcLcLekfFfFcAfIfIfIcLfIfIfIcAfJfJfKcLcLcLdjcAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactcDcDcDcDcDcDcDdbcJcJctepcDcDcDfDfEfEctctctctffctctctctfEfEfIcDcHfqcXctaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAcLcLcLcLcLcLcLdjcRcRcAexcLcLcLfxfyfycAcAcAcAficAcAcAcAfyfyfCcLcPfndfcAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactcDcDcDcDcDcDcDdbcJcJctepcDcDcDcDcDcDfRfSfSfScDfSfSfSfRcDcDcDcDfKfKfKctaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAcLcLcLcLcLcLcLdjcRcRcAexcLcLcLcLcLcLfLfMfMfMcLfMfMfMfLcLcLcLcLfEfEfEcAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactcDcDcDcDcDcDcDdbcJcJctepcDcDcDcDcDcDcDcDcDcDcDcDcDcDcDcDcDcDcDfJfJfJctaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAcLcLcLcLcLcLcLdjcRcRcAexcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLfDfDfDcAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaactctctctctctctctfTctctctfUctctctctctctctctctctctctctctctctctctctctctctctaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaacAcAcAcAcAcAcAcAfNcAcAcAfOcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.